Python随机访问文件

时间:2011-02-15 02:18:31

标签: python file file-io large-files random-access

是否有Python文件类型用于访问随机行而不遍历整个文件?我需要在一个大文件中搜索,将整个内容读入内存是不可能的。

任何类型或方法都将受到赞赏。

7 个答案:

答案 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数据库中。查询。

相关问题