具有unicode文件名的Python复制文件

具有unicode文件名的Python复制文件,python,unicode,copy,glob,shutil,Python,Unicode,Copy,Glob,Shutil,我正在尝试创建一个小脚本,用于复制变量中带有部分unicode名称的文件,但我就是无法让它工作 代码如下所示: fileextension = filename.split(".")[len(filename.split(".")) - 1] if not os.path.exists(artistdir + "\\" + songname + "." + fileextension): print basedir + filename, artistdir +

我正在尝试创建一个小脚本,用于复制变量中带有部分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)
我得到的回报如下:

E:\music\_collections\Adrian von Ziegler\2012 Starchaser\01. 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'
E:\music\\u collections\Adrian von Ziegler\2012 Starchaser\01。阿德里安·冯·齐格勒-奈德├ggr.mp3 C:\Temp\Adrian von Ziegler\Nidh├ggr.mp3
回溯(最近一次呼叫最后一次):
文件“E:\main\Coding\Python\WinAmpPlayExport\WinAmpPlayExport.py”,第72行,在
迭代播放列表()
迭代播放列表中的文件“E:\main\Coding\Python\WinAmpPlayExport\WinAmpPlayExport.py”,第20行
迭代播放列表(playlist.get(“title”)、playlist.get(“filename”))
文件“E:\main\Coding\Python\WinAmpPlayExport\WinAmpPlayExport.py”,第69行,在iteratePlaylist中
复制(basedir+文件名,artistdir+“\\”+歌曲名+“+文件扩展名)
文件“C:\Python27\lib\shutil.py”,第119行,副本
复制文件(src、dst)
copyfile中第82行的文件“C:\Python27\lib\shutil.py”
开放式(src,'rb')作为fsrc:
IOError:[Errno 2]没有这样的文件或目录:“E:\\music\\\U collections\\Adrian von Ziegler\\2012 Starchaser\\01”。Adrian von Ziegler-Nidh\xc3\xb6ggr.mp3'
第一行显示复制失败的文件的目标和源路径(返回print语句)

提前感谢。

尝试将其更改为:

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()
。不要混合使用bytestring和Unicode字符串

所有变量(
filename
artistdir
songname
fileextension
basedir
)在这里都应该是Unicode字符串(
断言isinstance(s,Unicode)

在不同的地方使用
.decode('utf-8')
喷洒代码是很容易出错的。改用:

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

  • 可能的重复:?我已经尝试了很多答案,例如使用.encode(“utf-8”)并在路径字符串前加u”“+,但这引发了以下错误:UnicodeDecodeError:“ascii”编解码器无法解码位置84处的字节0xc3:序号不在范围内(128)2更多建议:如果可能,将变量定义为
    unicode
    (字符序列)对象而不是
    string
    (字节序列)。然后连接就可以了。连接路径组件的传统方法是使用
    os.path.join(…)
    。无关:使用
    os.path.join()
    创建完整路径,而不是手动连接部分。谢谢,但这也不起作用,我收到相同的错误消息:
    UnicodeDecodeError:“ascii”编解码器无法解码84位的字节0xc3:序号不在范围内(128)
    artistdir的basedir是否也包含ut8字符?如果是,请添加.decode('utf8')对他们来说是的,我忘了artistdir,现在可以了…谢谢!