У меня есть сценарий чтения в CSV-файл с очень большими полями:
# example from http://docs.python.org/3.3/library/csv.html?highlight=csv%20dictreader#examples
import csv
with open('some.csv', newline='') as f:
reader = csv.reader(f)
for row in reader:
print(row)
Однако это приводит к следующей ошибке в некоторых файлах CSV:
_csv.Error: field larger than field limit (131072)
Как я могу анализировать CSV-файлы с огромными полями? Пропуск строк с огромными полями не вариант, так как данные должны быть проанализированы на последующих этапах.
Ответы:
Файл CSV может содержать очень большие поля, поэтому увеличьте
field_size_limit
:sys.maxsize
работает для Python 2.x и 3.x.sys.maxint
будет работать только с Python 2.x ( SO: что-это-sys-maxint-in-python-3 )Обновить
Как Geoff отметил, приведенный выше код может привести к следующей ошибке:
OverflowError: Python int too large to convert to C long
. Чтобы обойти это, вы можете использовать следующий быстрый и грязный код (который должен работать в любой системе с Python 2 и Python 3):источник
maxInt = sys.maxsize
возвращает,9223372036854775807L
что в результате приводит кTypeError: limit must be an integer
вызовуcsv.field_size_limit(maxInt)
. Интересно, что использованиеmaxInt = int(sys.maxsize)
не меняет этого. Необработанный обходной путь заключается в простом использовании,csv.field_size_limit(2147483647)
которое, конечно, вызывает проблемы на других платформах. В моем случае это был adquat для определения неверного значения в CSV, исправления параметров экспорта в другом приложении и устранения необходимостиcsv.field_size_limit()
.Это может быть потому, что ваш CSV-файл имеет встроенные одинарные или двойные кавычки. Если ваш CSV-файл разделен табуляцией, попробуйте открыть его как:
источник
-u 3
командной строки, aka--quoting 3
Ниже стоит проверить текущий лимит
Out [20]: 131072
Ниже стоит увеличить лимит. Добавьте это к коду
Попробуйте еще раз проверить лимит
Out [22]: 100000000
Теперь вы не получите сообщение об ошибке «_csv.Error: поле больше предела поля (131072)»
источник
Размеры полей CSV контролируются с помощью [Python 3.Docs]: CSV. field_size_limit ( [new_limit] ) :
По умолчанию он равен 128k или 0x20000 ( 131072 ), что должно быть достаточно для любого приличного .csv :
Однако при работе с файлом .csv ( с правильными кавычками и разделителями ), имеющими (как минимум) на одно поле длиннее этого размера, появляется ошибка.
Чтобы избавиться от ошибки, необходимо увеличить предел размера (чтобы избежать каких-либо забот, делается попытка получить максимально возможное значение).
За кулисами (проверьте [GitHub]: python / cpython - (master) cpython / Modules / _csv.c для деталей реализации), переменная, которая содержит это значение, имеет длину C ( [Википедия]: типы данных C ), размер которой варьируется в зависимости от архитектуры процессора и ОС ( I L P ). Классическое отличие: для 64-битной ОС ( сборка Python ) размер длинного шрифта ( в битах ):
При попытке установить его проверяется, чтобы новое значение находилось в длинных границах, поэтому в некоторых случаях появляется другое исключение (этот случай распространен в Win ):
Чтобы избежать этой проблемы, установите (максимально возможный) предел ( LONG_MAX ) с помощью искусственного устройства (благодаря [Python 3.Docs]: ctypes - библиотека сторонних функций для Python ). Он должен работать на Python 3 и Python 2 , на любом процессоре / ОС .
64-битный Python на Nix- подобной ОС :
Для 32-битного Python все одинаково: такое поведение встречается на Win .
Проверьте следующие ресурсы для более подробной информации о:
источник
Я только что это случилось со мной в «простом» файле CSV. Некоторые люди могут назвать это неверным отформатированным файлом. Без escape-символов, без двойных кавычек и разделителей была точка с запятой.
Пример строки из этого файла будет выглядеть так:
одиночная кавычка во второй ячейке отбросит парсер с рельсов. Что сработало было:
источник
Иногда строка содержит столбец с двойными кавычками. Когда читатель csv попытается прочитать эту строку, не понял конец столбца и сработает это повышение. Решение ниже:
источник
Вы можете использовать
read_csv
от,pandas
чтобы пропустить эти строки.источник
pandas
включает строки, которые превышают предел поляcsv
. Итак, если вы хотите пропустить эти строки и успешно прочитать другие строки, вы можете использовать это решение. В противном случае, когда вам требуются огромные поля,csv.field_size_limit(100000000)
целесообразно увеличить предел поля на .Найдите файл cqlshrc, который обычно находится в каталоге .cassandra.
В этом файле добавить,
источник