Python: немецкие специальные символы UTF-8

Я ищу файлы в скрипте Python и сохраняю пути к файлам. Проблема в том, что в некоторых случаях внутри есть специальные символы, такие как ö ä ü (UTF-8 Table hex U+00C4 U+00D6 U+00DC и т. д.). Когда я печатаю путь с помощью «print», он отображается правильно. Когда я использую эту строку для отправки ее в os.system(), специальные символы экранируются и получают ошибку UTF.

Сообщение об ошибке:

cp -nv /home/rainer/Arbeitsfläche/Videofiles/A047C001_130226_R1WV.mov /media/rainer/LinuxData
Traceback (most recent call last):
  File "Clipfinder.py", line 254, in <module>
    copyProcess(sourcedir,destdir,cliplist)
  File "Clipfinder.py", line 205, in copyProcess
    os.system(copycmd)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 29: ordinal not in range(128)

Спасибо за помощь! дождь

copycmd = "cp -nv " + pathtoFile_src + " " + destdir
print copycmd
os.system(copycmd)

person rainer    schedule 23.02.2014    source источник


Ответы (1)


Используйте encode для преобразования unicode в байтовую строку:

os.system(copycmd.encode('utf-8'))
person ndpu    schedule 23.02.2014
comment
классно! Спасибо за подсказку!!! теперь он работает... забыл старую команду внутри, поэтому я снова получил ошибку... теперь все в порядке!!!! - person rainer; 23.02.2014
comment
Теперь нужно разобраться с пробелами. cp обрезает команду там. - person rainer; 23.02.2014
comment
Я убегаю от белых символов с помощью функции замены, которая отлично работает. Но у меня сейчас другая проблема. Когда я добавляю строку со специальными символами в список, получаю ошибку: Scanning Source Directory /home/rainer/Arbeitsfläche/Videofiles test for Files. Это может занять некоторое время! Трассировка (последний последний вызов): Файл Clipfinder_RAW.py, строка 346, в ‹module› copyProcess(sourcedir,destdir,cliplist) Файл Clipfinder_RAW.py, строка 238, в copyProcess found_srcdirs.encode('utf-8') UnicodeDecodeError: Кодек ascii не может декодировать байт 0xc3 в позиции 22: порядковый номер не в диапазоне (128) - person rainer; 02.03.2014
comment
Перед записью в список: /home/rainer/Arbeitsfläche/Videofiles test/A051R1WV/A051C001_130227_R1WV.mov, а затем, когда он появится в списке: '/home/rainer/Arbeitsfl\xc3\xa4che/Videofiles test/A051R1WV' - person rainer; 02.03.2014
comment
@rainer вы должны декодировать строку перед кодированием (у вас уже есть закодированная строка байтов): print '/home/rainer/Arbeitsfl\xc3\xa4che/Videofiles test/A051R1WV'.decode('utf-8') /home/rainer/Arbeitsfläche/Videofiles test/A051R1WV - person ndpu; 02.03.2014
comment
Затем я получаю эту ошибку: UnicodeEncodeError: кодек ascii не может кодировать символ u'\xe4' в позиции 22: порядковый номер не в диапазоне (128) - person rainer; 02.03.2014
comment
когда я читаю список с помощью: для записей в found_dirs: печатать записи, я получаю правильный вывод. с: print listlist[0:] не декодируется. - person rainer; 02.03.2014
comment
@rainer, вы можете опубликовать другой вопрос, поместить в него трассировку исключения и код, в котором вы получили исключение. - person ndpu; 02.03.2014