用Python转置读取平面文件
我想在Python中高效地读取固定宽度的文本文件。具体来说,我通常只对文件中的一列或多列感兴趣,而不是整行数据。
我觉得一行一行地读取文件,然后再从整行中提取我想要的列,这样做效率不高。我更希望能直接选择只读取我需要的列,从上到下、从左到右读取,而不是先从左到右再从上到下。
这样做是否有必要?如果有,这样做可能吗?
4 个回答
3
这些行有多大呢?如果每条记录都不大,那么只读取你感兴趣的字段,而不是整行,可能不会有什么太大区别。
对于格式固定的大文件,你可以尝试使用内存映射来处理文件。我之前只在C语言中做过这个,但看起来用内存映射文件,然后直接访问相关字段,效率应该还不错。
3
平面文件不太适合你想做的事情。我建议你把这些文件转换成SQL数据库(可以用sqlite3),然后只读取你需要的那些列。SQLite3的速度非常快。
4
文件其实是由一串比特(0和1)组成的。我们说的“行”只是为了方便人类阅读而加上的一种格式。所以,通常来说,你想要的在普通文件上是做不到的。要实现这个功能,你需要找到记录开始的位置。最常见的两种方法是:
- 搜索换行符(也就是说,读取整个文件)。
- 使用固定宽度的布局,这样每条记录都有固定的长度。这样,你就可以用一些低级的文件操作,比如
seek
,直接跳到你需要的位置。这种方法避免了读取整个文件,但手动操作起来会很麻烦。
除非文件读取的速度真的成了问题,否则我建议你不用太担心性能。是的,你可以把文件映射到内存中,但你的操作系统可能已经为你做了缓存。是的,你可以使用数据库格式(比如通过 sqlalchemy 的sqlite3文件格式),但这样做可能不太值得。
关于“固定宽度”的小提示:你具体指的是什么呢?如果你是说“每一列总是从记录的同一位置开始”,那么你可以使用 Python的 seek
来跳过你不感兴趣的数据。