我经常用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(最新的HW,Python3.6)上,curl cmd得到一个退出代码1,
没人知道为什么
因为我想摆脱旧的WinA并继续使用python脚本,所以我只需在
VMWare Player12中的软呢帽来宾。
现在上标的问题只出现在Fedora系统上
(不在WinA上-WinB和WinC对我来说不再有任何意义,因为卷边问题)。
我在脚本中使用以下前两行:
只有当我试图将这一行(带上标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
,不需要不同的编码。问题是您对已经是拉丁语-1的字节字符串调用encode()
。在首先,请理解
encode()
接受一个Unicode字符串,并将其转换为某种表示形式,将字节值映射到Unicode码位。所以要使用它,你必须在Unicode字符串上调用它。如果对普通字符串调用encode()
,Python会首先尝试将其强制为Unicode。在因为这是python2,所以原始字符串(
line
)是一个字节字符串,除非您告诉它编码是什么,否则无法可靠地将其强制转换为Unicode。如果不这样做,并且选择默认强制,Python将假定ascii
。在因此,您必须从
latin-1
中解码以获得Unicode:在本例中,Unicode和Latin-1恰好具有相同的非ascii字符的8位表示形式。但那只是一个意外。它可能不同,这就是为什么你必须指定解码。现在有了一个unicode字符串,可以将
^{pr2}$'\n'
附加到该字符串:然后,您可以将这个Unicode字符串编码回拉丁语-1以输出:
但是对于你正在做的事情,你根本不需要
encode()
。你说是从Spotify得到了拉丁语-1。你希望你的输出是拉丁语-1。所以您只需将"\n"
附加到输入字符串并写出它。在相关问题 更多 >
编程相关推荐