从文件内容返回索引位置

时间:2013-02-28 17:48:37

标签: php python python-3.x

我正在尝试从WAV文件返回索引位置。

如果在大海捞针中发现针头内容,那么我需要在大海捞针中返回指针的位置。

haystack = open("haystack.wav",'r').read()
needle = open("needle.wav",'r').read()

print(haystack.index(needle[:46]));

我收到错误:

Traceback (most recent call last):
  File "test.py", line 1, in <module>
    haystack = open("haystack.wav",'r').read()
  File "C:\Python33\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8f in position 5: character maps to <undefined>

当我在PHP中执行此操作时:

$needle = file_get_contents("needle.wav", false, null, 46);
$haystack = file_get_contents("haystack.wav");
echo strpos($haystack,$needle);

3 个答案:

答案 0 :(得分:3)

如果您在Python 3下使用'rb'将文件读作 binary ,您将获得bytes个对象。然后,您可以使用.index

haystack = open("haystack.wav", 'rb').read()
needle = open("needle.wav", 'rb').read()

print(haystack.index(needle[:46]))

示例:

>>> b'hello world'.index(b'world')
6
>>> b'hello world'.index(b'goodbye')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: substring not found

答案 1 :(得分:0)

由于python将字节与int交换的方式取决于它们在对象中的访问方式,因此这有点混乱。 Here is a bit about that。我通过将mp3文件两次写入新文件来测试它。一个观察结果是,如果针中有元数据,则需要在与较长文件比较之前将其剥离。在我的情况下,针头已经“编码为跛脚#...”。如果你要将整个mp3与更长的mp3相匹配,就不会有匹配。

def findneedle(bin1, bin2):
  with open(bin2,'rb') as haystack:
    with open(bin1,'rb') as needle:
      n = needle.read()
      h = []
      EOF = None
      while EOF != b'':
        EOF = haystack.read(1000)
        h.append(EOF)
        if (n in b''.join(h)):
          h = h[:-1]
          haystack.seek(haystack.tell() - 1000)
          while EOF != b'':
            EOF = haystack.read(1)
            h.append(EOF)
            if (n in b''.join(h)):
              return haystack.tell() - len(n)

index = findneedle('a.mp3','b.mp3')

答案 2 :(得分:-1)

haystack = open("haystack.wav",'rb').read()就足够了。但是,我从未尝试在php中读取.wav文件,因此我不知道python和php是否具有相同的二进制编码结构。

>>> a = open("A24.wav", "rb").read()
>>> a[:100]
'RIFF\xf4\xe9\x01\x00WAVEfmt \x10\x00\x00\x00\x01\x00\x01\x00D\xac\x00\x00\x88X\x01\x00\x02\x00\x10\x00data\xd0\xe9\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xfe\xff\x04\x00\xfc\xff\x04\x00\xfc\xff\x02\x00\x00\x00\xfe\xff\x04\x00\xfb\xff\x05\x00\xfc\xff\x02\x00\xff\xff\x00\x00\x01\x00\xfe\xff\x04\x00'
>>> 

并且你想在'haystack'中找到与'needle'中的字符串匹配的字符串索引,你可以使用正则表达式来执行它:

import re

haystack = open("haystack.wav", "rb").read()
needle = open("needle.wav", "rb").read()

regex = re.compile(needle[:46])
match = regex.search(haystack)

if match:
    print match.start()