Вопрос-Ответ

How should I write a Windows path in a Python string literal?

Как я должен написать путь Windows в строковом литерале Python?

Предположим, мне нужно сослаться на путь C:\meshes\as. Если я попытаюсь написать это напрямую, например, "C:\meshes\as", я столкнусь с проблемами - либо какое-то исключение, либо путь просто не работает. Это потому, что \ действует как escape-символ? Как я должен написать пути?

Переведено автоматически
Ответ 1

Вы всегда можете использовать:

'C:/mydir'

Это работает как в Linux, так и в Windows.

Другая возможность заключается в:

'C:\\mydir'

Если у вас возникли проблемы с некоторыми именами, вы также можете попробовать необработанные строковые литералы:

r'C:\mydir'

Однако лучше всего использовать os.path функции модуля, которые всегда объединяются с правильным разделителем путей (os.path.sep) для вашей операционной системы:

os.path.join(mydir, myfile)

Из python 3.4 вы также можете использовать pathlib модуль. Это эквивалентно приведенному выше:

pathlib.Path(mydir, myfile)

или:

pathlib.Path(mydir) / myfile
Ответ 2

Используйте os.path модуль.

os.path.join( "C:", "meshes", "as" )

Или использовать необработанные строки

r"C:\meshes\as"

Я бы также рекомендовал не использовать пробелы в пути или именах файлов. И вы могли бы использовать двойные обратные косые черты в своих строках.

"C:\\meshes\\as.jpg"
Ответ 3

Да, \ в строковых литералах Python обозначается начало escape-последовательности. В вашем path у вас есть допустимая двухсимвольная управляющая последовательность \a, которая сворачивается в один символ, который является ASCII Bell:

>>> '\a'
'\x07'
>>> len('\a')
1
>>> 'C:\meshes\as'
'C:\\meshes\x07s'
>>> print('C:\meshes\as')
C:\meshess

Другие распространенные escape-последовательности включают \t (табуляция), \n (перевод строки), \r (возврат каретки):

>>> list('C:\test')
['C', ':', '\t', 'e', 's', 't']
>>> list('C:\nest')
['C', ':', '\n', 'e', 's', 't']
>>> list('C:\rest')
['C', ':', '\r', 'e', 's', 't']

Как вы можете видеть, во всех этих примерах обратная косая черта и следующий символ в литерале были сгруппированы вместе, чтобы сформировать один символ в конечной строке. Полный список escape-последовательностей Python находится здесь.

Есть множество способов справиться с этим:


  1. Python не будет обрабатывать escape-последовательности в строковых литералах с префиксом r или R:


    >>> r'C:\meshes\as'
    'C:\\meshes\\as'
    >>> print(r'C:\meshes\as')
    C:\meshes\as

  2. Python в Windows также должен обрабатывать косые черты.


  3. Вы могли бы использовать os.path.join ...


    >>> import os
    >>> os.path.join('C:', os.sep, 'meshes', 'as')
    'C:\\meshes\\as'

  4. ... или более новый pathlib модуль


    >>> from pathlib import Path
    >>> Path('C:', '/', 'meshes', 'as')
    WindowsPath('C:/meshes/as')

Ответ 4

Использование Path:

from pathlib import Path
data_folder = Path("source_data/text_files/")
file_to_open = data_folder / "raw_data.txt"
print(file_to_open.read_text())

Path принимает строку, подобную пути, и настраивает все для текущей ОС, будь то Windows или Linux. Например, в Linux это преобразует все обратные косые черты в прямые, а в Windows - наоборот.

Полная версия статьи: Краткий совет по Python 3: простой способ работы с путями к файлам в Windows, Mac и Linux


Мой опыт:


  • Я потратил 6 месяцев на использование os.path.join(...), затем переключился на normpath(...) затем, наконец, переключился на Path(...). После использования всех трех, Path - лучший из всех миров.


Преимущества Path перед os.path.join(...):


  • Очиститель.

  • Меньше ввода.

  • Пути легче читать (т.е. Более читабельны).

  • Можно объединить два разных пути, используя / (см. Выше).

  • Более современный.


Преимущества Path перед normpath(...):


  • Можно объединять пути, используя / вместо того, чтобы возвращаться к os.path.join(...), с вложенными вызовами normpath для исправления ситуации.

  • Очиститель.

  • Меньше ввода.

  • Пути легче читать (т.е. Более читабельны).

  • Меньше шансов на ошибки при переносе между Linux и Windows.

  • Более современный.

2024-01-29 16:08 python