Почему происходит сбой csv.reader, если размер файла превышает 40 Кбайт? - PullRequest
0 голосов
/ 24 мая 2018

У меня есть следующий код:

with open(filename, 'rt') as csvfile:
    csvDictReader = csv.DictReader(csvfile, delimiter=',', quotechar='"')
    for row in csvDictReader:
        print(row)

Всякий раз, когда размер файла меньше 40 Кбайт, программа отлично работает.Когда размер файла пересекает 40 КБ, я получаю эту ошибку при попытке прочитать файл:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa0 in position 7206: invalid start byte

Фактическое содержимое файла, как представляется, не является проблемой, только размер самого файла (40 КБ)действительно крошечный).

Когда размер файла превышает 40 Кбайт, ошибка всегда происходит в строке, содержащей 32 Кбайт.

У меня такое ощущение, что Python не может прочитатьфайл размером более 40 Кбайт без исключения, который просто усекает его вокруг 32-го байта в середине.Это верно?Где этот предел определен?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

размер файла не является реальной проблемой, см. Исключение:

UnicodeDecodeError: кодек «utf-8» не может декодировать байт 0xa0 в позиции 7206: недопустимый начальный байт

сначала вы должны решить проблему с кодировкой

with open(filename, 'rt', encoding='utf-8', errors='ignore') as csvfile:

, которая будет игнорировать ошибки кодирования

0 голосов
/ 24 мая 2018

В вашем файле неверные данные UTF-8.Это не имеет ничего общего ни с модулем csv, ни с размером файла;Ваш файл большего размера содержит недопустимые данные, файл меньшего размера - нет.Просто сделайте:

 with open(filename) as f:
     f.read()

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

Если ваш файл на самом деле имеет другую кодировку (например, latin-1, cp1252 и т. д .; утилита командной строки file может помочь с идентификацией, но для многих кодировок ASCII supersetвам просто нужно знать ), передать его в качестве аргумента encoding в open, чтобы использовать вместо локали по умолчанию (utf-8 в этом случае), чтобы вы могли правильно декодировать байты,например:

    # Also add newline='' to defer newline processing to csv module, where it's part
    # of the CSV dialect
    with open(filename, encoding='latin-1', newline='') as csvfile:
        csvDictReader = csv.DictReader(csvfile, delimiter=',', quotechar='"')
        for row in csvDictReader:
            print(row)
...