有很多文件,我需要为每个文件读取文本内容,对文本进行一些处理,然后将文本写回(替换旧内容)。
我知道我可以先将open
文件作为rt
读取和处理内容,然后将它们关闭并重新打开wt
,但显然这不是一个好方法。我可以只打开一个文件来读写吗?如何?
4 回答
查看文件输入模块。它使您可以按照其他人的建议进行操作:备份输入文件,操作其内容,然后将更改的数据写入相同的位置。
可选的就地过滤:如果关键字参数 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
请参阅:http ://docs.python.org/2/library/functions.html#open
最常用的模式值是 'r' 用于读取,'w' 用于写入(如果文件已经存在则截断文件)和 'a' 用于附加(在某些 Unix 系统上,这意味着所有写入都附加到末尾无论当前的搜索位置如何,文件的位置)。如果省略 mode,则默认为 'r'。默认是使用文本模式,它可以在写入和读取时将 '\n' 字符转换为特定于平台的表示。因此,在打开二进制文件时,应在模式值后附加“b”以二进制模式打开文件,这将提高可移植性。(附加 'b' 即使在不区别对待二进制文件和文本文件的系统上也很有用,它用作文档。)有关 mode 的更多可能值,请参见下文。
模式“r+”、“w+”和“a+”打开文件进行更新(注意“w+”会截断文件)。在区分二进制文件和文本文件的系统上,将“b”附加到模式以二进制模式打开文件;在没有这种区别的系统上,添加“b”没有效果。
因此,您可以在 mode 中打开一个文件r+
,从中读取,截断,然后写入同一个文件对象。但你不应该那样做。
您应该以读取模式打开文件,写入临时文件,然后os.rename
临时文件覆盖原始文件。这样,您的操作是原子的;如果在写入步骤中出现问题(例如,它被中断),您最终不会丢失原始文件,并且只写出部分替换文本。
好吧,你可以选择“r+w”模式,你只需要打开文件一次
您可以使用'r+' 文件模式同时打开一个文件进行读取和写入。
例子:
with open("file.txt", 'r+') as filehandle:
# can read and write to file here