有很多文件,每个文件我需要阅读文本内容,对文本进行一些处理,然后再写回文本(替换旧内容)。
我知道我可以先open
将文件rt
读取并处理内容,然后关闭并重新打开wt
,但显然这不是一个好方法。我可以只打开一次文件进行读写吗?怎么样?
答案 0 :(得分:2)
查看fileinput module。它允许您执行其他人的建议:备份输入文件,操作其内容,然后将更改的数据写入同一位置。
可选的就地过滤:如果将关键字参数inplace = True传递给fileinput.input()或FileInput构造函数,则将文件移动到备份文件,并将标准输出定向到输入文件(如果是与备份文件同名的文件已经存在,它将被静默替换)。这使得编写一个可以重写其输入文件的过滤器成为可能。
这是一个例子。假设我有一个文本文件:
1
2
3
4
我可以做(Python 3):
import fileinput
file_path = r"C:\temp\fileinput_test.txt"
with fileinput.FileInput(files=[file_path], inplace=True) as input_data:
for line in input_data:
# Double the number on each line
s = str(int(line.strip()) * 2)
print(s)
我的档案变成了:
2
4
6
8
答案 1 :(得分:2)
请参阅:http://docs.python.org/2/library/functions.html#open
最常用的模式值是'r'用于读取,'w'用于写入(如果文件已经存在则截断文件)和'a'用于追加(在某些Unix系统上表示所有写入都附加)无论当前的搜索位置如何,都到文件的末尾。如果省略mode,则默认为'r'。默认设置是使用文本模式,可以在写入时将“\ n”字符转换为特定于平台的表示,并在读取时返回。因此,在打开二进制文件时,您应该将'b'附加到模式值以在二进制模式下打开文件,这将提高可移植性。 (附加'b'即使在不以不同方式处理二进制文件和文本文件的系统上也很有用,它可以作为文档。)请参阅下面的更多可能的模式值。
模式'r +','w +'和'a +'打开文件进行更新(注意'w +'截断文件)。将“b”附加到模式以在二进制模式下打开文件,在区分二进制文件和文本文件的系统上;在没有这种区别的系统上,添加'b'没有效果。
因此,您可以在模式r+
中打开文件,从中读取,截断,然后写入同一文件对象。但你不应该这样做。
您应该以读取模式打开文件,写入临时文件,然后os.rename
临时文件覆盖原始文件。这样,你的行为是原子的;如果在写入步骤期间出现问题(例如,它被中断),您最终不会丢失原始文件,并且只是部分写出了替换文本。
答案 2 :(得分:0)
好吧,您可以选择“r + w”模式,只需打开文件一次
答案 3 :(得分:0)
您可以使用'r+' file mode打开文件进行同时读写。
示例:
with open("file.txt", 'r+') as filehandle:
# can read and write to file here