2011-02-26 47 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)來跳過固定數量的字節,從一行的結尾到另一行的開始。

相關問題