如何使用Python中的LINECACHE讀取文字檔案


解決方案…

linecache模組實現了一個快取,它將檔案的內容解析成單獨的行,並儲存在記憶體中。linecache模組透過索引列表來返回行,這比重複讀取檔案和解析行來查詢所需行節省了時間。

當需要從同一個檔案中查詢多行時,linecache模組非常有用。

準備測試資料。您可以使用Google搜尋示例文字獲得此文字。

Lorem ipsum dolor sit amet, causae apeirian ea his, duo cu congue prodesset. Ut epicuri invenire duo, novum ridens eu has, in natum meliore noluisse sea. Has ei stet explicari. No nam eirmod deterruisset, nusquam electram rationibus ad sea, interesset delicatissimi et sit. Purto molestiae cu eum, in per hinc periculis intellegam.

Id porro facete cum. No est veritus detraxit facilisis, sit ea clita decore essent. Ut eam labores fuisset menandri, ex sit brute viderer eleifend, altera argumentum vel ex. Duo at zril sensibus, eu vim ullum assentior, quando possit at his.

Te nam tempor posidonium scripserit, eam mundi reprimique dissentias ne. Vim te soleat offendit democritum. Nam an diam elaboraret, quaeque dissentias an has. Autem legendos dignissim ad vis, sea ex amet petentium reprehendunt, inermis constituam philosophia ne mel. Esse noster lobortis usu ne.

Nec reque postea urbanitas ut, mea in nulla invidunt ocurreret. Ei duo iuvaret numquam. Ferri nemore audire te est, mel et detracto noluisse. Nec eu habeo justo, id pro posse apeirian volutpat. Mea sonet quaestio ne.

Atqui quaeque alienum te vim. Graeco aliquip liberavisse pro ut. Te similique reformidans usu, te mundi aliquando ius. Meis scripta minimum quo no, meis prima fabellas eu eam, laoreet delicata forensibus ut vim. Et quo vocibus mediocritatem, atqui summo an eam.

示例

import os
import tempfile

text = """
Lorem ipsum dolor sit amet, causae apeirian ea his, duo cu congue prodesset. Ut epicuri invenire duo, novum ridens eu has, in natum meliore noluisse sea. Has ei stet explicari. No nam eirmod deterruisset, nusquam electram rationibus ad sea, interesset delicatissimi et sit. Purto molestiae cu eum, in per hinc periculis intellegam.

Id porro facete cum. No est veritus detraxit facilisis, sit ea clita decore essent. Ut eam labores fuisset menandri, ex sit brute viderer eleifend, altera argumentum vel ex. Duo at zril sensibus, eu vim ullum assentior, quando possit at his.

Te nam tempor posidonium scripserit, eam mundi reprimique dissentias ne. Vim te soleat offendit democritum. Nam an diam elaboraret, quaeque dissentias an has. Autem legendos dignissim ad vis, sea ex amet petentium reprehendunt, inermis constituam philosophia ne mel. Esse noster lobortis usu ne.

Nec reque postea urbanitas ut, mea in nulla invidunt ocurreret. Ei duo iuvaret numquam. Ferri nemore audire te est, mel et detracto noluisse. Nec eu habeo justo, id pro posse apeirian volutpat. Mea sonet quaestio ne.

Atqui quaeque alienum te vim. Graeco aliquip liberavisse pro ut. Te similique reformidans usu, te mundi aliquando ius. Meis scripta minimum quo no, meis prima fabellas eu eam, laoreet delicata forensibus ut vim. Et quo vocibus mediocritatem, atqui summo an eam.

"""

1. 建立一個函式來建立臨時檔案並在使用後刪除它。

def make_tempfile():
"""
Function: Create a temporary file.
mkstemp() and mkdtemp() to create temporary files and directories

args: None

return: Temp file name.
"""
fd, temp_file = tempfile.mkstemp()
os.close(fd)

with open(temp_file, 'wt') as f:
f.write(text)

return temp_file

def cleanup(temp_file):
os.unlink(temp_file)

3. 使用linecache讀取特定行。linecache模組讀取檔案的行號從1開始,不像列表那樣從0開始索引陣列。記住這一點很重要。

import os
import tempfile
import linecache

text = """
Lorem ipsum dolor sit amet, causae apeirian ea his, duo cu congue prodesset. Ut epicuri invenire duo, novum ridens eu has, in natum meliore noluisse sea. Has ei stet explicari. No nam eirmod deterruisset, nusquam electram rationibus ad sea, interesset delicatissimi et sit. Purto molestiae cu eum, in per hinc periculis intellegam.

Id porro facete cum. No est veritus detraxit facilisis, sit ea clita decore essent. Ut eam labores fuisset menandri, ex sit brute viderer eleifend, altera argumentum vel ex. Duo at zril sensibus, eu vim ullum assentior, quando possit at his.

Te nam tempor posidonium scripserit, eam mundi reprimique dissentias ne. Vim te soleat offendit democritum. Nam an diam elaboraret, quaeque dissentias an has. Autem legendos dignissim ad vis, sea ex amet petentium reprehendunt, inermis constituam philosophia ne mel. Esse noster lobortis usu ne.

Nec reque postea urbanitas ut, mea in nulla invidunt ocurreret. Ei duo iuvaret numquam. Ferri nemore audire te est, mel et detracto noluisse. Nec eu habeo justo, id pro posse apeirian volutpat. Mea sonet quaestio ne.

Atqui quaeque alienum te vim. Graeco aliquip liberavisse pro ut. Te similique reformidans usu, te mundi aliquando ius. Meis scripta minimum quo no, meis prima fabellas eu eam, laoreet delicata forensibus ut vim. Et quo vocibus mediocritatem, atqui summo an eam.
"""

def make_tempfile():
"""
Function: Create a temporary file.
mkstemp() and mkdtemp() to create temporary files and directories

args: None

return: Temp file name.
"""
directory = os.getcwd()
fd, temp_file = tempfile.mkstemp(dir=directory)
os.close(fd)

with open(temp_file, 'wt') as f:
f.write(text)

return temp_file

def cleanup(temp_file):
os.unlink(temp_file)

# Make a file with ipsum data.
filename = make_tempfile()
print(f"Output \n {filename}")

split_line = '\n'

# Pick the lines from source.

print(f"*** Displaying first 5 lines directly from the source \n {text.split(split_line)[4]}" )

# pick out the same line from cache
print(f" \n *** Displaying first 5 lines from the cache \n {linecache.getline(filename, 5)}" )

# cleanup the tempfile by using unlink
cleanup(filename)

輸出

C:\Users\sasan\PycharmProjects\blog\TutorialPoints\Updated_Code\tmpazax_yne
*** Displaying first 5 lines directly from the source
Id porro facete cum. No est veritus detraxit facilisis, sit ea clita decore essent. Ut eam labores fuisset menandri, ex sit brute viderer eleifend, altera argumentum vel ex. Duo at zril sensibus, eu vim ullum assentior, quando possit at his.

*** Displaying first 5 lines from the cache
Id porro facete cum. No est veritus detraxit facilisis, sit ea clita decore essent. Ut eam labores fuisset menandri, ex sit brute viderer eleifend, altera argumentum vel ex. Duo at zril sensibus, eu vim ullum assentior, quando possit at his.

4. linecache始終在行的末尾包含換行符。因此,如果該行為空,則返回值只是換行符。

見下文。

import linecache

# Make a file with ipsum data.
filename = make_tempfile()
print(f"Output \n {filename}")

# Blank lines include the newline.

print(f"\n *** The number of lines in the text is 13." )
print(" \n *** Displaying the lastline from Linecache which should be a new line\n {!r}".format(linecache.getline(filename, 8)) )

cleanup(filename)

輸出

C:\Users\sasan\PycharmProjects\blog\TutorialPoints\Updated_Code\tmp352zirvn

*** The number of lines in the text is 13.

*** Displaying the lastline from Linecache which should be a new line
'\n'

5. **結論 -** 當應用程式需要隨機訪問檔案時,linecache可以很容易地按行號讀取行。檔案的內容儲存在快取中,因此要注意記憶體消耗。

更新於:2020年11月9日

261 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.