是否有Python文件类型用于访问随机行而不遍历整个文件?我需要在一个大文件中搜索,将整个内容读入内存是不可能的。
任何类型或方法都将受到赞赏。
答案 0 :(得分:14)
这似乎只是为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.
答案 1 :(得分:6)
由于线条可以是任意长度,你实际上无法获得随机线(无论你的意思是“一条数字实际上是随机的线条”还是“一条具有任意数字的线条,由我选择”)而无需遍历整个文件。
如果kinda-sorta-random足够,你可以在文件中寻找一个随机位置然后向前读取,直到你遇到一个行终止符。但是,如果你想找到(比方说)行号1234,这将是无用的,如果你真的想要一个随机选择的行,它会非均匀地采样行。
答案 2 :(得分:5)
您可以使用linecache:
import linecache
print linecache.getline(your_file.txt, randomLineNumber) # Note: first line is 1, not 0
答案 3 :(得分:1)
文件对象具有搜索方法,该方法可以将值传递给该文件中的特定字节。 对于遍历大文件,迭代它并检查每行中的值。迭代文件对象不会将整个文件内容加载到内存中。
答案 4 :(得分:1)
是的,您可以轻松获得随机线路。只需在文件中寻找一个随机位置,然后向前搜索,直到你点击文件的\ 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()
答案 5 :(得分:1)
File对象支持seek,但请确保将它们打开为二进制文件,即“rb”。
您可能还希望使用mmap模块进行随机访问,尤其是当数据已经采用内部格式时。
答案 6 :(得分:1)
有固定长度的记录吗?如果是,是的,您可以使用搜索实现二进制搜索算法。
否则,将文件加载到SQLlite数据库中。查询。