Подтвердить что ты не робот

_csv.Error: поле больше предела поля (131072)

У меня есть сценарий чтения в 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 файлы с огромными полями? Пропуск строк с огромными полями не вариант, так как данные должны быть проанализированы на последующих этапах.

4b9b3361

Ответ 1

Файл CSV может содержать очень большие поля, поэтому увеличьте field_size_limit:

import sys
import csv

csv.field_size_limit(sys.maxsize)

sys.maxsize работает для Python 2.x и 3.x. sys.maxint будет работать только с Python 2.x(SO: what-is-sys-maxint-in-python-3)

Обновление

Как указал Джефф, приведенный выше код может привести к следующей ошибке: OverflowError: Python int too large to convert to C long. Чтобы обойти это, вы можете использовать следующий быстрый и грязный код (который должен работать в любой системе с Python 2 и Python 3):

import sys
import csv
maxInt = sys.maxsize

while True:
    # decrease the maxInt value by factor 10 
    # as long as the OverflowError occurs.

    try:
        csv.field_size_limit(maxInt)
        break
    except OverflowError:
        maxInt = int(maxInt/10)

Ответ 2

Это может быть связано с тем, что ваш файл CSV имеет встроенные одиночные или двойные кавычки. Если ваш CSV файл имеет разделитель табуляции, попробуйте открыть его как:

c = csv.reader(f, delimiter='\t', quoting=csv.QUOTE_NONE)

Ответ 3

Ниже стоит проверить текущий лимит

csv.field_size_limit()

Out [20]: 131072

Ниже стоит увеличить лимит. Добавьте это к коду

csv.field_size_limit(100000000)

Попробуйте еще раз проверить лимит

csv.field_size_limit()

Out [22]: 100000000

Теперь вы не получите сообщение об ошибке "_csv.Error: поле больше предела поля (131072)"

Ответ 4

Размеры полей CSV контролируются с помощью [Python 3.Docs]: CSV.field_size_limit([new_limit]):

Возвращает текущий максимальный размер поля, разрешенный парсером. Если задано new_limit, это становится новым лимитом.

По умолчанию он установлен на 128k или 0x20000 (131072), что должно быть достаточно для любого приличного .csv:

>>> import csv
>>> csv.field_size_limit()
131072

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

За кулисами (проверьте [GitHub]: python/cpython - (master) cpython/Modules/_csv.c для подробностей реализации), переменная, которая содержит это значение, имеет длину C long ([Wikipedia]: типы данных C), размер которых варьируется в зависимости от архитектуры процессора и ОС (I LP). Классическая разница: для 64-битной ОС размер длинного шрифта (в битах):

  • Nix: 64
  • Победа: 32

При попытке установить его проверяется, чтобы новое значение находилось в длинных границах, поэтому в некоторых случаях появляется другое исключение (это часто встречается в Win):

>>> import sys
>>> csv.field_size_limit(sys.maxsize)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: Python int too large to convert to C long

Чтобы избежать этой проблемы, установите (максимально возможный) предел (LONG_MAX) с помощью искусственного устройства (благодаря [Python 3.Docs]: ctypes - библиотека сторонних функций для Python). Он должен работать на Python 3 и Python 2 на любом процессоре/ОС.

>>> import ctypes
>>> csv.field_size_limit(int(ctypes.c_ulong(-1).value // 2))
131072
>>> csv.field_size_limit()
2147483647

Для получения дополнительной информации об игре с границами типов C из Python, проверьте [SO]: Максимальное и минимальное значение целых чисел типов C из Python (ответ @CristiFati).

Ответ 5

Для Python 3.4 я нашел этот код, и он работает для меня:

csv.field_size_limit(500 * 1024 * 1024)

Ответ 6

Иногда строка содержит столбец с двойной кавычкой. Когда читатель csv попытается прочитать эту строку, непонятный конец столбца и запустить этот рейз. Решение ниже:

reader = csv.reader(cf, quoting=csv.QUOTE_MINIMAL)

Ответ 7

Я только что это случилось со мной в "простом" файле CSV. Некоторые люди могут назвать это неверным отформатированным файлом. Без escape-символов, без двойных кавычек и разделителей - точка с запятой.

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

Первая ячейка; Вторая ячейка с одной двойной кавычкой и ведущей пробел; ячейка 'Частично процитирована'; последняя ячейка

одиночная кавычка во второй ячейке отбросит парсер с его рельсов. То, что сработало, было:

csv.reader(inputfile, delimiter=';', doublequote='False', quotechar='', quoting=csv.QUOTE_NONE)

Ответ 8

Найдите файл cqlshrc, который обычно находится в каталоге .cassandra.

В этом файле добавить,

[csv]
field_size_limit = 1000000000

Ответ 9

Вы можете использовать read_csv из pandas, чтобы пропустить эти строки.

import pandas as pd

data_df = pd.read_csv('data.csv', error_bad_lines=False)