[英]Python - two strings appear to be equal but are not
我試圖弄清楚為什么在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']
訪問它時,出現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
的復制值(左)與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'
您應該看一下誘變劑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') #
©
檢查key
變量的類型。 鍵可能不是strings
。
事實證明,所討論密鑰中的兩個字符具有“異常” ASCII值。 當我有字符串'c'時,python假定我是指ASCII值為99的字符,而誘變劑創建的數據結構中的'c'字符使用ASCII值169。
我只需要使用ord
確定字符串中各個字符的ASCII值,然后使用它們使用chr
為鍵'cnam'構建正確的字符串。
>>> 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值已與所討論的字符串的ASCII值匹配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.