Путь Windows в Python

152

Например, как лучше всего представить каталог Windows "C:\meshes\as"? Я пытался изменить сценарий, но он никогда не работал, потому что я не могу понять каталог правильно, я полагаю, из-за '\'действия в качестве escape-символа?

Gareth
источник

Ответы:

220

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

'C:/mydir'

это работает как в Linux и Windows. Другая возможность

'C:\\mydir'

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

r'C:\mydir'

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

os.path.join(mydir, myfile)

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

pathlib.Path(mydir, myfile)

или

pathlib.Path(mydir) / myfile
Хоакин
источник
2
@ Гарет, я очень ленивый и часто использую «/». Однако в долгосрочной перспективе использование os.path более удобно. Это также позволяет вам использовать mydir и myfile в качестве переменных, которые вы можете легко изменить.
Хоакин
13
Единственная вещь, с которой нужно быть осторожным с необработанными строками - это то, что они не могут заканчиваться \
Дуглас Лидер
Вы можете использовать os.path.join (), чтобы убрать необходимость заканчивать пути с помощью \.
Уилл Эдигер
1
Мне нравится синтаксис r (необработанная строка). Полезно, если вы копируете длинный путь, где вам обычно приходится заменять все обратные косые черты на прямые косые черты
peterb
Необработанная строка может заканчиваться на \\, поэтому мы можем объединить файл с путем: codecs.open (r "C: \ maXbox \ EKON24 \ tweet_data \\" + file, 'r', encoding = 'utf-8') как f:
Макс Кляйнер
20

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

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

Или используйте сырые строки

r"C:\meshes\as"

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

"C:\\meshes\\as.jpg"
С. Лотт
источник
11
os.path.join может работать не так, как вы ожидаете, когда компонент представляет собой букву диска, поскольку относительные пути разрешены даже тогда. (Результатом первой строки является «C: meshes \\ as» в Windows.)
dash-tom-bang
Комментарий @ dash-tom-bang действительно важен. Правильно ли поступить в "C:\"качестве первой записи? Это испортило некоторую чистоту использования join?
Джек О'Коннор
1
@ JackO'Коннор, это то, что я делаю. Вы, конечно, не хотите ставить "C:\"в середине имени файла. Кроме того, вы можете использовать os.path.normpathдо или после объединения, чтобы убедиться, что путь печатается правильно.
Агостино
но это тоже не работает. Что работаетos.path.join( "C:\\", "meshes", "as" )
Жан-Франсуа Фабр
17

Да, \в Python строковые литералы обозначают начало escape-последовательности. На вашем пути у вас есть действительная двухсимвольная escape-последовательность \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')
    
vaultah
источник
-1

Используйте PowerShell

В Windows вы можете использовать /свой путь точно так же, как Linux или macOS во всех местах, если вы используете PowerShell в качестве интерфейса командной строки. Он предустановлен в Windows и поддерживает множество команд Linux, таких как lscommand.

Если вы используете командную строку Windows (ту, которая появляется при вводе cmdв меню «Пуск» Windows), вам необходимо указать пути \внутри нее. Вы можете использовать /пути во всех других местах (редактор кода, интерактивный режим Python и т. Д.).

Аммар Алюсфи
источник
-1

Если вы хотите вставить путь к Windows из другого источника (например, File Explorer) - вы можете сделать это с помощью input()вызова в консоли Python:

>>> input()
D:\EP\stuff\1111\this_is_a_long_path\you_dont_want\to_type\or_edit_by_hand
'D:\\EP\\stuff\\1111\\this_is_a_long_path\\you_dont_want\\to_type\\or_edit_by_hand'

Тогда просто скопируйте результат

EP
источник