Python - 两个字符串看起来相同但不是

时间:2018-01-27 15:10:47

标签: python string mutagen

我试图弄清楚为什么在python中看起来相同的两个字符串不相等。似乎有一个类似的问题Why are my two python strings not equal in my program but equal in the interpreter?,但这并没有解决我的问题。在上面这篇文章中,问题显然是在一个字符串末尾的新行,而不是另一个字符串。

我正在编写一个脚本来整理音乐集中的音乐文件。我正在使用mutagen来读取文件元数据。我遇到.m4p文件的问题。我用

import mutagen
metadata = mutagen.File(“audio.m4p”)

获取文件元数据的字典。我通过

查看字典中的键
for key in metadata.keys(): print(key)

返回

----:com.apple.iTunes:tool
----:com.apple.iTunes:iTunNORM
cnam
cART
aART
cwrt
calb
cgen
trkn
disk
cday
cpil
pgap
apID
cprt
cnID
rtng
atID
cmID
plID
geID
sfID
akID
stik
purd
----:com.apple.iTunes:iTunMOVI
covr

'cnam'似乎是包含文件标题的dict项的索引。但是,当我尝试使用mutagen[‘cnam’]访问它时,我得到KeyError: 'cnam'

困惑,然后我将此键分配给带有

的变量
the_key = list(metadata.keys())[2]

帮助收集信息。我做了以下事情:

>>> the_key=='cnam'
False
>>> the_key[0]=='c'
False
>>> the_key[1]=='n'
True
>>> the_key[2]=='a'
True
>>> the_key[2]=='m'
False

以下测试了the_key从命令行(左)和手动键入的版本看起来是关键(右)

的复制值的相等性
>>> 'cnam'=='cnam'
True
发现他们是平等的。

似乎存在某种我不理解的文本格式问题。我假设有些字符看起来相同但实际上并非如此,但我似乎无法通过复制和粘贴来证明这一点。

我的问题是:这里有什么问题,我该如何解决?我可以想象一个涉及操纵字典或其他东西的工作,但我宁愿弄清楚手头的问题。

编辑:假设mutagen.File返回了一个字典,我错了。它返回一个<class 'mutagen.mp4.MP4'>对象。

编辑:

len(the_key) 
4

编辑:

type(the_key)
<class 'str'>

编辑:

>>> print("<{}>".format(the_key))
<cnam>
>>> print(repr(the_key))
'cnam'

3 个答案:

答案 0 :(得分:0)

你应该看一下mutagen api:

https://mutagen.readthedocs.io/en/latest/api/mp4.html

  

类mutagen.mp4.MP4Tags
  基础:mutagen._util.DictProxy,mutagen.Tags

     

包含Apple iTunes元数据列表键/值的词典。

     

键是四字节标识符,自由形式(' - ')键除外。   值通常是unicode字符串,但有些原子具有特殊性   结构:

     

文本值(支持每个键的多个值):

     

'\ xa9nam' - 曲目标题
  '\ xa9alb' - 专辑
  '\ xa9ART' - 艺术家    等

print ( '\xa9')   #  

<强>©

答案 1 :(得分:0)

检查key变量的类型。密钥可能不是strings

答案 2 :(得分:0)

事实证明,关键字中的两个字符有&#34;不常见&#34; ASCII值。当我有一个字符串&#39; c&#39;时,python假设我指的是ASCII值为99的字符,而&#39; c&#39; mutagen创建的数据结构中的字符使用ASCII值169。

我只需要使用ord确定字符串各个字符的ASCII值,然后使用它们为密钥“cnam”构建正确的字符串。使用chr

>>> the_key == 'cnam'
False
>>> ord(the_key[0])
169
>>> ord(the_key[3])
109
>>> new_key = chr(169)+'na'+chr(109)
>>> new_key
'cnam'
>>> new_key == the_key
True

我没有检查字符的ASCII值&#39; n&#39;和&#39; a&#39;因为在问题中显示&#34;默认&#34; &#39; n&#39;的ASCII值和&#39; a&#39;已经匹配了相关字符串的那些。