Открытие, закрытие и копирование файлов Unicode в Windows - PullRequest
0 голосов
/ 16 октября 2018

Я сталкиваюсь со следующей ошибкой при попытке выполнить отдельные операции для открытия файлов в другой программе, закрытия файлов в другой программе и выполнения системных операций, таких как копирование файла с именем файла на основе Unicode.Мой текущий код прекрасно работает на Macintosh, но не на Windows.Я только начал работать с именами файлов Unicode и CLI.

UnicodeEncodeError: 'ascii' codec can't encode character u'\u0301' in position 5: ordinal not in range(128)

Упрощенный файл закрытия в другом примере приложения выглядит примерно так:

def CloseFile( fileToClose ):
    cmd = [ 'sudo', fmsadmin, 'close', fileToClose, '-u', 'userName', '-p', 'accountName', '-y' ] 
    subprocess.check_output( cmd )

CloseFile( u'ÉürøFile.fmp12' )

Я пытался выполнить декодирование раньшенабор переменной cmd, но это не работает.

fileToClose = fileToClose.decode('utf-8')

Я могу дать вам пример CopyFile (), если хотите, но это с ошибкой задолго до вызова команды.Поэтому вам не нужно устанавливать FileMaker Server для воспроизведения проблемы.

Я использую shutil.copy (from, to) для метода копирования.

1 Ответ

0 голосов
/ 23 октября 2018

ОК ... Я наконец понял это и предоставлю предупреждение ниже.Я скопировал и вставил имя файла из другой программы.

Первые два символа в этом имени файла не были объединены (ÉürøFile.fmp12).Так что это было закодировано как E´и u¨.Вместо É и ü.Очевидно, что Python 2.7 не может обрабатывать символы, которые не объединяются при попытке выполнить командную строку на основе этого имени файла.

Таким образом, предупреждение здесь:

  1. Используйте repr ()Функция в Python, чтобы понять, как кодируется строка.
  2. Используйте инструменты, которые поддерживают необходимый вам стиль кодирования
  3. При сравнении значений убедитесь, что обе стороны сравнения поддерживают один и тот же стиль Unicode(составлено против разложено).
  4. Наконец найдите символ, на который указывает ошибка.Я не ... но если бы я сделал ... я бы обнаружил, что Unicode 0301 был символом акцента.Этот персонаж: ´

В качестве продолжения этой проблемы я обнаружил еще одну проблему.Как только приведенный выше код был исправлен, я пытался защитить имена файлов в кодировке Unicode с помощью встроенных утилит zip в Pythons.Сохранение файлов в zip-файле, а затем, при необходимости, разархивирование файлов с именами файлов Unicode.Это было очевидно ошибкой в ​​Python 2.7 на Windows.Когда Pythons, встроенная в утилиту unzip, распаковала файл, она испортила кодировку имени файла на диске (отлично работает на Mac).Имя было спрятано в Windows и не было распознано системными утилитами, такими как copy, mv, getSize и т. Д. Моя работа заключалась в том, чтобы поместить свободные тестовые файлы с европейскими и азиатскими именами в папку на томах SMB и заставить мой код работатьвместо этого прямо на них.Больше уроков.Я надеюсь, что смогу перейти на Python 3 в будущем и что будет меньше проблем с файлами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...