Python: открытие юникода с именем xls файл из скрипта - PullRequest
3 голосов
/ 02 апреля 2011

Как открыть файл с именем unicode пробелами ) из скрипта Python в Windows ?
имя файла, например: Hello עולם.xls

Для файла xls без Юникода без разнесения os.system(filename) хорошо работает.
Для файла xls, не содержащего Юникод, os.system('"'+filename+'"') работает хорошо.

Но для файла xls с юникодным пространством ...

и os.system(filename) и subprocess.call(new_filename) дают:

UnicodeEncodeError: кодек «ascii» не может кодировать символы в позиции 12-13: порядковый номер не в диапазоне (128)

os.system(new_filename.encode('UTF-8')) дает:

«Привет» не распознается как внутренняя или внешняя команда, действующая программа или командный файл.

и subprocess.call(new_filename.encode('UTF-8')) дает:

WindowsError: [Ошибка 2] Системе не удается найти указанный файл

Ответы [ 2 ]

6 голосов
/ 02 апреля 2011

os.startfile(), как упомянуто Брэдли (+1), но обязательно передайте строку Юникода, а не строку байта.

Имена файлов Windows NT изначально являются Unicode, а Python в Windows имеет (в отличие от большинства других языков сценариев) специальную поддержку, встроенную для передачи строк Unicode в API, которые ожидают имена файлов:

os.startfile(u'Hello \u05e2\u05d5\u05dc\u05dd.xls')  # u'Hello עולם.xls'

Если вы передадите байтовую строку, она перейдет в стандартную библиотеку C stdio, которая в Microsoft C Runtime отобразит байтовые строки в имена файлов Unicode, используя набор символов по умолчанию на машине (кодовая страница ANSI), это то, что getfilesystemencoding() возвращается. Это все равно будет работать, если каждый символ в имени файла будет представлен в кодовой странице ANSI, но пример имени файла не будет работать ни для чего, кроме установки Windows на иврите.

К сожалению, та же поддержка Unicode недоступна для system() или subprocess. Но вам, вероятно, не нужно использовать командную строку в этом случае.

4 голосов
/ 02 апреля 2011

Вы должны использовать os.startfile(), а не os.system().Вы, вероятно, также хотите использовать sys.getfilesystemencoding() например

import os
import sys
os.startfile(filename.encode(sys.getfilesystemencoding()))
...