我正在尝试从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);
答案 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()