0

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

3 回答 3

3

如果您在 Python 3 下使用二进制文件读取文件,您将获得对象。然后你可以使用:'rb'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
于 2013-02-28T18:54:12.430 回答
0

这有点混乱,因为 python 将字节与整数交换的方式取决于它们在对象中的访问方式。 这里有一点。我通过将 mp3 文件两次写入新文件来测试这一点。一项观察是,如果您的针中有元数据,则需要在与更长的文件进行比较之前将其剥离。在我的例子中,needle 已经“用蹩脚的 #... 编码”。如果您要将整个 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')
于 2013-02-28T19:58:22.083 回答
-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()
于 2013-02-28T18:18:58.230 回答