Os.path: вы можете объяснить это поведение? - PullRequest
5 голосов
/ 08 октября 2008

Я люблю Python, потому что он поставляется с батарейками, и я часто использую встроенные функции, чтобы сделать грязную работу за меня.

Я всегда с радостью использовал модуль os.path для обработки пути к файлу, но недавно я получил неожиданные результаты на Python 2.5 под Ubuntu linux, работая со строкой, представляющей пути к файлам Windows:

filepath = r"c:\ttemp\FILEPA~1.EXE"
print os.path.basename(filepath)
'c:\\ttemp\\FILEPA~1.EXE']
print os.path.splitdrive(filepath)
('', 'c:\ttemp\\FILEPA~1.EXE')

WTF?

То же самое происходит с filepath = u "c: \ ttemp \ FILEPA ~ 1.EXE" и filepath = "c: \ ttemp \ FILEPA ~ 1.EXE".

У вас есть подсказка? Ubuntu использует UTF8, но я не чувствую, что это как-то связано с этим. Возможно, моя установка Python испорчена, но я не выполнил какой-либо конкретной настройки, которую я помню.

Ответы [ 3 ]

24 голосов
/ 08 октября 2008

Если вы хотите манипулировать путями Windows в Linux, вы должны использовать модуль ntpath (это модуль, который импортируется как os.path в Windows - posixpath импортируется как os.path в Linux)

>>> import ntpath
>>> filepath = r"c:\ttemp\FILEPA~1.EXE"
>>> print ntpath.basename(filepath)
FILEPA~1.EXE
>>> print ntpath.splitdrive(filepath)
('c:', '\\ttemp\\FILEPA~1.EXE')
3 голосов
/ 08 октября 2008

Из os.path документации:

os.path.splitdrive (путь)
Разбейте путь к пути на пару (диск, хвост), где диск - это либо спецификация диска, либо пустая строка. В системах, которые не используют спецификации дисков, диск всегда будет пустой строкой. Во всех случаях drive + tail будет таким же, как path.

Если вы работаете с Unix, он не использует спецификации диска, следовательно - диск будет пустой строкой.

Если вы хотите решить пути Windows на любой платформе, вы можете просто использовать регулярное выражение:

import re
(drive, tail) = re.compile('([a-zA-Z]\:){0,1}(.*)').match(filepath).groups() 

drive будет буквой диска, за которой следует : (например, c:, u:) или None, а tail все остальные:)

1 голос
/ 08 октября 2008

См. Документацию здесь , в частности:

splitdrive (p) Разделить имя пути на диск и путь. В Posix диск всегда пусто.

Так что это не будет работать на Linux-коробке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...