【发布时间】:2011-02-26 21:20:35
【问题描述】:
我有兴趣以尽可能高效的方式在 Python 中读取固定宽度的文本文件。具体来说,大多数时候我对平面文件中的一列或多列感兴趣,而不是整个记录。
一次读取一行文件并在将整行读入内存后提取所需的列让我感到效率低下。我想我宁愿选择只阅读所需的列,从上到下,从左到右(而不是从左到右,从上到下阅读)。
这样的事情是否可取,如果可以,有可能吗?
【问题讨论】:
标签: python flat-file transpose
我有兴趣以尽可能高效的方式在 Python 中读取固定宽度的文本文件。具体来说,大多数时候我对平面文件中的一列或多列感兴趣,而不是整个记录。
一次读取一行文件并在将整行读入内存后提取所需的列让我感到效率低下。我想我宁愿选择只阅读所需的列,从上到下,从左到右(而不是从左到右,从上到下阅读)。
这样的事情是否可取,如果可以,有可能吗?
【问题讨论】:
标签: python flat-file transpose
文件被布置为(一维)位序列。 “线条”只是我们添加的一种便利,使人们易于阅读。因此,一般而言,您所要求的内容在普通文件上是不可能的。要实现这一点,您需要某种方法来查找记录的开始位置。最常见的两种方式是:
seek,直接前往您需要前往的地方。这样可以避免读取整个文件,但手动执行会很痛苦。我不会太担心文件读取性能,除非它成为问题。是的,您可以对文件进行内存映射,但您的操作系统可能已经为您缓存了。是的,您可以使用数据库格式(例如,通过sqlalchemy 的 sqlite3 文件格式),但这可能不值得麻烦。
关于“固定宽度”的旁注:您的具体意思是什么?如果您的意思是“每一列总是从相对于记录开头的相同偏移量开始”,那么您绝对可以使用Python's seek 跳过您不感兴趣的过去数据。
【讨论】:
线条有多大?除非每条记录都很大,否则只阅读您感兴趣的领域而不是整行可能没什么区别。
对于具有固定格式的大文件,您可能会从mmapping 文件中得到一些东西。我只使用 C 而不是 Python 完成了此操作,但似乎映射文件然后直接访问适当的字段可能相当有效。
【讨论】:
平面文件不适合您尝试执行的操作。我的建议是将文件转换为 SQL 数据库(使用 sqlite3),然后只读取您想要的列。 SQLite3 速度极快。
【讨论】:
如果它是真正的固定宽度,那么您应该能够只调用 read(N) 以跳过从一行的列末尾到下一行的开头的固定字节数。
【讨论】: