用Python转置读取平面文件

2 投票
4 回答
897 浏览
提问于 2025-04-16 12:36

我想在Python中高效地读取固定宽度的文本文件。具体来说,我通常只对文件中的一列或多列感兴趣,而不是整行数据。

我觉得一行一行地读取文件,然后再从整行中提取我想要的列,这样做效率不高。我更希望能直接选择只读取我需要的列,从上到下、从左到右读取,而不是先从左到右再从上到下。

这样做是否有必要?如果有,这样做可能吗?

4 个回答

3

这些行有多大呢?如果每条记录都不大,那么只读取你感兴趣的字段,而不是整行,可能不会有什么太大区别。

对于格式固定的大文件,你可以尝试使用内存映射来处理文件。我之前只在C语言中做过这个,但看起来用内存映射文件,然后直接访问相关字段,效率应该还不错。

3

平面文件不太适合你想做的事情。我建议你把这些文件转换成SQL数据库(可以用sqlite3),然后只读取你需要的那些列。SQLite3的速度非常快。

4

文件其实是由一串比特(0和1)组成的。我们说的“行”只是为了方便人类阅读而加上的一种格式。所以,通常来说,你想要的在普通文件上是做不到的。要实现这个功能,你需要找到记录开始的位置。最常见的两种方法是:

  • 搜索换行符(也就是说,读取整个文件)。
  • 使用固定宽度的布局,这样每条记录都有固定的长度。这样,你就可以用一些低级的文件操作,比如 seek,直接跳到你需要的位置。这种方法避免了读取整个文件,但手动操作起来会很麻烦。

除非文件读取的速度真的成了问题,否则我建议你不用太担心性能。是的,你可以把文件映射到内存中,但你的操作系统可能已经为你做了缓存。是的,你可以使用数据库格式(比如通过 sqlalchemy 的sqlite3文件格式),但这样做可能不太值得。

关于“固定宽度”的小提示:你具体指的是什么呢?如果你是说“每一列总是从记录的同一位置开始”,那么你可以使用 Python的 seek 来跳过你不感兴趣的数据。

撰写回答