20

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

任何类型或方法将不胜感激。

4

7 回答 7

20

这似乎只是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.  
于 2011-02-15T03:58:01.457 回答
9

您可以使用linecache

import linecache
print linecache.getline(your_file.txt, randomLineNumber) # Note: first line is 1, not 0
于 2014-07-17T16:50:52.393 回答
6

由于行可以是任意长度,因此如果不遍历整个文件,您真的无法获得随机行(无论您的意思是“编号实际上是随机的行”还是“由我选择的任意编号的行”) .

如果 kinda-sorta-random 就足够了,您可以寻找文件中的随机位置,然后向前读取,直到遇到行终止符。但是,如果您想找到(例如)第 1234 行,那将是无用的,并且如果您实际上想要随机选择的行,则会对行进行非均匀采样。

于 2011-02-15T02:22:14.580 回答
2

文件对象有一个 seek 方法,它可以为该文件中的特定字节取一个值。为了遍历大文件,遍历它并检查每一行中的值。迭代文件对象不会将整个文件内容加载到内存中。

于 2011-02-15T02:20:46.450 回答
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()
于 2011-02-15T02:43:07.627 回答
1

File 对象支持seek,但请确保将它们作为二进制文件打开,即“rb”。

您可能还希望使用 mmap 模块进行随机访问,尤其是在数据已经是内部格式的情况下。

于 2011-02-15T02:45:13.120 回答
1

有固定长度的记录吗?如果是这样,是的,您可以使用 seek 实现二进制搜索算法。

否则,将您的文件加载到 SQLlite 数据库中。查询那个。

于 2011-02-15T04:36:22.450 回答