2015-09-06 114 views
0

我想创建一个小的脚本复制文件的变量中的部分unicode名称,但我无法让它工作。Python复制文件与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' 

,第一行显示的目标,并在这里拷贝失败的文件的源路径(返回打印声明)。

在此先感谢。

+0

可能的重复:http://stackoverflow.com/questions/4173477/copying-files-with-unicode-names? – amito

+0

我已经尝试了很多答案,例如使用.encode(“utf-8”)和前缀u“”+到路径字符串,但是抛出了以下错误:UnicodeDecodeError:'ascii'编解码器无法解码字节0xc3位置84:序号不在范围内(128) –

+0

2更多建议:如果可能,请将变量定义为“unicode”(字符序列)对象而不是“字符串”(字节序列)。然后连接将会正常工作。连接路径组件的传统方式是使用'os.path.join(...)'。 – roeland

回答

2

尝试将其更改为:

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) 

注意到它的“解码”,而不是“编码”(你comented你已经尝试过编码,但它没有意义的编码字符串女巫已经在UTF8)

+0

谢谢,但那也行不通,我得到相同的错误信息:'UnicodeDecodeError:'ascii'编解码器无法解码位置84中的字节0xc3:序号不在范围内(128)' –

+0

是否基于artirir也包含ut8字符?如果是这样的话,请向他们添加.decode('utf8') – DorElias

+0

Argh是的,我忘了关于artistdir,现在它工作..谢谢! –

0

您应该将Unicode字符串传递给shutil.copy()。不要混合使用字节串和Unicode字符串。

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

在各个地方将代码与.decode('utf-8')相混淆是很容易出错的。使用Unicode sandwich代替:

  1. 将输入尽快
  2. 内部使用Unicode字节字符串为Unicode文本与文本
  3. 工作尽可能晚地转换成Unicode文本的字节输出(如果有必要在全部)