0

我试图弄清楚为什么在 python 中看起来相等的两个字符串不相等。似乎有一个类似的问题发布为什么我的两个 python 字符串在我的程序中不相等但在解释器中相等?但这并不能解决我的问题。在上面的这篇文章中,问题显然是一个字符串末尾的新行,而不是另一个字符串。

我正在编写一个脚本来组织我的音乐收藏中的音乐文件。我正在使用诱变剂读取文件元数据。我遇到了 .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

发现他们是平等的。

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

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

编辑:我假设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'
4

3 回答 3

1

事实证明,所讨论的键中的两个字符具有“异常”的 ASCII 值。当我有一个字符串“c”时,python 假设我指的是 ASCII 值为 99 的字符,而由 mutagen 创建的数据结构中的“c”字符使用 ASCII 值 169。

我只需要确定字符串中单个字符的 ASCII 值,ord并使用它们为键“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

我不必检查字符“n”和“a”的 ASCII 值,因为问题中显示“n”和“a”的“默认”ASCII 值已经与相关字符串的值匹配。

于 2018-01-27T15:54:45.120 回答
0

检查key变量的类型。钥匙不太strings可能。

于 2018-01-27T15:21:40.993 回答
0
于 2018-01-27T15:18:37.540 回答