如何仅使用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
答案 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))