2010-11-06 117 views
9

我想将输出(contents)保存为一个文件(将其保存为UTF-8)。该文件不应该被覆盖,它应该被保存为一个新的文件 - 例如file2.txt 所以,我打开一个file.txt,用UTF-8编码,做一些东西然后用UTF-8保存到file2.txt。我该怎么做呢?写入.txt文件(UTF-8),python

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

“文件不应该被覆盖”。为什么只有一个打开,如果你正在阅读一个文件,并写一个新的文件? – 2010-11-06 12:01:23

+0

,因为这是一个未完成的代码。 ...“ – Gusto 2010-11-06 12:06:23

+0

”因为这是一个未完成的代码“?什么? “未完成”不是您的要求与您的代码之间不匹配的好解释。为什么只有一个开放?请修正您的代码以更好地符合您的要求。 – 2010-11-08 12:14:25

回答

16

简短的方式:

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) 
+0

在记事本中打开时文件'file2.txt'不是UTF-8编码,可能是因为我使用编解码器(导入编解码器)解码数据,并将其保存到文件时使用了不同的方式(如使用编码方法)。问题是我如何使用编解码器对它进行编码? – Gusto 2010-11-06 11:45:49

+0

@Gusto - 我添加了一个单独的方法,虽然它是完全等效的。你怎么能在记事本中看到一个文件不是utf-8编码的?记事本实际上为你解码。 – adamk 2010-11-06 12:36:34

+0

我可以看到它,因为西里尔字符没有正确显示,我不得不使用记事本编码器手动解码它。 P.S.感谢您使用Notepad ++ – Gusto 2010-11-06 13:46:09

9

我喜欢在这种情况下区分顾虑 - 我认为它确实使代码更干净,更容易维护,并且效率更高。

这里有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)