python :相同的性格,不同的行为
python :same character, different behavior
我正在从使用 Python 2.7.9 从 postgres 数据库中提取的列表生成文件名。在此列表中有带有特殊字符的单词。通常我使用 ''.join()
来记录名称并将其发送到我的加载器,但我只有一个名称需要被识别。 .py 设置为 utf-8 编码,但单词是葡萄牙语,我认为是 latin-1 编码。
from pydub import AudioSegment
from pydub.playback import play
templist = ['+ Orégano','- Búfala','+ Rúcola']
count_ins = (len(templist)-1)
while (count_ins >= 0 ):
kot_istructions = AudioSegment.from_ogg('/home/effe/voice_orders/Voz/'+"".join(templist[count_ins])+'.ogg')
count_ins-=1
play(kot_istructions)
已加载前两个文件:
/home/effe/voice_orders/Voz/+ Orégano.ogg
/home/effe/voice_orders/Voz/- Búfala.ogg
第三个应该是:
/home/effe/voice_orders/Voz/+ Rúcola.ogg
但是 python 正在尝试加载
/home/effe/voice_orders/Voz/+ R\xc3\xbacola.ogg
为什么只有这个?我尝试使用 normalize()
删除重音,但由于这是一个字符串,该方法不起作用。
打印效果很好,作为数据库更新。只是文件名创建不能按预期工作。
建议?
看来根本原因可能是这些名称的编码在您的数据库中不一致。
如果你运行:
>>> 'R\xc3\xbacola'.decode('utf-8')
你得到
u'R\xfacola'
这实际上是一个 Python unicode
,正确地代表了名字。那你该怎么办?虽然这是一种非常不干净的编程风格,但您可以玩 .encode()/.decode()
whackamole,您 try
使用 utf-8
从您的数据库中解码原始字符串,如果失败, latin-1
。它看起来像这样:
try:
clean_unicode = dirty_string.decode('utf-8')
except UnicodeDecodeError:
clean_unicode = dirty_string.decode('latin-1')
作为一般规则,始终在您自己的源代码中使用干净的 unicode 对象,并且仅在保存时转换为编码。另外,不要让人们在没有指定编码的情况下将数据插入数据库,因为这首先会阻止你遇到这个问题。
希望对您有所帮助!
已解决:文件有问题。删除并重新构建它就可以了。
我正在从使用 Python 2.7.9 从 postgres 数据库中提取的列表生成文件名。在此列表中有带有特殊字符的单词。通常我使用 ''.join()
来记录名称并将其发送到我的加载器,但我只有一个名称需要被识别。 .py 设置为 utf-8 编码,但单词是葡萄牙语,我认为是 latin-1 编码。
from pydub import AudioSegment
from pydub.playback import play
templist = ['+ Orégano','- Búfala','+ Rúcola']
count_ins = (len(templist)-1)
while (count_ins >= 0 ):
kot_istructions = AudioSegment.from_ogg('/home/effe/voice_orders/Voz/'+"".join(templist[count_ins])+'.ogg')
count_ins-=1
play(kot_istructions)
已加载前两个文件:
/home/effe/voice_orders/Voz/+ Orégano.ogg
/home/effe/voice_orders/Voz/- Búfala.ogg
第三个应该是:
/home/effe/voice_orders/Voz/+ Rúcola.ogg
但是 python 正在尝试加载
/home/effe/voice_orders/Voz/+ R\xc3\xbacola.ogg
为什么只有这个?我尝试使用 normalize()
删除重音,但由于这是一个字符串,该方法不起作用。
打印效果很好,作为数据库更新。只是文件名创建不能按预期工作。
建议?
看来根本原因可能是这些名称的编码在您的数据库中不一致。
如果你运行:
>>> 'R\xc3\xbacola'.decode('utf-8')
你得到
u'R\xfacola'
这实际上是一个 Python unicode
,正确地代表了名字。那你该怎么办?虽然这是一种非常不干净的编程风格,但您可以玩 .encode()/.decode()
whackamole,您 try
使用 utf-8
从您的数据库中解码原始字符串,如果失败, latin-1
。它看起来像这样:
try:
clean_unicode = dirty_string.decode('utf-8')
except UnicodeDecodeError:
clean_unicode = dirty_string.decode('latin-1')
作为一般规则,始终在您自己的源代码中使用干净的 unicode 对象,并且仅在保存时转换为编码。另外,不要让人们在没有指定编码的情况下将数据插入数据库,因为这首先会阻止你遇到这个问题。
希望对您有所帮助!
已解决:文件有问题。删除并重新构建它就可以了。