Прочитать плоский файл как транспонировать, Python - PullRequest
2 голосов
/ 27 февраля 2011

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

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

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

Ответы [ 4 ]

4 голосов
/ 27 февраля 2011

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

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

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

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

3 голосов
/ 27 февраля 2011

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

3 голосов
/ 27 февраля 2011

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

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

1 голос
/ 27 февраля 2011

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

...