Python 使用 unicode 文件名复制文件
Python Copy file with unicode filename
我正在尝试创建一个小脚本来复制变量中具有部分 unicode 名称的文件,但我无法让它工作。
代码如下所示:
fileextension = filename.split(".")[len(filename.split(".")) - 1]
if not os.path.exists(artistdir + "\" + songname + "." + fileextension):
print basedir + filename, artistdir + "\" + songname + "." + fileextension
shutil.copy(basedir + filename, artistdir + "\" + songname + "." + fileextension)
我得到以下 return:
E:\music\_collections\Adrian von Ziegler12 Starchaser. Adrian von Ziegler - Nidh├Âggr.mp3 C:\Temp\Adrian von Ziegler\Nidh├Âggr.mp3
Traceback (most recent call last):
File "E:\main\Coding\Python\WinampPlaylistExport\winampplaylistexport.py", line 72, in <module>
iteratePlaylists()
File "E:\main\Coding\Python\WinampPlaylistExport\winampplaylistexport.py", line 20, in iteratePlaylists
iteratePlaylist(playlist.get("title"), playlist.get("filename"))
File "E:\main\Coding\Python\WinampPlaylistExport\winampplaylistexport.py", line 69, in iteratePlaylist
shutil.copy(basedir + filename, artistdir + "\" + songname + "." + fileextension)
File "C:\Python27\lib\shutil.py", line 119, in copy
copyfile(src, dst)
File "C:\Python27\lib\shutil.py", line 82, in copyfile
with open(src, 'rb') as fsrc:
IOError: [Errno 2] No such file or directory: 'E:\music\_collections\Adrian von Ziegler\2012 Starchaser\01. Adrian von Ziegler - Nidh\xc3\xb6ggr.mp3'
第一行显示复制失败文件的目标和源路径(打印语句的return)。
提前致谢。
尝试将其更改为:
fileextension = filename.split(".")[len(filename.split(".")) - 1]
if not os.path.exists(artistdir + "\" + songname + "." + fileextension):
print basedir + filename, artistdir + "\" + songname + "." + fileextension
shutil.copy(basedir + filename.decode('utf8'), artistdir + "\" + songname.decode('utf8') + "." + fileextension)
注意它的 'decode' 而不是 "encode" (你评论说你已经尝试过编码,但是编码字符串没有意义 已经在 utf8 中)
您应该将 Unicode 字符串传递给 shutil.copy()
。不要混合使用字节串和 Unicode 字符串。
所有变量(filename
、artistdir
、songname
、fileextension
、basedir
)在这里应该是Unicode字符串(assert isinstance(s, unicode)
) .
在代码的各个地方散布 .decode('utf-8')
很容易出错。使用 Unicode sandwich 代替:
- 尽快将输入字节串转换为 Unicode 文本
- 在内部使用 Unicode 来处理文本
- 在输出时尽可能晚地将 Unicode 文本转换为字节(如果有必要)
我正在尝试创建一个小脚本来复制变量中具有部分 unicode 名称的文件,但我无法让它工作。
代码如下所示:
fileextension = filename.split(".")[len(filename.split(".")) - 1]
if not os.path.exists(artistdir + "\" + songname + "." + fileextension):
print basedir + filename, artistdir + "\" + songname + "." + fileextension
shutil.copy(basedir + filename, artistdir + "\" + songname + "." + fileextension)
我得到以下 return:
E:\music\_collections\Adrian von Ziegler12 Starchaser. Adrian von Ziegler - Nidh├Âggr.mp3 C:\Temp\Adrian von Ziegler\Nidh├Âggr.mp3
Traceback (most recent call last):
File "E:\main\Coding\Python\WinampPlaylistExport\winampplaylistexport.py", line 72, in <module>
iteratePlaylists()
File "E:\main\Coding\Python\WinampPlaylistExport\winampplaylistexport.py", line 20, in iteratePlaylists
iteratePlaylist(playlist.get("title"), playlist.get("filename"))
File "E:\main\Coding\Python\WinampPlaylistExport\winampplaylistexport.py", line 69, in iteratePlaylist
shutil.copy(basedir + filename, artistdir + "\" + songname + "." + fileextension)
File "C:\Python27\lib\shutil.py", line 119, in copy
copyfile(src, dst)
File "C:\Python27\lib\shutil.py", line 82, in copyfile
with open(src, 'rb') as fsrc:
IOError: [Errno 2] No such file or directory: 'E:\music\_collections\Adrian von Ziegler\2012 Starchaser\01. Adrian von Ziegler - Nidh\xc3\xb6ggr.mp3'
第一行显示复制失败文件的目标和源路径(打印语句的return)。
提前致谢。
尝试将其更改为:
fileextension = filename.split(".")[len(filename.split(".")) - 1]
if not os.path.exists(artistdir + "\" + songname + "." + fileextension):
print basedir + filename, artistdir + "\" + songname + "." + fileextension
shutil.copy(basedir + filename.decode('utf8'), artistdir + "\" + songname.decode('utf8') + "." + fileextension)
注意它的 'decode' 而不是 "encode" (你评论说你已经尝试过编码,但是编码字符串没有意义 已经在 utf8 中)
您应该将 Unicode 字符串传递给 shutil.copy()
。不要混合使用字节串和 Unicode 字符串。
所有变量(filename
、artistdir
、songname
、fileextension
、basedir
)在这里应该是Unicode字符串(assert isinstance(s, unicode)
) .
在代码的各个地方散布 .decode('utf-8')
很容易出错。使用 Unicode sandwich 代替:
- 尽快将输入字节串转换为 Unicode 文本
- 在内部使用 Unicode 来处理文本
- 在输出时尽可能晚地将 Unicode 文本转换为字节(如果有必要)