2013-06-26 2 views
0

Я пишу программу для итерации моего Robocopy-Log (> 25 МБ). Это далеко не готово, потому что я столкнулся с проблемой.Python3: Почему я получаю UnicodeDecodeError или это проблема памяти?

Проблема состоит в том, что после того, как переборе ~ 1700 строк моего журнала -> я получаю "UnicodeError":

Traceback (most recent call last): 
    File "C:/Users/xxxxxx.xxxxxx/SkyDrive/#Python/del_robo2.py", line 6, in <module> 
    for line in data: 
    File "C:\Python33\lib\encodings\cp1252.py", line 23, in decode 
    return codecs.charmap_decode(input,self.errors,decoding_table)[0] 
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 7869: character maps to <undefined> 

Программа выглядит следующим образом:

x="Error" 
y=1 
arry = [] 
data = open("Ausstellungen.txt",mode="r") 
for line in data: 
    arry = line.split("\t") 
    print(y) 
    y=y+1 
    if x in arry: 
     print("found") 
     print(line) 
data.close() 

Если я уменьшить TXT файл до 1000 строк, то программа работает. Если я удаляю строку с 1500 по 3000 и снова запускаю, я снова получаю ошибку Unicode в строке 1700.

Так что я сделал ошибку или это проблема ограничения памяти Python?

+0

Это проблема с кодировкой, а не проблема с памятью. – pynovice

+0

Вы должны передать аргумент 'encoding' для' open' (если вы находитесь на python3, в python2 используйте 'codecs.open'). – Bakuriu

ответ

0

С учетом ваших данных & сниппет, я был бы удивлен, если это проблема с памятью. Скорее всего, кодирование: Python использует кодировку по умолчанию для вашей системы, чтобы прочитать файл, который является «cp1252» (стандартная кодировка MS Windows), но файл содержит байтовые последовательности/байты, которые не могут быть декодированы в этой кодировке. Кандидат в реальной кодировки файла может быть «латино-1», который вы можете использовать Python 3, говоря

open("Ausstellungen.txt",mode="r", encoding="latin-1") 

А, возможно, подобный вопрос является Python 3 chokes on CP-1252/ANSI reading. Хороший разговор обо всем этом здесь: http://nedbatchelder.com/text/unipain.html

+0

THX много, настройка кодировки на латинский язык в этом случае была правильной. Моя первая программа проверки журнала Python медленно получает вещество :). – polYtoX

0

Python декодирует все данные файла в значения Unicode. Вы не указали кодировку для использования, поэтому Python использует значение по умолчанию для вашей системы, cp1252 Windows Latin codepage.

Однако это неправильная кодировка для данных вашего файла. Вы должны явно указать кодек использовать:

data = open("Ausstellungen.txt",mode="r", encoding='UTF8') 

Какое кодирование использовать точно, к сожалению, то, что вам нужно выяснить самостоятельно. Я использовал UTF-8 в качестве примера кодека.

Знайте, что some versions of RoboCopy have problems producing valid output.

Если вы еще не знаете, что такое Юникод, или вы хотите знать о кодировках, см:

Причина, по которой вы видите ошибку для разных частей вашего файла, состоит в том, что ваши данные содержат более одного кода, который не может обрабатывать кодировка cp1252.

+0

THX за богатство информации.Выбор UTF8 не помог мне, но вы ясно писали, что, возможно, журнал не в правильном формате. – polYtoX

+0

@polYtoX: Если вы использовали '/ unilog', то выход был бы (должен) быть в UTF16. –

Смежные вопросы