Использование буферизованного ридера для больших файлов .csv, Python - PullRequest
4 голосов
/ 16 июня 2011

Я пытаюсь открыть большие файлы .csv (16k строк +, ~ 15 столбцов) в скрипте Python, и у меня возникли некоторые проблемы.

Я использую встроенную функцию open (), чтобы открыть файл, затем объявляю csv.DictReader, используя входной файл. Цикл структурирован так:

for (i, row) in enumerate(reader):
     # do stuff (send serial packet, read response)

Однако, если я использую файл длиной более 20 строк, файл откроется, но через несколько итераций я получу операцию ValueError: I / O для закрытого файла.

Я думаю, что у меня может быть недостаточно памяти (хотя размер файла 16 КБ составляет всего 8 МБ, а у меня 3 ГБ ОЗУ), и в этом случае я ожидаю, что мне понадобится использовать какой-то буфер для загрузки только разделы файла в памяти одновременно.

Я на правильном пути? Или могут быть другие причины неожиданного закрытия файла?

edit: примерно в половине случаев я запускаю это с CSV из 11 строк, это дает мне ValueError. Ошибка не всегда возникает в одной строке

Ответы [ 2 ]

4 голосов
/ 16 июня 2011

16 тыс. Строк - ничто для 3 ГБ ОЗУ, скорее всего, ваша проблема в чем-то другом, например, Вы занимаете слишком много времени в каком-то другом процессе, который мешает открытию файла. Просто чтобы быть уверенным и в любом случае для скорости, когда у вас есть 3 ГБ оперативной памяти, загрузите весь файл в память, а затем проанализируйте, например,

import csv
import cStringIO
data = open("/tmp/1.csv").read()
reader = csv.DictReader(cStringIO.StringIO(data))
for row in reader:
    print row

По крайней мере, в этом случае вы не должны получать ошибку открытия файла.

0 голосов
/ 26 октября 2013

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

def child_process(name):
     # Do the Read and Process stuff here.if __name__ == '__main__':
     # Get file object resource.
      .....
     p = Process(target=child_process, args=(resource,))
     p.start()
     p.join()

Для получения дополнительной информации перейдите по этой ссылке. http://articlesdictionary.wordpress.com/2013/09/29/read-csv-file-in-python/

...