2013-09-08 2 views
4

Я много часов боролся с этим, и хотя я нашел решение, мне это не нравится. Есть ли встроенный способ решить эту проблему:Символ escape-кода на Python

Вы находитесь на Windows с переменной, содержащей путь. Вы пытаетесь открыть файл с ним, но он содержит escape-символы, которые вы не можете определить до выполнения.

Если вы используете 'shutil' и сделать: shutil.copy(file_path, new_file_path)

Он отлично работает.

Но если вы попытаетесь использовать один и тот же путь с:

f = open(file_path, encoding="utf8")

Это не работает, потому что «\ а» в пути читается как «Bell» = 7

Я пробовал делать все это, но единственное, что я получил, это настраиваемая функция «restore_broken_string».

file_path = "F:\ScriptsFilePath\addons\import_test.py" 

    print(sys.getdefaultencoding()) 
    print() 
    print(file_path.replace('\\', r'\\')) 
    print('%r' % (file_path)) 
    print(r'r"' + "'" + file_path+ "'") 
    print(file_path.encode('unicode-escape')) 
    print(os.path.normpath(file_path)) 
    print(repr(file_path)) 

    print() 
    print(reconstruct_broken_string(file_path)) 


backslash_map = { '\a': r'\a', '\b': r'\b', '\f': r'\f', 
        '\n': r'\n', '\r': r'\r', '\t': r'\t', '\v': r'\v' } 
def reconstruct_broken_string(s): 
    for key, value in backslash_map.items(): 
     s = s.replace(key, value) 
    return s 

Вот распечатка:

utf-8 

F:\\ScriptsFilePathddons\\import_test.py 
'F:\\ScriptsFilePath\x07ddons\\import_test.py' 
r"'F:\ScriptsFilePathddons\import_test.py' 
b'F:\\\\ScriptsFilePath\\x07ddons\\\\import_test.py' 
F:\ScriptsFilePathddons\import_test.py 
'F:\\ScriptsFilePath\x07ddons\\import_test.py' 

F:\ScriptsFilePath\addons\import_test.py 

Есть встроенный способ сделать это, а не эту функцию? Почему это работает с 'shutil', а не 'открытых'

Благодарности

+0

Пожалуйста, уменьшите вашу программу до наименьшей возможной * полной * программы, которая демонстрирует ошибку. Затем скопируйте эту короткую программу в свой вопрос. См. Http://SSCCE.ORG для получения информации об этой технологии отладки. –

+0

Вы можете упростить 'restoreruct_broken_string', используя уникальный вызов' str.translate' (если вы находитесь на python3). Просто измените 'backslash_map' так, чтобы клавиши были * кодовыми точками * (то есть' ord ('\ a'): r '\ a'') и вызывают 'file_path.translate (backslash_map)'. – Bakuriu

+0

Я пробовал это безрезультатно: backslash_map = {ord ('\ a'): r '\ a'} then: file_path.translate (backslash_map) – terrachild

ответ

6

Ваша проблема в этой строке:

file_path = "F:\ScriptsFilePath\addons\import_test.py" 

Try один из них:

file_path = r"F:\ScriptsFilePath\addons\import_test.py" 
file_path = "F:\\ScriptsFilePath\\addons\\import_test.py" 

Или даже:

file_path = "F:/ScriptsFilePath/addons/import_test.py" 

(Да, Windows принимает слеш как файловый разделитель.)

Ref: http://docs.python.org/2/reference/lexical_analysis.html#string-literals

+0

Или используйте косые черты. В частности, это побег '\ a'. –

+0

Да, но путь находится в переменной, которую я получаю во время выполнения, и я не могу добавить 'r' перед именем переменной. – terrachild

+0

Измените свой вопрос, чтобы включить код, который инициализирует эту переменную. –

0

Если путь в переменном, просто заменить все «\» с «/», используя любые из функций обработки строк в языке Python , Он должен решить проблему.

+0

Как? Я попробовал file_path.replace ('\\', '/'), вам нужно удвоить escape-символ или он не будет запущен, и он будет распечатываться как: F: \ ScriptsFilePathddons \ import_test.py – terrachild

+0

Нет, т. – kindall

1

Вот упрощенная версия, демонстрирующая, как «repr» работает неправильно.

file_path = "F:\tab\a_bell\newline.py" 
print(file_path) 
print(repr(file_path)) 

Это печатает:

F: ab_bell 
ewline.py 

and 

F:\tab\x07_bell\newline.py' 

Как вы можете видеть «Repr» работает с убегания язычок, избежать перевод строки и т.д., но это не работает с «\ а», который является побег колокол.

Это ошибка в 'repr'? Есть ли встроенное решение этой проблемы, которое не требует от программистов для написания пользовательской функции, такой как «restore_broken_string (s)»? Если нет, как может python быть этим хромым?

+0

Опять же, проблема с * этой * программой - это строка 'file_path =" F: \ tab \ a_bell \ newline.py ". Этот строковый литерал имеет вкладку, колокол и новую строку. Если вы хотите, чтобы они были слэшами в строке, вы должны избегать их '' \\ ''или использовать необработанную строку' r'f: \ tab ...' '. Но я подозреваю, что это не проблема с вашей реальной программой, так как вы сказали в другом месте, что у вас нет заявления о назначении. –

+0

'repr' в этой программе работает отлично. 'repr()' возвращает строку, которая, если ее передать в 'eval()', будет производить исходное значение. –

+0

Посмотрите на мой пример для примера: file_path = "F: \ tab \ a_bell \ newline.py" вкладка '\ t' в закладке обрабатывается должным образом по запросу, '\ n' обрабатывается должным образом, но '\ a' не. Почему представление не корректно для всех escape-символов в строке? – terrachild

0

У меня возникла такая же самая точная проблема - try path = 'C: \ temp \ importfile.xlsx' и продолжала получать сообщение об ошибке «Нет такого файла или каталога:« C: \ Temp \ importdata.xlsx ». Вместо этого я использовал косые черты, и мой импорт работал. Вы пробовали file_path = "F: /ScriptsFilePath/addons/import_test.py"?

Смежные вопросы