Пути к файлам в python, возможные стили написания - PullRequest
0 голосов
/ 19 сентября 2018

Я знаю, что следующие определения строк представляют (внутренний Python) то же самое (базовые знания):

s1 = "D:\\users\\xy\\Desktop\\PC_daten.txt"
s2 = r"D:\users\xy\Desktop\PC_daten.txt"

Поэтому, если вы сделаете это, например, интерактивным в PythonWin:

>>> s1 = "D:\\users\\xy\\Desktop\\PC_daten.txt"
>>> s1
'D:\\users\\xy\\Desktop\\PC_daten.txt'
>>> print s1
D:\users\xy\Desktop\PC_daten.txt
>>> s2 = r"D:\users\xy\Desktop\PC_daten.txt"
>>> s2
'D:\\users\\xy\\Desktop\\PC_daten.txt'
>>> print s2
D:\users\xy\Desktop\PC_daten.txt

Ясно для меня (понимаю)

Но меня смущает то, что у питона встроена функция open все это (отчасти сумасшедшее) path-codings работа (интерактивно протестировано в PythonWin):

>>> a = open("D:\users\xy\Desktop\PC_daten.txt")
>>> a
<open file 'D:\\users\\xy\\Desktop\\PC_daten.txt', mode 'r' at 0x00000000046989C0>
>>> b = open("D:\\users\\xy\\Desktop\\PC_daten.txt")
>>> b
<open file 'D:\\users\\xy\\Desktop\\PC_daten.txt', mode 'r' at 0x00000000048B2300>
>>> c = open(r"D:\users\xy\Desktop\PC_daten.txt")
>>> c
<open file 'D:\\users\\xy\\Desktop\\PC_daten.txt', mode 'r' at 0x00000000048B20C0>
>>> d = open(r"D:\\users\\xy\\Desktop\\PC_daten.txt")
>>> d
<open file 'D:\\\\users\\\\xy\\\\Desktop\\\\PC_daten.txt', mode 'r' at 0x00000000048B2390>

Мои вопросы:

  • Где документировано это поведение?
  • Есть ли у кого-нибудь справочная информация?

Тесты проводились на ОС Windows 7 и PythonWin 2.7.13

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Это поведение строк задокументировано в (Python v3.7 docs) 2.4.1. String and Bytes literals, а поведение open() задокументировано в 2. Built-in Functions.
В частности, для файла / пути в open() поясняетсяпод 16.1.2. Process Parameters, в записи class os.PathLike.По общему признанию, это много чтения, чтобы действительно понять этот параметр.

Подводя итог: ar "строка" является необработанной строкой.Вам не нужно экранировать такие слэши, как \\, чтобы при использовании необработанных слэшей иметь один слэш \.

Во втором блоке, чтобы было ясно, вы рассматривали сами переменные иглядя на них через их строковое представление (при использовании print) (который, я думаю, вы упомянули, вы прекрасно понимаете, но я просто хотел повторить это для вас, чтобы быть уверенным).

В дальнейшем все версии Python будут всеиспользовать объект PathLike при обработке файлов и папок.Я предполагаю, что вы все еще на Python 2.x, так как вы не получили ошибку при запуске print s1 - должно быть print(s1) в Python 3.x.Я рекомендую в ближайшее время перейти на Python 3. Это действительно намного лучше.

Надеюсь, что вы успешно ответите на ваши вопросы?

0 голосов
/ 19 сентября 2018

Подробности см. В разделе 2.4.1 в документах

Давайте рассмотрим различные строки и почему они работают:

>>> a = open("D:\users\xy\Desktop\PC_daten.txt")
>>> a
<open file 'D:\\users\\xy\\Desktop\\PC_daten.txt', mode 'r' at 0x00000000046989C0>

\ - это escape-символ в строке, который используется для специальных символов, таких как символ новой строки (\n).В этом случае вам повезло, что ни одна из комбинаций \u \x \P не указывает на такой специальный символ, следовательно, он работает, в отличие от open("foo\newfile.txt")

>>> b = open("D:\\users\\xy\\Desktop\\PC_daten.txt")
>>> b
<open file 'D:\\users\\xy\\Desktop\\PC_daten.txt', mode 'r' at 0x00000000048B2300>

Метод сохранения,\\ конструкций экранирует \, следовательно, вы также можете сделать open("foo\\newline")

>>> c = open(r"D:\users\xy\Desktop\PC_daten.txt")
>>> c
<open file 'D:\\users\\xy\\Desktop\\PC_daten.txt', mode 'r' at 0x00000000048B20C0>

Также сохранить, так как префикс r указывает необработанную строку, \ принимаютсябуквально, а не как escape-последовательности

>>> d = open(r"D:\\users\\xy\\Desktop\\PC_daten.txt")
>>> d
<open file 'D:\\\\users\\\\xy\\\\Desktop\\\\PC_daten.txt', mode 'r' at 0x00000000048B2390>

Здесь у вас есть необработанная строка (с предшествующим r), но вы все равно используете double \, следовательно, у вас есть \\ в пути.Это работает, потому что Windows понимает пути с двойным \, который вы также можете подтвердить в cmd

...