簡體   English   中英

python跳轉到txt文件中的一行(一個gzipped)

[英]python jump to a line in a txt file (a gzipped one)

我正在閱讀一個大文件並進行處理。 我希望能夠跳到文件的中間,而不需要花費很長時間。

現在我在做:

f = gzip.open(input_name)
for i in range(1000000):
    f.read() # just skipping the first 1M rows

for line in f:
    do_something(line)

是否有更快的方法來跳過壓縮文件中的行? 如果我必須首先解壓縮它,我會這樣做,但必須有一種方法。

它當然是一個文本文件, \\n分隔行。

gzipping的本質是當壓縮文件時不再存在行的概念 - 它只是一個二進制blob。 看看這個解釋gzip的作用。

要讀取文件,您需要對其進行解壓縮 - gzip模塊可以很好地完成它。 像其他答案一樣,我也建議使用itertools進行跳躍,因為它會仔細確保你不會把東西拉進記憶中,它會盡快讓你到達那里。

with gzip.open(filename) as f:
    # jumps to `initial_row`
    for line in itertools.slice(f, initial_row, None):
        # have a party

或者,如果這是您要使用的CSV,您也可以嘗試計時pandas解析,因為它可以處理解壓縮gzip 這看起來像: parsed_csv = pd.read_csv(filename, compression='gzip')

另外,要清楚一點,當你在python中迭代文件對象時 - 就像上面的f變量一樣 - 你遍歷行。 您不需要考慮'\\ n'字符。

你可以使用itertools.islice ,傳遞一個文件對象f和起點,它仍然可以推進迭代器,但比下一次調用1000000次更有效:

from itertools import islice

for line in islice(f,1000000,None):
     print(line)

不太熟悉gzip,但我想f.read()會讀取整個文件,因此接下來的999999調用什么都不做。 如果你想手動推進迭代器,你可以在文件對象上調用next,即next(f)

調用next(f)並不意味着所有行都會立即讀入內存,它會一次使迭代器前進一行,所以如果你想跳過文件或標題中的一行或兩行,它就會很有用。

作為@wwii建議食譜的消費食譜也值得一試

並不是的。

如果您知道要跳過的字節數,可以在文件對象上使用.seek(amount) ,但是為了跳過多行,Python必須逐字節地遍歷文件以計算換行符。

我想到的唯一選擇是,如果你處理某個靜態文件,那就不會改變。 在這種情況下,您可以將其編入索引一次,即找出並記住每一行的位置。 如果您在例如字典中保存並加載了pickle ,則可以使用seek在准恆定時間內跳過它。

無法在gzip文件中隨機搜索。 Gzip是一種流算法,因此必須始終從一開始就解壓縮,直到您感興趣的數據所在。

如果沒有索引,則無法跳轉到特定行。 可以向前掃描行,或者以連續的塊從文件末尾向后掃描行。

您應該根據需要考慮不同的存儲格式。 你有什么需求?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM