用Python写入UTF-8 .txt文件

14 投票
3 回答
45054 浏览
提问于 2025-04-16 06:40

我想把输出的内容(contents)保存到一个文件里,并且要用UTF-8格式保存。这个文件不能覆盖原来的文件,而是要保存成一个新文件,比如说叫file2.txt。所以,我首先打开一个file.txt,把它编码成UTF-8,做一些操作,然后想把它以UTF-8格式保存到file2.txt。我该怎么做呢?

import codecs
def openfile(filename):
    with codecs.open(filename, encoding="UTF-8") as F:
        contents = F.read()
        ...

3 个回答

2

打开第二个文件。如果需要的话,可以使用 contextlib.nested()。然后用 shutil.copyfileobj() 来复制内容。

11

我喜欢在这种情况下把不同的任务分开处理——这样做能让代码更整洁,更容易维护,也能提高效率。

在这里,你有三个任务:读取一个UTF-8格式的文件、处理文件中的每一行,以及写入一个UTF-8格式的文件。假设你的处理是基于行的,这在Python中非常合适,因为打开文件并逐行读取是Python语言自带的功能。这样做不仅更清晰,而且更高效,因为它可以处理那些太大而无法全部放进内存的文件。最后,这种分开的方式也让你更容易测试代码——因为处理和文件操作是分开的,你可以写单元测试,或者直接在示例文本上运行处理代码,手动检查输出,而不需要去处理文件。

我在这里把每一行转换成大写字母只是为了举例——你实际的处理可能会更复杂。我喜欢在这里使用“yield”这个关键词——它让处理过程更容易添加或删除额外的行,尽管在我这个简单的例子中并没有用到。

def process(lines):
    for line in lines:
        yield line.upper()

with codecs.open(file1, 'r', 'utf-8') as infile:
    with codecs.open(file2, 'w', 'utf-8') as outfile:
        for line in process(infile):
            outfile.write(line)
17

简单的方法:

file('file2.txt','w').write( file('file.txt').read().encode('utf-8') )

复杂的方法:

data = file('file.txt').read()
... process data ...
data = data.encode('utf-8')
file('file2.txt','w').write( data )

还有一种明确使用'codecs'的方法:

codecs.getwriter('utf-8')(file('/tmp/bla3','w')).write(data)

撰写回答