将内容写入 .txt 文件(UTF-8),Python

14
我想将输出(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()
        ...

文件不应被覆盖。如果您正在读取一个文件并编写一个新文件,为什么只有一个打开? - S.Lott
因为这是一段未完成的代码。 - Gusto
“因为这是未完成的代码”?什么意思?“未完成”并不是一个好的解释,无法解释您的要求与代码之间的不匹配。为什么只有一个开放?请修复您的代码,使其更好地符合您的要求。 - S.Lott
3个回答

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)

打开记事本时,文件“file2.txt”不是UTF-8编码的,这可能是因为我使用了codecs(import codecs)解码数据,并且在保存到文件时,我使用了您建议的不同方法(使用encode方法)。问题是如何使用codecs进行编码? - Gusto
@Gusto - 我添加了一个单独的方法,虽然它完全等效。在记事本中,如何看到文件不是UTF-8编码的?实际上,记事本会为您解码。 - adamk
我能看到它,因为西里尔字母没有正确显示,我必须使用记事本编码器手动解码。 附:使用Notepad ++ - Gusto

11

我喜欢在这种情况下分离关注点 - 我认为这真的可以使代码更清晰、更易于维护,并且可以更高效。

在这里,你有三个关注点:读取UTF-8文件、处理行和写入UTF-8文件。假设你的处理是基于行的,在Python中这很完美,因为打开并迭代文件的行内置于语言中。除了更清晰外,这也更有效率,因为它允许你处理不适合内存的大型文件。最后,它为你提供了一个很好的测试代码的方法 - 因为处理与文件io分离,所以它让你编写单元测试,甚至只需在示例文本上运行处理代码并手动查看输出,而无需烦恼地操作文件。

我将行转换为大写,以便举例说明 - 假定你的处理会更有趣。我喜欢在这里使用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)

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接