jfs*_*jfs 45
是否可以逐行解析文件,并在遍历行时就地编辑一行?
它可以像stdlib的fileinput
模块一样使用备份文件进行模拟.
这是一个示例脚本,用于删除some_condition
命令行中给出的文件不满足的行或stdin
:
#!/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
Run Code Online (Sandbox Code Playgroud)
例:
$ python grep_some_condition.py first_file.txt second_file.txt
Run Code Online (Sandbox Code Playgroud)
完成后first_file.txt
,second_file.txt
文件将仅包含满足some_condition()
谓词的行.
不可以。您不能安全地写入您正在阅读的文件,因为您对该文件所做的任何更改都可能覆盖您尚未阅读的内容。要安全地执行此操作,您必须将文件读入缓冲区,根据需要更新任何行,然后重新写入文件。
如果您要逐字节替换文件中的内容(即,如果您要替换的文本与要替换的新字符串的长度相同),那么您可以摆脱它,但它是一个大黄蜂嵌套,所以我会省去麻烦,只需读取完整文件,替换内存中的内容(或通过临时文件),然后再次写出。
fileinput模块有非常丑陋的API,我找到了这个任务的漂亮模块 - in_place,Python 3的例子:
import in_place
with in_place.InPlace('data.txt') as file:
for line in file:
line = line.replace('test', 'testZ')
file.write(line)
Run Code Online (Sandbox Code Playgroud)
与fileinput的主要区别: