如何使用Python中的LINECACHE读取文本文件呢?
阅读更多:Python 教程
解决方案…
linecache模块实现了一个缓存,将文件的内容解析为单独的行保存在内存中。linecache模块通过在列表中索引返回行,可以节省反复读取文件并解析行来查找所需行的时间。
当从同一文件中查找多行时,lincecache模块非常有用。
准备测试数据,可以通过在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.
"""
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:创建一个临时文件。
mkstemp()和mkdtemp()来创建临时文件和临时目录
args: None
return: 临时文件名。
"""
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)
#创建一个具有ipsum数据的文件。
filename = make_tempfile()
print(f"Output \n {filename}")
#从源文件中选取行。
split_line = '\n'
print(f"*** 直接从源文件中显示前5行 \n {text.split(split_line)[4]}" )
#从缓存中选出相同的行
print(f" \n *** 从缓存中显示前5行 \n {linecache.getline(filename, 5)}" )
# 通过使用unlink清理tempfile
cleanup(filename)
输出
C:\Users\sasan\PycharmProjects\blog\TutorialPoints\Updated_Code\tmpazax_yne
*** 直接从源文件中显示前5行
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.
*** 从缓存中显示前5行
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
#创建一个具有ipsum数据的文件。
filename = make_tempfile()
print(f"Output \n {filename}")
#空行包括换行符。
print(f"\n *** 文本中的行数为13。" )
print(" \n *** 显示Linecache中的最后一行,应该是一个新行\n {!r}".format(linecache.getline(filename, 8)) )
cleanup(filename)
输出
C:\Users\sasan\PycharmProjects\blog\TutorialPoints\Updated_Code\tmp352zirvn
*** 文本中的行数为13。
*** 显示Linecache中的最后一行,应该是一个新行
'\n'
5. 结论 – 当一个应用程序需要随机访问文件时,linecache可以通过行号轻松读取行。文件的内容保留在缓存中,因此要注意内存消耗。
极客教程