Python — трудности кодирования с ивритом

Я пытаюсь объединить несколько файлов .txt на иврите из одной папки в один файл. Кодировка cp1255 для иврита. Я указал кодировку, поэтому файл открывается успешно, но кодировка завершается ошибкой при попытке записать строку в файл. Если я не укажу кодировку в команде открытия, само открытие завершится ошибкой (в строке 7).

dirLoc="source/folder"
import os
files=os.listdir(dirLoc)
for f in files:
if f.endswith('.txt'):
    print(f)
    data=open(dirLoc+'/'+f, 'r', encoding="cp1255")
    out=open("outPut.txt", 'a')
    for line in data:
        out.write(line)
    data.close()
    out.close()

Ошибка, которую я получаю, является стандартной: UnicodeDecodeError: кодек 'charmap' не может декодировать байт X в позиции Y: сопоставление символов с неопределенным

Редактировать: Поигравшись с этим еще немного, проблема, похоже, определенно связана с записью строки на иврите в файл .txt. Это верно, даже если я пересохраню файл в другом формате (например, ANSI или utf-8) и соответствующим образом изменю кодировку. Он также отлично работает с файлами .txt на английском языке.


person Henry Brice    schedule 22.04.2014    source источник
comment
Не могли бы вы предоставить минимальный входной файл, который вызывает ошибку?   -  person Hyperboreus    schedule 22.04.2014
comment
Я не думаю, что смогу прикрепить файл к сообщению, но любой текст на иврите, например: הנה משפט בעברית, кажется, имеет ту же проблему. Пересохранение файлов в формате utf-8 и изменение кода соответственно не помогает. Проблема, кажется, с записью строки в файл.   -  person Henry Brice    schedule 23.04.2014
comment
Проблема связана с чтением существующего файла или записью в новый файл?   -  person Lasse V. Karlsen    schedule 23.04.2014
comment
Насколько я могу судить, это с записью строки в файл. строка является строкой, но затем она терпит неудачу в строке 10 с командой записи.   -  person Henry Brice    schedule 23.04.2014


Ответы (1)


Хорошо, поигравшись с этим еще один день, я нашел решение следующим образом:

dirLoc='source/folder'
import os
import codecs
files=os.listdir(dirLoc)
for f in files:
    if f.endswith('.txt'):
        data=codecs.open(dirLoc+'/'+f, 'r+', encoding='utf8')
    try:
        data1=data.read()
        out=codecs.open(dirLoc+'/outPut.txt', 'a+', encoding='utf8')
        try:
            out.write(data1)
        except:
            print('file ' +f+ ' failed to write')
    except:
        print('file '+f+' failed to read')
    out.close()       
    data.close()

codecs.open позволяет мне указать кодировку для функции записи, а также для чтения — обратите внимание, что вы должны импортировать codecs, чтобы использовать его. Исключения существуют, потому что кодировка все еще является проблемой, а случайный файл вызывает исключение. Попытка позволяет мне пропустить любой файл, который не может быть прочитан или записан, без полного сбоя.

person Henry Brice    schedule 24.04.2014