是否有用于访问随机行而不遍历整个文件的 Python 文件类型?我需要在一个大文件中搜索,不可能将整个内容读入内存。
任何类型或方法将不胜感激。
是否有用于访问随机行而不遍历整个文件的 Python 文件类型?我需要在一个大文件中搜索,不可能将整个内容读入内存。
任何类型或方法将不胜感激。
这似乎只是mmap
设计的那种东西。一个mmap
对象创建一个到文件的类似字符串的接口:
>>> f = open("bonnie.txt", "wb")
>>> f.write("My Bonnie lies over the ocean.")
>>> f.close()
>>> f.open("bonnie.txt", "r+b")
>>> mm = mmap(f.fileno(), 0)
>>> print mm[3:9]
Bonnie
如果您想知道,mmap
还可以将对象分配给:
>>> print mm[24:]
ocean.
>>> mm[24:] = "sea. "
>>> print mm[:]
My Bonnie lies over the sea.
您可以使用linecache:
import linecache
print linecache.getline(your_file.txt, randomLineNumber) # Note: first line is 1, not 0
由于行可以是任意长度,因此如果不遍历整个文件,您真的无法获得随机行(无论您的意思是“编号实际上是随机的行”还是“由我选择的任意编号的行”) .
如果 kinda-sorta-random 就足够了,您可以寻找文件中的随机位置,然后向前读取,直到遇到行终止符。但是,如果您想找到(例如)第 1234 行,那将是无用的,并且如果您实际上想要随机选择的行,则会对行进行非均匀采样。
文件对象有一个 seek 方法,它可以为该文件中的特定字节取一个值。为了遍历大文件,遍历它并检查每一行中的值。迭代文件对象不会将整个文件内容加载到内存中。
是的,您可以轻松获得随机线。只需寻找文件中的随机位置,然后寻找开头,直到您点击 \n 或文件的开头,然后读取一行。
代码:
import sys,random
with open(sys.argv[1],"r") as f:
f.seek(0,2) # seek to end of file
bytes = f.tell()
f.seek(int(bytes*random.random()))
# Now seek forward until beginning of file or we get a \n
while True:
f.seek(-2,1)
ch = f.read(1)
if ch=='\n': break
if f.tell()==1: break
# Now get a line
print f.readline()
File 对象支持seek,但请确保将它们作为二进制文件打开,即“rb”。
您可能还希望使用 mmap 模块进行随机访问,尤其是在数据已经是内部格式的情况下。
有固定长度的记录吗?如果是这样,是的,您可以使用 seek 实现二进制搜索算法。
否则,将您的文件加载到 SQLlite 数据库中。查询那个。