Eu tenho um script lendo em um arquivo csv com campos muito grandes:
# 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)
No entanto, isso gera o seguinte erro em alguns arquivos csv:
_csv.Error: field larger than field limit (131072)
Como posso analisar arquivos csv com campos enormes? Ignorar as linhas com campos enormes não é uma opção, pois os dados precisam ser analisados nas etapas subsequentes.
Respostas:
O arquivo csv pode conter campos muito grandes, portanto, aumente o
field_size_limit
:sys.maxsize
funciona para Python 2.xe 3.x.sys.maxint
funcionaria apenas com o Python 2.x ( SO: what-is-sys-maxint-in-python-3 )Atualizar
Como Geoff apontou, o código acima pode resultar no seguinte erro:
OverflowError: Python int too large to convert to C long
. Para contornar isso, você pode usar o seguinte código rápido e sujo (que deve funcionar em todos os sistemas com Python 2 e Python 3):fonte
maxInt = sys.maxsize
retornos9223372036854775807L
que consequentemente resultam em umaTypeError: limit must be an integer
chamadacsv.field_size_limit(maxInt)
. Curiosamente, o usomaxInt = int(sys.maxsize)
não altera isso. Uma solução alternativa é usar simplesmente ocsv.field_size_limit(2147483647)
que, obviamente, causa problemas em outras plataformas. No meu caso, isso foi necessário para identificar o valor quebrado no CSV, corrigir as opções de exportação no outro aplicativo e remover a necessidadecsv.field_size_limit()
.Isso pode ocorrer porque seu arquivo CSV incorporou aspas simples ou duplas. Se o seu arquivo CSV estiver delimitado por tabulação, tente abri-lo como:
fonte
-u 3
opção da linha de comando, aka--quoting 3
Abaixo está para verificar o limite atual
Fora [20]: 131072
Abaixo está para aumentar o limite. Adicione-o ao código
Tente verificar o limite novamente
Fora [22]: 100000000
Agora você não receberá o erro "_csv.Error: campo maior que o limite do campo (131072)"
fonte
tamanhos de campo csv são controlados via [Python 3.Docs]: csv. field_size_limit ( [new_limit] ) :
É definido por padrão como 128k ou 0x20000 ( 131072 ), o que deve ser suficiente para qualquer arquivo .csv decente :
No entanto, ao lidar com um arquivo .csv ( com a citação e o delimitador corretos ) com (pelo menos) um campo maior que esse tamanho, o erro é exibido.
Para se livrar do erro, o limite de tamanho deve ser aumentado (para evitar preocupações, é tentado o valor máximo possível).
Nos bastidores (verifique [GitHub]: python / cpython - (mestre) cpython / Modules / _csv.c para obter detalhes da implementação), a variável que mantém esse valor é um C longo ( [Wikipedia]: tipos de dados C ), cujo tamanho varia de acordo com a arquitetura da CPU e do SO ( I L P ). A diferença clássica: para um sistema operacional de 64 bits ( compilação Python ), o tamanho do tipo longo ( em bits ) é:
Ao tentar defini-lo, o novo valor é verificado para estar nos limites longos , por isso, em alguns casos, outra exceção aparece (esse caso é comum no Win ):
Para evitar esse problema, defina o limite (máximo possível) ( LONG_MAX ) usando um artifício (graças a [Python 3.Docs]: ctypes - Uma biblioteca de funções estrangeira para Python ). Ele deve funcionar no Python 3 e Python 2 , em qualquer CPU / OS .
Python de 64 bits em um Nix como sistema operacional :
Para Python de 32 bits , as coisas são uniformes: é o comportamento encontrado no Win .
Verifique os seguintes recursos para obter mais detalhes sobre:
fonte
Acabei de acontecer comigo em um arquivo CSV 'simples'. Algumas pessoas podem chamá-lo de um arquivo formatado inválido. Sem caracteres de escape, sem aspas duplas e delimitadores era um ponto e vírgula.
Uma linha de amostra desse arquivo ficaria assim:
a citação simples na segunda célula jogaria o analisador de seus trilhos. O que funcionou foi:
fonte
Às vezes, uma linha contém coluna de aspas duplas. Quando o leitor csv tenta ler esta linha, não entende o final da coluna e dispara esse aumento. A solução está abaixo:
fonte
Você pode usar
read_csv
frompandas
para pular essas linhas.fonte
pandas
inclui as linhas que excedem o limite de campos decsv
. Portanto, se você quiser pular essas linhas e ler outras linhas com sucesso, poderá usar esta solução. Caso contrário, quando campos enormes forem necessários,csv.field_size_limit(100000000)
é apropriado aumentar o limite de campos .Localize o arquivo cqlshrc geralmente colocado no diretório .cassandra.
Nesse arquivo anexado,
fonte