0

有很多文件,我需要为每个文件读取文本内容,对文本进行一些处理,然后将文本写回(替换旧内容)。
我知道我可以先将open文件作为rt读取和处理内容,然后将它们关闭并重新打开wt,但显然这不是一个好方法。我可以只打开一个文件来读写吗?如何?

4

4 回答 4

2

查看文件输入模块。它使您可以按照其他人的建议进行操作:备份输入文件,操作其内容,然后将更改的数据写入相同的位置。

可选的就地过滤:如果关键字参数 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
于 2013-04-09T02:35:14.550 回答
2

请参阅: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临时文件覆盖原始文件。这样,您的操作是原子的;如果在写入步骤中出现问题(例如,它被中断),您最终不会丢失原始文件,并且只写出部分替换文本。

于 2013-04-09T02:47:02.700 回答
0

好吧,你可以选择“r+w”模式,你只需要打开文件一次

于 2013-04-09T02:41:10.733 回答
0

您可以使用'r+' 文件模式同时打开一个文件进行读取和写入。

例子:

with open("file.txt", 'r+') as filehandle:
   # can read and write to file here
于 2013-04-09T02:48:07.950 回答