如何在文件中找到子字符串?

时间:2011-08-13 19:52:34

标签: python

如何仅使用read(1)在二进制文件中查找字符串? 例如,我想在文件中找到字符串'abst'的位置(没有加载到内存中)? 这是工作,但非常原始:

#!/usr/bin/python2
f = open("/tmp/rr", "rb")
f.seek(0)

cont = 1
while(cont):
    a1 = f.read(1)
    if a1 == 'a':
        a2 = f.read(1)
        if a2 == 'b':
            a3 = f.read(1)
            if a3 == 's':
                a4 = f.read(1)
                if a4 == 't':
                    found = True
                    cont = 0

4 个答案:

答案 0 :(得分:4)

使用mmap搜索具有恒定内存要求的文件:

import mmap
with open('/tmp/rr', 'rb') as f:
  m = mmap.mmap(f.fileno(), 0, mmap.MAP_PRIVATE, mmap.PROT_READ)
  position = m.index('abst')

答案 1 :(得分:2)

这对你有用吗?

#!/usr/bin/python

string = "abst"
f = open("/tmp/rr", "rb")
f.seek(0)

cont = 1
idx = 0
while True:
    c = f.read(1)
    if c == '':
        break
    if c == string[idx]:
        idx += 1
    elif c == string[0]:
        idx = 1
    else:
        idx = 0
    if idx == len(string):
        print "Found"
        break

答案 2 :(得分:1)

您可以使用字符串find-method找到子字符串。

content = file.read()
name = 'abst'
if name in content:
    slice = content.find(name)
    slice = slice, slice + len(name)

read(1) - 方法绝对没有意义。 #see edit

编辑:对内存更有效率

def find(file, name):
    length = len(name)
    part = file.read(length)
    i = 0
    while True:
        if part == name:
            break
        char = file.read(1)
        if not char:
            return
        part = part[1:] + char
        i += 1
    return i, i + length, part

我知道,使用read(1)并非毫无意义。

答案 3 :(得分:0)

如果你的文件大部分都是'a',或者你正在搜索的字符串中的第一个字符对应的任何字符,这个算法会耗费大量时间,否则效果会非常好。

check = 'abst'
col=1
row=1
location = (-1, -1)

with open("/tmp/rr", 'rb') as p:
    ch = p.read(1)
    while(ch != ""):
        if ch == check[0]:
            st = p.read(len(check)-1)
            if ch+st == check:
                location = (row, col)
                break
            else:
                p.seek(-len(check)+1, 1)

        ch = p.read(1)
        col+=1

        if ch == '\n':
            col=0
            row+=1

print("loc: {}, {}".format(*location))