2

我有兴趣以尽可能高效的方式在 Python 中读取固定宽度的文本文件。具体来说,大多数时候我对平面文件中的一列或多列感兴趣,而不是整个记录。

一次读取一行文件并在将整行读入内存后提取所需的列,这让我感到效率低下。我想我宁愿选择只阅读所需的列,从上到下,从左到右(而不是从左到右,从上到下阅读)。

这样的事情是否可取,如果可以,有可能吗?

4

4 回答 4

4

文件被布置为(一维)位序列。“线条”只是我们添加的一种便利,使人们易于阅读。因此,一般而言,您所要求的内容在普通文件上是不可能的。要实现这一点,您需要某种方法来查找记录的开始位置。最常见的两种方式是:

  • 搜索换行符(换句话说,读取整个文件)。
  • 使用特殊间隔的布局,以便每条记录使用固定的布局。这样,您可以使用低级文件操作,例如seek,直接转到您需要去的地方。这样可以避免读取整个文件,但是手动执行会很痛苦。

除非它成为一个问题,否则我不会太担心文件读取性能。是的,您可以对文件进行内存映射,但您的操作系统可能已经为您缓存了。是的,您可以使用数据库格式(例如,通过sqlalchemy的 sqlite3 文件格式),但这可能不值得麻烦。

关于“固定宽度”的旁注:你到底是什么意思?如果您的意思是“每一列总是以相对于记录开头的相同偏移量开始”,那么您绝对可以使用Pythonseek跳过您不感兴趣的过去数据。

于 2011-02-26T21:58:55.580 回答
3

线有多大?除非每条记录都很大,否则只阅读您感兴趣的领域而不是整行可能没什么区别。

对于具有固定格式的大文件,您可能会从映射文件中得到一些东西。我只使用 C 而不是 Python 完成了此操作,但似乎映射文件然后直接访问适当的字段可能会相当有效。

于 2011-02-26T21:46:43.930 回答
3

平面文件不适合您尝试执行的操作。我的建议是将文件转换为 SQL 数据库(使用 sqlite3),然后只读取您想要的列。SQLite3 非常快。

于 2011-02-26T21:49:00.683 回答
1

如果它是真正的固定宽度,那么您应该能够调用 read(N) 以跳过从一行的列末尾到下一行的开头的固定字节数。

于 2011-02-26T21:53:53.627 回答