如何在文件中查找子串?
如何仅使用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)
其实并不是那么没有意义。