2011-08-13 24 views
1

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 

+2

ファイルに 'aabst'が含まれているとどうなりますか? –

+4

なぜ 'read(1)'だけを使いたいのですか?これは宿題ですか? – ecik

答えて

1

あなたは、文字列を見つける-メソッドを使用して部分文字列を見つけることができます。

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

read(1) -methodは絶対に無意味です。 #see編集

編集:私は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 

メモリのためのより多くのeffiecient。一定のメモリ要件を持つファイルを検索する

+0

この方法では、ファイルの量にメモリが必要です。これは、検索するだけではまったく必要ありません。 – phihag

+0

@philhag: 'mmap'アプローチもファイルをメモリに保存する必要はありませんか? –

+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') 
+0

'found'ではなく' position'で更新されました。文字列が見つからない場合、結果は-1になります。 – phihag

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 
0

あなたのファイルは、ほとんどの」で満たされている、またはあなたが探している文字列の最初の文字に対応してどのような文字、このアルゴは大きな時間を吸うだろう、そうでない場合はかなりうまく動作する場合。

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)) 
関連する問題