我试图弄清楚为什么在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'
答案 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;已经匹配了相关字符串的那些。