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 字符串。

所有变量(filenameartistdirsongnamefileextensionbasedir)在这里应该是Unicode字符串(assert isinstance(s, unicode)) .

在代码的各个地方散布 .decode('utf-8') 很容易出错。使用 Unicode sandwich 代替:

  1. 尽快将输入字节串转换为 Unicode 文本
  2. 在内部使用 Unicode 来处理文本
  3. 在输出时尽可能晚地将 Unicode 文本转换为字节(如果有必要)