我有兴趣以尽可能高效的方式在Python中读取固定宽度的文本文件。具体来说,大多数时候我对平面文件中的一个或多个列感兴趣但不是整个记录。
一次读取文件并在将整行读入内存后提取所需的列,这对我来说效率低下。我想我宁愿选择只读取所需的列,从上到下,从左到右(而不是从左到右,从上到下阅读)。
这样的事情是否可取,如果可以,是否可能?
答案 0 :(得分:4)
文件布局为(一维)比特序列。 “线条”只是我们添加的便利,使人们可以轻松阅读。所以,一般来说,普通文件无法提出要求。要解决此问题,您需要一些方法来查找记录的开始位置。最常见的两种方式是:
seek
)直接转到需要的位置。这样可以避免读取整个文件,但手动操作很痛苦。我不会太担心文件阅读性能,除非它成为一个问题。是的,您可以将内存映射到该文件,但您的操作系统可能已经为您缓存了。是的,您可以使用数据库格式(例如,通过sqlalchemy的sqlite3文件格式),但它可能不值得麻烦。
关于“固定宽度:”的旁注你到底是什么意思?如果你的意思是“每一列总是以相对于记录开头的相同偏移量开始”,那么你绝对可以使用Python's seek
跳过过去你不感兴趣的数据。
答案 1 :(得分:3)
线条有多大?除非每个记录都是巨大的,否则只有阅读您感兴趣的领域而不是整条记录,这可能几乎没有什么区别。
对于具有固定格式的大文件,您可能会从mmapping文件中获取一些内容。我只使用C而不是Python来完成此操作,但它似乎正在映射文件,然后直接访问相应的字段可能会相当有效。
答案 2 :(得分:3)
平面文件不适合您尝试做的事情。我的建议是将文件转换为SQL数据库(使用sqlite3),然后只读取所需的列。 SQLite3非常快。
答案 3 :(得分:1)
如果它是真正的固定宽度,那么你应该能够只调用read(N)跳过从一行末尾的列末端到下一行的开头的固定字节数。