2015-09-06 2 views
0

Я пытаюсь создать небольшой скрипт, который копирует файлы с частично юникодными именами в переменных, но я просто не могу заставить его работать.Python Скопировать файл с unicode filename

код выглядит следующим образом:

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' codec не может декодировать байт 0xc3 в позиции 84: порядковый номер не в диапазоне (128)' –

+0

делает basir от artistdir Также содержат символы ut8? если так добавить .decode ('utf8') к ним тоже – DorElias

+0

Argh yeah, я забыл про artistdir, теперь это работает .. Спасибо! –

0

Вы должны передать строки Unicode в shutil.copy(). Не смешивайте bytestrings и строки Unicode.

Все переменные (filename, artistdir, songname, fileextension, basedir) должны быть Unicode строки здесь (assert isinstance(s, unicode)).

Сбрасывание кода с помощью .decode('utf-8') в различных местах является подверженным ошибкам. Используйте Unicode sandwich вместо:

  1. вход конвертировать байтовой строки в текст Unicode как можно скорее
  2. использование Unicode внутренне для работы с текстом
  3. преобразования текста Unicode в байты как можно позже на выходе (если это необходимо в все)