Чтение Python из файла и сохранение в utf-8
У меня возникают проблемы с чтением из файла, обработкой его строки и сохранением в файле UTF-8.
Вот код:
try:
filehandle = open(filename,"r")
except:
print("Could not open file " + filename)
quit()
text = filehandle.read()
filehandle.close()
Затем я обрабатываю текст переменной.
И затем
try:
writer = open(output,"w")
except:
print("Could not open file " + output)
quit()
#data = text.decode("iso 8859-15")
#writer.write(data.encode("UTF-8"))
writer.write(text)
writer.close()
Это выводит файл отлично, но он делает это в iso 8859-15 в соответствии с моим редактором. Поскольку тот же редактор распознает входной файл (в имени файла переменной) как UTF-8, я не знаю, почему это произошло. Что касается моего повторного поиска, то прокомментированные строки должны решить проблему. Однако, когда я использую эти строки, результирующий файл имеет тарабарщину в специальном характере в основном, слова с тильдой, поскольку текст находится на испанском языке. Я бы очень признателен за любую помощь, поскольку я в тупике....
Ответы
Ответ 1
Обработайте текст в и из Unicode на границах ввода/вывода вашей программы, используя модуль codecs
:
import codecs
with codecs.open(filename, 'r', encoding='utf8') as f:
text = f.read()
# process Unicode text
with codecs.open(filename, 'w', encoding='utf8') as f:
f.write(text)
Редактировать: модуль io
теперь рекомендуется вместо кодеков и совместим с open
синтаксисом Python 3:
import io
with io.open(filename, 'r', encoding='utf8') as f:
text = f.read()
# process Unicode text
with io.open(filename, 'w', encoding='utf8') as f:
f.write(text)
Ответ 2
Вы также можете пройти через код ниже:
file=open(completefilepath,'r',encoding='utf8',errors="ignore")
file.read()
Ответ 3
Вы не можете сделать это, используя open. использовать кодеки.
когда вы открываете файл в python, используя открытую встроенную функцию, вы всегда будете читать/записывать файл в ascii. Чтобы записать его в utf-8, попробуйте следующее:
import codecs
file = codecs.open('data.txt','w','utf-8')