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


232

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


10
Еще лучше было бы рассмотреть, почему существуют такие большие поля. Это ожидается в ваших данных? Иногда такие ошибки указывают на другую проблему. У меня было несколько плохих данных, которые содержали случайный символ двойной кавычки, и поэтому мне пришлось использовать опцию QUOTE_NONE, показанную здесь в другом ответе.
пылесос

1
Я обновил свой вопрос, чтобы указать, что в моем случае могут возникнуть огромные поля. В CSV-файле нет плохих данных.
user1251007

1
@dustmachine Такие вещи случаются потому, что иногда вы обнаруживаете людей, хранящих изображения (или другие двоичные файлы) в формате base64 в таблицах базы данных.
зима

Ответы:


316

Файл 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: что-это-sys-maxint-in-python-3 )

Обновить

Как Geoff отметил, приведенный выше код может привести к следующей ошибке: 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)

14
В Windows 7 64bit с Python 2.6 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().
Роскакори

Большое вам спасибо за это, я пытался выяснить эту ошибку целую вечность!
Кевин Эрнандес

152

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

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

1
Спасибо!! Если вы используете csvkit (отличную библиотеку Python и набор инструментов csv для командной строки) и получаете исходную ошибку, потому что в вашем файле используются несбалансированные одинарные или двойные кавычки, вы можете выбрать QUOTE_NONE с помощью параметра -u 3командной строки, aka--quoting 3
nealmcb

22

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

csv.field_size_limit()

Out [20]: 131072

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

csv.field_size_limit(100000000)

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

csv.field_size_limit()

Out [22]: 100000000

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


15

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

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

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

>>> import csv
>>>
>>> limit0 = csv.field_size_limit()
>>> limit0
131072
>>> "0x{0:016X}".format(limit0)
'0x0000000000020000'

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

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

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

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

>>> import sys
>>>
>>> sys.platform, sys.maxsize
('win32', 9223372036854775807)
>>>
>>> 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 as ct
>>>
>>> csv.field_size_limit(int(ct.c_ulong(-1).value // 2))
131072
>>> limit1 = csv.field_size_limit()
>>> limit1
2147483647
>>> "0x{0:016X}".format(limit1)
'0x000000007FFFFFFF'

64-битный Python на Nix- подобной ОС :

>>> import sys, csv, ctypes as ct
>>>
>>> sys.platform, sys.maxsize
('linux', 9223372036854775807)
>>>
>>> csv.field_size_limit()
131072
>>>
>>> csv.field_size_limit(int(ct.c_ulong(-1).value // 2))
131072
>>> limit1 = csv.field_size_limit()
>>> limit1
9223372036854775807
>>> "0x{0:016X}".format(limit1)
'0x7FFFFFFFFFFFFFFF'

Для 32-битного Python все одинаково: такое поведение встречается на Win .

Проверьте следующие ресурсы для более подробной информации о:


2

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

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

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

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

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

1

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

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

0

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

import pandas as pd

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

Там нет плохой строки ... как написано в вопросе: CSV-файлы содержат огромные поля, и эти данные должны быть проанализированы.
user1251007

1
Понятие плохих линий в pandasвключает строки, которые превышают предел поля csv. Итак, если вы хотите пропустить эти строки и успешно прочитать другие строки, вы можете использовать это решение. В противном случае, когда вам требуются огромные поля, csv.field_size_limit(100000000)целесообразно увеличить предел поля на .
0x01h

-1

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

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

[csv]
field_size_limit = 1000000000
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.