我用python(2.7(脚本从spotify读取拉丁语播放列表。
到目前为止,拉丁语 1 工作正常。
但后来我遇到了像 NG² 这样的名字,这使得它不再起作用
了。
这是错误消息:
...
Solo Fue Una Noche;NG²;Comienzos;9;2004 (printed by a print() cmd)
Traceback (most recent call last):
File "get_playlist-tracks.py", line 110, in <module>
ndt.write(line+"n").encode('latin-1')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 21-22: ordinal not in range(128)
我想,我需要拉丁语 1 和上标的组合代码。
这是正确的吗,有谁知道哪个是正确的?
感谢您的众多答案!
嗯,它有点复杂:
(同时(我有3个Win10(64位(安装(WinA,WinB,WinC(。
在WinA上(最古老的一个,2011年,从Win7迁移而来(,一切正常(Python3.4(在winB和WinC(最新的硬件,Python3.6(
上,curl cmd得到一个退出代码1,
没有人知道为什么。
由于我想摆脱旧的WinA并继续使用我的python脚本,所以我只是在VMWare Player12中的Fedora20来宾上
尝试这些脚本。
现在上标的这个问题只在 Fedora 系统上
(不在 WinA 上 - 由于卷曲问题,WinB 和 WinC 对我来说不再有任何意义(。
我在脚本中使用以下前 2 行:
#!/usr/bin/python3.3
# -*- coding: utf-8 -*-
仅当我尝试将此行(带有上标 2(写入文件时,才会出现错误:
print (line) # (works fine!)
ndt.write(line+"n") # (this one not!)
我也尝试使用 .decode('utf-8'( 和 .decode('latin-1'(编写命令,
但我总是收到相同的消息......
然后我尝试在 python 控制台中执行以下操作:
>>> line="Solo Fue Una Noche;NG²;Comienzos;9;2004"
>>> playlist_name = '/home/.../Python/PLLs/Sole_01a_tracks.txt'
>>> ndt = open(playlist_name, 'w')
>>> ndt.write(line+"n").decode('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute 'decode'
>>> ndt.write(line+"n")
40
>>> line
'Solo Fue Una Noche;NG²;Comienzos;9;2004'
>>> playlist_name
'/home/.../Python/PLLs/Sole_01a_tracks.txt'
>>> ndt.write(line)
39
代码
print ("playlist_contents_file:", playlist_name)
打印输出:
('playlist_contents_file:', u'/home/.../Python/PLLs/Sole_01a_tracks.txt')
问题不在于上标 2。它是拉丁语 1 字符xb2
,您不需要不同的编码。问题是你调用encode()
已经是 Latin-1 的字节串。
首先,了解encode()
采用 Unicode 字符串并将其转换为将字节值映射到 Unicode 代码点的某种表示形式。因此,要使用它,您必须在Unicode字符串上调用它。如果你在普通字符串上调用encode()
,Python 会先尝试将其强制使用 Unicode。
因为这是 Python 2,所以你的原始字符串 (line
( 是一个字节字符串,除非你告诉它编码是什么,否则不能可靠地强制到 Unicode。如果你不这样做,并选择默认强制,Python 假设ascii
.
所以你必须从latin-1
中解码它才能得到Unicode:
>>> line="Solo Fue Una Noche;NG²;Comienzos;9;2004"
>>> line
'Solo Fue Una Noche;NGxb2;Comienzos;9;2004'
>>> line.decode('latin-1')
u'Solo Fue Una Noche;NGxb2;Comienzos;9;2004'
在这种情况下,Unicode 和 Latin-1恰好具有相同的非 ASCII 字符的 8 位表示形式。但这只是一个方便的意外。它可能有所不同,这就是为什么您必须指定解码的原因。您现在有一个 unicode 字符串,您可以将其附加到'n'
:
>>> line.decode('latin-1')+"n"
u'Solo Fue Una Noche;NGxb2;Comienzos;9;2004n'
然后,您可以将此 Unicode 字符串编码回 Latin-1 以进行输出:
>>> (line.decode('latin-1')+"n").encode('latin-1')
'Solo Fue Una Noche;NGxb2;Comienzos;9;2004n'
但是对于你正在做的事情,你根本不需要encode()
。你说从Spotify获得拉丁语-1。您希望输出为拉丁语-1。因此,您只需将"n"
附加到输入字符串并将其写出即可。
>>> line="Solo Fue Una Noche;NG²;Comienzos;9;2004"
>>> line + "n"
'Solo Fue Una Noche;NGxb2;Comienzos;9;2004n'
>>> ndt.write(line+"n")