2011-02-26 43 views
2

我有兴趣以尽可能高效的方式阅读Python中的固定宽度文本文件。具体而言,大部分时间我对平面文件中的一列或多列感兴趣,但对整个记录没有兴趣。将平面文件作为转置读取,python

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

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

回答

4

文件被排列为(一维)位序列。 'Lines'只是我们添加的一种便利,可以让人们更容易阅读。所以,一般来说,你所要求的在纯文件上是不可能的。为了解决这个问题,您需要一些方法来查找记录的起始位置。最常用的两种方法是:

  • 搜索换行符号(换句话说,读取整个文件)。
  • 使用特殊间隔的布局,以便每个记录都使用固定的布局布置。这样,您可以使用低级文件操作(如seek)直接转到您需要的位置。这样可以避免读取整个文件,但手动操作很麻烦。

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

关于“固定宽度”的注意事项:“你究竟是什么意思?如果你的意思是'每列始终以相对于记录开始的相同偏移量开始',那么你肯定可以使用Python's seek来跳过你不感兴趣的数据。

3

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

对于具有固定格式的大文件,您可能会从mmapping文件中获得某些内容。我只用C而不是Python来完成这项工作,但似乎是将文件映射到文件,然后直接访问相应的字段可能会相当有效。

+0

由于指针的存在,mmapping看起来很有前途 – 2011-02-26 22:48:04

3

平面文件不适合您正在尝试做的事情。我的建议是将文件转换为SQL数据库(使用sqlite3),然后只读你想要的列。 SQLite3正在快速发展。

+0

我同意。平面文件永远不是理想的。我正在尝试使用普查和其他数据源提供的平面文件。我试图避免不必要的读取操作。把整个文件扔进sql是可能的,但是考虑到文件的大小,这可能不太理想。能够只将一部分文件转换为sql更好。 – 2011-02-26 22:46:40

1

如果它是真正的固定宽度,那么你应该可以直接调用read(N)来跳过固定数量的字节,从一行的结尾到另一行的开始。

相关问题