Обработка слешей в пути к файлам
Вот такой код на питоне получает ошибку:
name = 'C:\Users\Legion\Dropbox\PY\examples\mywc.py'
print(name)
ошибка:
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
Я конечно могу написать так: r'C:\Users\Legion\Dropbox\PY\examples\mywc.py'
и ошибка исчезнет. Но я думал, что как-то можно потом обработать строку в name перед принт, например:
name2 = r'{}'.format(name)
, однако, все такие манипуляции приводят к такой же ошибке.
Получается, строка, записанная в name, уже безвозвратно "испорчена" попыткой преобразования?
Интересно, решилась бы проблема, если бы просто для путей в windows или для управляющих символов использовались бы отличные символы от "\
"? Зачем так придумано, чтобы слеш использовался и в пути windows, и одновременно для управляющих символов?
Ответы (2 шт):
Можно использовать pathlib
from pathlib import Path
path0 = Path('C:/Users/Legion/Dropbox/PY/examples/mywc.py')
path1 = Path('C:\\Users\\Legion\\Dropbox\\PY\\examples\\mywc.py')
path3 = Path(r'C:\Users\Legion\Dropbox\PY\examples\mywc.py')
print(path0.name)
print(path1.name)
print(path3.name)
print(f' {path0}\n {path1} \n {path3}')
mywc.py
mywc.py
mywc.py
C:\Users\Legion\Dropbox\PY\examples\mywc.py
C:\Users\Legion\Dropbox\PY\examples\mywc.py
C:\Users\Legion\Dropbox\PY\examples\mywc.py
Из вашего вопроса:
Получается, строка, записанная в name, уже безвозвратно "испорчена" попыткой преобразования?
Нет. Она не испорчена, она не существует, потому что это просто неправильная форма для записи строкового литерала.
Ошибка здесь:
name = 'C:\Users\Legion\Dropbox\PY\examples\mywc.py'
↑↑
\U
это начало экранированной постепенности 8 шестнадцатеричных цифр для введения символа в форме Юникод, например \U0000042f
для буквы Я
.
Значит, после символа \U
ожидается 8 шестнадцатеричных цифр, что в вашем случае не так — символ s
после \U
(в части \Users
) не является такой цифрой.
Как это исправить?
Существует несколько возможностей — выберите любую из них:
Вместо обратных слешов (
\
) используйте нормальные (/
) - да, это возможно даже в Windows:name = 'C:/Users/Legion/Dropbox/PY/examples/mywc.py'
Вместо одного обратного слеша (
\
) используйте всегда пару (\\
) - это экранированная постепенность для одного слеша:name = 'C:\\Users\\Legion\\Dropbox\\PY\\examples\\mywc.py'
Непосредственно перед строку включите символ
r
илиR
(от английского слова row, сырой), чтобы все символы интерпретировались буквально, а не как экранированные последовательности:name = r'C:\Users\Legion\Dropbox\PY\examples\mywc.py'