我想将output(contents)保存到文件中(以UTF-8保存).该文件不应该被覆盖,它应该保存为新文件 - 例如file2.txt
,我打开一个file.txt,用UTF-8编码,做一些东西,然后想把它保存到file2.txtUTF-8.我该怎么做呢?
import codecs
def openfile(filename):
with codecs.open(filename, encoding="UTF-8") as F:
contents = F.read()
...
Run Code Online (Sandbox Code Playgroud)
ada*_*amk 16
简短的方法:
file('file2.txt','w').write( file('file.txt').read().encode('utf-8') )
Run Code Online (Sandbox Code Playgroud)
漫长的道路:
data = file('file.txt').read()
... process data ...
data = data.encode('utf-8')
file('file2.txt','w').write( data )
Run Code Online (Sandbox Code Playgroud)
并明确使用'编解码器':
codecs.getwriter('utf-8')(file('/tmp/bla3','w')).write(data)
Run Code Online (Sandbox Code Playgroud)
小智 9
我喜欢在这种情况下分开关注点 - 我认为它确实使代码更清晰,更易于维护,并且可以更高效.
这里有3个问题:读取UTF-8文件,处理行和编写UTF-8文件.假设您的处理是基于行的,这在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)
Run Code Online (Sandbox Code Playgroud)