Запись в файл .txt (UTF-8), python - PullRequest
       18

Запись в файл .txt (UTF-8), python

9 голосов
/ 06 ноября 2010

Я хочу сохранить вывод (contents) в файл (сохраняя его в UTF-8). Файл не должен быть перезаписан, он должен быть сохранен как новый файл - например, file2.txt Итак, я открываю кулак file.txt, кодирую его в UTF-8, делаю некоторые вещи и затем хочу сохранить его в file2.txt в UTF-8. Как мне это сделать?

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

Ответы [ 3 ]

16 голосов
/ 06 ноября 2010

Короткий путь:

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)
9 голосов
/ 06 ноября 2010

Мне нравится разделять проблемы в подобных ситуациях - я думаю, что это действительно делает код чище, проще в обслуживании и может быть более эффективным.

Здесь у вас есть 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)
2 голосов
/ 06 ноября 2010

Откройте второй файл. При необходимости используйте contextlib.nested(). Используйте shutil.copyfileobj() для копирования содержимого.

...