dram.me

修改文件在各脚本语言中的处理

文本处理是脚本语言的一个重要应用,而修改文件某行或几行文本内容也是经常遇到的问题。由于类UNIX系统中的文件系统一般都不是结构化文件系统,在修改文件时并不是很方便,以下整理了一些比较常用的模式。由于一些接口只在特定语言中有,这里用主流的Python,Ruby和PHP三大脚本语言为例。

注意以下方法主要是从代码的可读性及实现的便捷性上考虑的,并没有考虑性能因素,所以只适用于对小文件的修改。

最为直接的一种方式是先建一临时文件,对原文件以行遍历,如果无需修改,直接写入文件,需要修改的行,将修改后的内容写入临时文件,最后关闭临时文件,覆盖原文件。Ruby中的Tempfile模块可以方便地创建临时文件。这一方法的一个不足是,无法保留文件的原有权限。在处理系统配置文件时需要特别注意。

Python中有一fileinput模块,如果以fileinput.input('foo.txt', inplace=True)形式打开文件,标准输出会被重定向到打开文件,原文件内容被移至一个临时文件,随后只需将需要写入新文件的内容打印到标准输出就可以了。另外,在调用fileinput.input()之后记得要fileinput.close()。这个相对于上面说的Ruby方式,主要是省去了临时文件的操作。可惜的是,可能是出于实现上的考虑,对原文件的处理不是先保留,最后用新文件覆盖。而是先移为临时文件了,这样在外理过程中,就会出现文件内容不完备的过程,但这一方式的优点是,保留了原有文件权限等属性。

也可以利用PHP中的file()及file_put_contents()函数方便的实现对文件的修改。file()函数读取文件全部内容以数组形式返回。在得到数组之后,可以对其以哈希数组方式foreach,以行号为键,行内容为值,如需要修改,替换数组中的该项。最后,通过file_put_contents()函数将数组内容写回文件。而在Ruby中与之对应的是IO#puts,Python则需要write(''.join(str_table))