是否可以修改文件中的行?
是否有可能一行一行地parsing一个文件,并通过这些行就地编辑一行?
是否有可能一行一行地parsing一个文件,并通过这些行就地编辑一行?
它可以使用stdlib的文件fileinput
模块的备份文件进行模拟。
以下是一个示例脚本,用于从命令行或stdin
给出的文件中删除不满足some_condition
的行:
#!/usr/bin/env python # grep_some_condition.py import fileinput for line in fileinput.input(inplace=True, backup='.bak'): if some_condition(line): print line, # this goes to the current file
例:
$ python grep_some_condition.py first_file.txt second_file.txt
完成后, first_file.txt
和second_file.txt
文件将只包含满足some_condition()
谓词的行。
不可以。您不能安全地写入您正在阅读的文件,因为您对文件所做的任何更改都可能会覆盖尚未阅读的内容。 要安全地做到这一点,你必须将文件读入缓冲区,根据需要更新任何行,然后重新写入文件。
如果你将字节replace成文件中的内容(即,如果你正在replace的文本长度与你replace的新string的长度相同),那么你可以避开它,但它是一个黄蜂所以我会省下麻烦,只读完整文件,replace内存中的内容(或通过临时文件),然后再写出来。
如果您只打算执行不改变被修改文件部分长度的本地化修改(例如,将所有字符更改为小写),则实际上可以dynamic覆盖文件的旧内容。
为此,您可以使用file
对象的seek()
方法使用随机文件访问。
或者,您可以使用mmap
对象将整个文件视为可变string。 请记住,根据您的操作系统及其configuration, mmap
对象可能会在32位CPU上在2-4 GB范围内强制实现最大文件大小限制。
你必须以字符的大小来备份。 假设你使用了readline
,那么你可以得到该行的长度并使用以下命令备份:
file.seek(offset[, whence])
从哪里设置SEEK_CUR
,设置偏移量为SEEK_CUR
。
请参阅Python文档或查看手册页以seek
。