Я много часов боролся с этим, и хотя я нашел решение, мне это не нравится. Есть ли встроенный способ решить эту проблему:Символ 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', а не 'открытых'
Благодарности
Пожалуйста, уменьшите вашу программу до наименьшей возможной * полной * программы, которая демонстрирует ошибку. Затем скопируйте эту короткую программу в свой вопрос. См. Http://SSCCE.ORG для получения информации об этой технологии отладки. –
Вы можете упростить 'restoreruct_broken_string', используя уникальный вызов' str.translate' (если вы находитесь на python3). Просто измените 'backslash_map' так, чтобы клавиши были * кодовыми точками * (то есть' ord ('\ a'): r '\ a'') и вызывают 'file_path.translate (backslash_map)'. – Bakuriu
Я пробовал это безрезультатно: backslash_map = {ord ('\ a'): r '\ a'} then: file_path.translate (backslash_map) – terrachild