Чтение плоского файла как транспонирование, python

Я заинтересован в том, чтобы читать текстовые файлы с фиксированной шириной в Python настолько эффективно, насколько это возможно. В частности, большую часть времени меня интересуют один или несколько столбцов в плоском файле, а не целые записи.

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

Желательна ли такая вещь, и если да, то возможна ли она?


person justin cress    schedule 26.02.2011    source источник


Ответы (4)


Файлы располагаются в виде (одномерной) последовательности битов. «Линии» — это просто удобство, которое мы добавили, чтобы людям было легко читать. Так что, как правило, то, о чем вы просите, невозможно для простых файлов. Чтобы осуществить это, вам понадобится какой-то способ найти, где начинается запись. Два наиболее распространенных способа:

  • Поиск символов новой строки (другими словами, чтение всего файла).
  • Используйте макет со специальным интервалом, чтобы каждая запись размещалась с использованием фиксированного с. Таким образом, вы можете использовать файловые операции низкого уровня, такие как seek, чтобы перейти прямо туда, куда вам нужно. Это позволяет избежать чтения всего файла, но это неудобно делать вручную.

Я бы не стал слишком беспокоиться о производительности чтения файлов, если только это не станет проблемой. Да, вы можете сопоставить файл с памятью, но ваша ОС, вероятно, уже кэширует его для вас. Да, вы можете использовать формат базы данных (например, формат файла sqlite3 через sqlalchemy), но, вероятно, не стоит хлопот.

Примечание к "фиксированной ширине": Что именно вы подразумеваете под этим? Если вы действительно имеете в виду, что «каждый столбец всегда начинается с одного и того же смещения относительно начала записи», вы определенно можете использовать Python seek, чтобы пропустить прошлые данные, которые вас не интересуют.

person phooji    schedule 26.02.2011

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

Для больших файлов с фиксированным форматированием вы можете извлечь пользу из ммаппинга файла. Я сделал это только с C, а не с Python, но кажется, что mmapping файл, а затем прямой доступ к соответствующим полям, вероятно, будет достаточно эффективным.

person Whatang    schedule 26.02.2011

Плоские файлы не подходят для того, что вы пытаетесь сделать. Я предлагаю преобразовать файлы в базу данных SQL (используя sqlite3), а затем прочитать только нужные столбцы. SQLite3 молниеносно работает.

person lazy1    schedule 26.02.2011
comment
Я согласен. Плоские файлы никогда не бывают идеальными. Я пытаюсь работать с плоскими файлами, предоставленными переписью и другими источниками данных. Я пытаюсь избежать ненужных операций чтения. Бросать весь файл (файлы) в sql возможно, но это далеко не идеально, учитывая размер файлов. Гораздо лучше иметь возможность передавать в sql только подмножество файлов. - person justin cress; 27.02.2011

Если это действительно фиксированная ширина, то вы должны просто вызвать read(N), чтобы пропустить фиксированное количество байтов от конца вашего столбца в одной строке до его начала в следующей.

person jblocksom    schedule 26.02.2011