写入.txt文件(UTF-8),python

写入.txt文件(UTF-8),python,python,save,Python,Save,我想将输出(内容)保存到一个文件(以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()

我想将输出(
内容
)保存到一个文件(以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()
        ...
捷径:

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.getwriter('utf-8')(file('/tmp/bla3','w')).write(data)

打开第二个文件。如果需要,请使用。用于复制内容。

我喜欢在这种情况下分离关注点-我认为这确实使代码更干净、更易于维护,而且效率更高

这里有3个问题:读取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)

在记事本中打开的文件“file2.txt”不是utf-8编码的,这可能是因为我使用编解码器(导入编解码器)对数据进行了解码,并且在将其保存到文件时使用了您建议的不同方式(使用编码方法)。问题是如何使用编解码器对其进行编码?@Gusto-我添加了一个单独的方法,尽管它完全等效。您如何在记事本中看到文件不是utf-8编码的?记事本实际上为您解码。我可以看到它,因为西里尔字母没有正确显示,我必须使用记事本编码器手动解码。注意:使用记事本++“文件不应被覆盖”。为什么只有一个打开,如果你正在读一个文件,并写一个新的文件?因为这是一个未完成的代码。。。“因为这是一个未完成的代码”?什么?“未完成”并不能很好地解释需求和代码之间的不匹配。为什么只有一家开着?请修复您的代码以更好地匹配您的要求。