Как обратиться: Python импорт файла с .csv Dictreader завершается неудачно для неопределенного символа - PullRequest
0 голосов
/ 30 августа 2018

Прежде всего, я нашел следующее , которое в основном совпадает с моим вопросом, но оно закрыто, и я не уверен, что понимаю причину закрытия по сравнению с содержанием поста. Я тоже не вижу рабочего ответа.

У меня более 20 входных файлов из 4 приложений. Все файлы экспортируются как файлы .csv. Первые 19 файлов работали (4 других экспортированы из того же приложения), а затем я столкнулся с файлом, который выдает мне эту ошибку:

UnicodeDecodeError: 'charmap' codec can't decode byte 0x8f in position 5762: character maps to <undefined>

Если я посмотрел это правильно, то это & ​​lt ctrl & gt. Код ниже - соответствующие строки:

with open(file, newline = '') as f: 
    reader = csv.DictReader(f, dialect = 'excel')
    for line in reader:

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

Так что вопрос, вероятно, состоит из нескольких частей:
1) Есть ли способ сказать csv.DictReader игнорировать неопределенные символы? (Подсказка для кодека: если я его не вижу, он не имеет для меня значения.)

2) Что мне делать, если у меня есть «сумасшедшие» персонажи? Я подумал об открытии каждого ввода в виде двоичного файла, отфильтровывая поврежденные шестнадцатеричные символы, записывая файл обратно на диск, а затем открывая новый файл, но для программы это требует больших затрат и даже больше для меня. Это также несколько заявлений JCL о том, что я снова в 1977 году.

3) Как выяснить, что я получаю в качестве входных данных, если он падает, когда я читаю это.

4) Я выбрал "диалект =" Excel ""; потому что многие входные данные представляют собой файлы Excel, которые можно загрузить из одного из исходных приложений. Из документов на dictreader у меня сложилось впечатление, что это просто определяет разделитель, символ кавычки и символы EOL, которые можно ожидать / использовать. Поэтому я не думаю, что это моя проблема, но я тоже нуб-питон, так что я не уверен на 100%.

1 Ответ

0 голосов
/ 30 августа 2018

Я разместил решение, с которым пошел, в комментариях выше; это должно было установить errors аргумент open() в 'ignore':

with open(file, newline = '', errors='ignore') as f: 

Это именно то, что я искал в своем первом вопросе в оригинальном посте выше (т.е. есть ли способ сказать csv.DictReader игнорировать неопределенные символы).

Обновление: позже мне нужно было поработать с некоторыми символами Юникода, и я не мог их игнорировать. Правильный ответ для этого решения на основе созданного в Excel файла unicode .csv заключался в использовании кодека utf_8_sig. При этом удаляется маркер порядка байтов (UTF-16 BOM), который Windows записывает в верхней части файла, чтобы сообщить, что в нем есть символы Юникода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...