用Python写入UTF-8 .txt文件
我想把输出的内容(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)