2013-09-19 2 views
1

Я пытаюсь прочитать файл csv. Проблема в том, что она слишком велика, и мне пришлось использовать обработчик ошибок. Внутри обработчика ошибок я должен позвонить csv.field_size_limit(). Это не работает даже само по себе, так как я продолжаю получать ошибку «предел должен быть целым». Из дальнейших исследований я обнаружил, что это, вероятно, ошибка установки. Я установил все сторонние инструменты с помощью диспетчера пакетов, поэтому я не уверен, что может произойти неправильно. Любые идеи о том, как исправить эту проблему?Проблема с CSV-считывателем в Enthought Canopy

import sys 
import csv 
maxInt = sys.maxsize 
decrement = True 
while decrement: 
    decrement = False 
    try: 
     csv.field_size_limit(maxInt) 
    except OverflowError: 
     maxInt = int(maxInt/10) 
     decrement = True 
with open("Data.csv", 'rb') as textfile: 
    text = csv.reader(textfile, delimiter=" ", quotechar='|') 
    for line in text: 
     print ' '.join(line) 

ответ

3

Короткий ответ: Я предполагаю, что вы находитесь на 64-битной Windows. Если да, попробуйте использовать sys.maxint вместо sys.maxsize. На самом деле, вероятно, вы все равно столкнетесь с проблемами, потому что я думаю, что csv.field_size_limit() собирается попытаться выделить память такого размера. Вы действительно хотите оценить фактический размер поля, который вам нужен, и, возможно, удвоить его. Оба значения sys.maxint и sys.maxsize слишком велики для этого.

Длинные объяснения: Python int объектов магазин C long целые числа. На всех соответствующих 32-битных платформах как размер указателя, так и смещение памяти и целые числа C long составляют 32 бита. На большинстве 64-разрядных платформ UNIXy размер указателя или смещения памяти и целые числа C long являются 64-битными. Тем не менее, 64-битные Windows решили сохранить C long целых 32-битных данных, одновременно увеличивая размер указателя до 64 бит. sys.maxint представляет собой самый большой Python int (и, следовательно, C long), а sys.maxsize - самое большое смещение памяти. Следовательно, в 64-битной Windows sys.maxsize представляет собой целое число Python long, потому что тип Python int не может содержать число такого размера. Я подозреваю, что csv.field_size_limit() действительно требует числа, которое вписывается в добросовестный объект Python int. Вот почему вы получаете OverflowError и ошибки limit must be an integer.

+0

Привет, Роберт, благодарю вас за помощь. Основная проблема, если я не знаю, как оценить размер поля, поскольку файл не открывается в excel (файл слишком велик). Я попытаюсь обойти это, изменив файл в текст и надеясь, что все будет хорошо. – Black

+0

Вы можете открыть файл как текст, перебрать строки и взять максимальную длину строки. Установите это как максимальный размер поля CSV, затем снова откройте файл как CSV. –

+0

Ах ладно. Да, это звучит как отличная идея. Еще раз спасибо Роберт :) – Black

Смежные вопросы