如何在文件中查找子串?

1 投票
4 回答
5000 浏览
提问于 2025-04-16 23:33

如何仅使用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 个回答

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
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

你可以通过字符串的查找方法来找到一个子字符串。

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

使用 read(1) 方法完全没有意义。 #见编辑

编辑: 对内存来说更高效

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) 其实并不是那么没有意义。

撰写回答