У меня есть строковая переменная, которая представляет путь DOS, например:
var = "d:\stuff\morestuff\furtherdown\THEFILE.txt"
Я хочу разбить эту строку на:
[ "d", "stuff", "morestuff", "furtherdown", "THEFILE.txt" ]
Я попытался с помощью split()
и , replace()
но они либо обрабатывать только первый символ обратный косую черту или они вставляют шестигранное число в строку.
Мне нужно как-то преобразовать эту строковую переменную в необработанную строку, чтобы я мог ее проанализировать.
Какой лучший способ сделать это?
Я также должен добавить, что содержимое var
пути, который я пытаюсь проанализировать, на самом деле является возвращаемым значением запроса командной строки. Это не данные пути, которые я генерирую сам. Он хранится в файле, и инструмент командной строки не избежит обратной косой черты.
os.path.split
это не работает для вас, потому что вы не экранируете эту строку должным образом.r"d:\stuff\morestuff\furtherdown\THEFILE.txt"
для предотвращения\s
неправильного толкования.Ответы:
Меня много раз кусали люди, которые писали свои собственные функции путаницы и неправильно понимали. Пробелы, косая черта, обратная косая черта, двоеточие - возможности для путаницы не бесконечны, но ошибки в любом случае легко допускаются. Так что я сторонник использования
os.path
и рекомендую его на этой основе.(Однако путь к добродетели - не тот, который легче всего выбрать, и многие люди, находя это, испытывают искушение пойти скользким путем прямо к проклятию. Они не поймут, пока однажды все не развалится на части, и они - или Скорее всего, кто-то другой должен выяснить, почему все пошло не так, и оказывается, что кто-то создал имя файла, которое смешивает косые черты и обратные слеши - и кто-то предполагает, что ответ «не делать этого». Ни один из этих людей. За исключением того, кто перепутал косые черты и косые черты - вы можете быть ими, если хотите.)
Вы можете получить диск и путь + файл следующим образом:
Получите путь и файл:
Получение отдельных имен папок не особенно удобно, но это своего рода честный средний дискомфорт, который усиливает удовольствие от последующего поиска чего-то, что действительно хорошо работает:
(Это появляется
"\"
в начале,folders
если путь изначально был абсолютным. Вы можете потерять немного кода, если не хотите этого.)источник
if path.endswith("/"):
иpath = path[:-1]
.я бы сделал
Сначала нормализуйте строку пути в правильную строку для ОС. Тогда
os.sep
должно быть безопасно использовать в качестве разделителя в строковой функции split.источник
os.path.normpath(a_path).split(os.path.sep)
os.path.normpath(path).lstrip(os.path.sep).split(os.path.sep)
normpath
распознает косую черту как разделитель. В Linuxnormpath
просто предполагается, что у вас есть каталог с именем\1\2
и файл или каталог внутри него3
.Вы можете просто использовать самый Pythonic подход (IMHO):
Который даст вам:
Ключом здесь является использование
os.sep
вместо'\\'
или'/'
, так как это делает систему независимой.Чтобы удалить двоеточие из буквы диска (хотя я не вижу причин, почему вы хотели бы это сделать), вы можете написать:
источник
some times
. В других случаях (по крайней мере, в Windows) вы найдете пути, которые выглядят следующим образомfolder\folder2\folder3/file.txt
. Лучше сначала нормализовать (os.path.normpath) путь, а затем разделить его./foo//bar
). См Tompa «s ответ на более надежное решение.В Python> = 3.4 это стало намного проще. Теперь вы можете использовать,
pathlib.Path.parts
чтобы получить все части пути.Пример:
При установке Python 3 для Windows это предполагает, что вы работаете с путями Windows, а в * nix - что вы работаете с путями posix. Обычно это то, что вы хотите, но если это не так, вы можете использовать классы
pathlib.PurePosixPath
или поpathlib.PureWindowsPath
мере необходимости:Изменить: Существует также обратный порт для Python 2: pathlib2
источник
Проблема здесь начинается с того, как вы создаете строку в первую очередь.
Сделано так, Python пытается частный случай это:
\s
,\m
,\f
, и\T
. В вашем случае\f
это обрабатывается как подача формы (0x0C), в то время как другие обратные слеши обрабатываются правильно. Что вам нужно сделать, это один из них:Затем, как только вы разделите любой из них, вы получите желаемый результат.
источник
split()
илиreplace()
работать по какой-то причине - я продолжал получать шестнадцатеричные значения. Вы правы, хотя, я думаю, что я ошибся деревом с идеей необработанных строк - я думаю, что я просто использовалsplit()
неправильно. Потому что я пробовал использовать некоторые из этих решений,split()
и теперь они работают на меня.Для более краткого решения рассмотрите следующее:
источник
/
. Кроме того, выдает пустую строку в начале списка, если ваш путь начинается с/
На самом деле я не могу дать реальный ответ на этот вопрос (поскольку я пришел сюда в надежде найти его сам), но для меня количество различных подходов и всех упомянутых предостережений является самым верным показателем того, что модуль Python os.path остро нуждается в этом как встроенная функция.
источник
Функциональный способ, с генератором .
В действии:
источник
Меня устраивает:
Конечно, вам также может понадобиться удалить двоеточие из первого компонента, но его сохранение позволяет повторно собрать путь.
В
r
Модификатор помечает строковый литерал , как «сырой»; обратите внимание, что встроенные обратные слеши не удваиваются.источник
r
перед вашей строкой, к чему это относится?\
символы. Это полезно использовать всякий раз, когда вы делаете пути.os.path.split
иos.pathsep
, учитывая, что оба они гораздо более портативны, чем то, что вы написали. Возможно, сейчас OP не имеет значения, но будет, когда он пишет что-то, что нужно для перемещения платформ.Материал о чем-
mypath.split("\\")
то будет лучше выражен какmypath.split(os.sep)
.sep
является разделителем пути для вашей конкретной платформы (например,\
для Windows,/
для Unix и т. д.), и сборка Python знает, какую из них использовать. Если вы используетеsep
, то ваш код не зависит от платформы.источник
os.path.split
. Вы хотите быть осторожнымos.pathsep
, потому что он:
на моей версии Python в OS X (иos.path.split
правильно обрабатывает/
).os.sep
, нетos.pathsep
. Следуйте мудрости вos.sep
документах: обратите внимание, что знания этого недостаточно для разбора или объединения имен путей - используйте os.path.split () и os.path.join ().re.split () может помочь немного больше, чем string.split ()
Если вы также хотите поддерживать пути Linux и Mac, просто добавьте фильтр (None, result), чтобы он удалил нежелательные '' из split (), поскольку их пути начинаются с '/' или '//'. например '// mount / ...' или '/ var / tmp /'
источник
Вы можете рекурсивно
os.path.split
строкуТестирование этого с некоторыми строками пути и повторная сборка пути с
os.path.join
Первый элемент списка, возможно, придется обрабатывать по-разному, в зависимости от того, как вы хотите работать с буквами дисков, UNC-путями и абсолютными и относительными путями. Изменение последнего
[p]
к[os.path.splitdrive(p)]
силам вопроса расщепления буквы диска и каталог выкорчевать в кортеж.Изменить: я понял, что этот ответ очень похож на тот, который приведен выше пользователем 1556435 . Я оставляю свой ответ, так как обработка компонента пути отличается.
источник
Как и другие объяснили, ваша проблема возникла из-за использования
\
escape-символа в строковом литерале / константе. OTOH, если бы у вас была эта строка пути к файлу из другого источника (считанная из файла, из консоли или возвращенная функцией os) - не было бы проблем с разбиением на '\\' или r '\'.И точно так же , как другие предложили, если вы хотите использовать
\
в программе литерале, вы должны либо скопировать его\\
или все буквальные должны быть префиксr
, например , такr'lite\ral'
илиr"lite\ral"
избежать парсер преобразования , что\
иr
в CR (возврат каретки) характер.Однако есть еще один способ - просто не используйте
\
пути с обратной косой чертой в своем коде! С прошлого века Windows распознает и прекрасно работает с путями, которые используют косую черту в качестве разделителя каталогов/
! Как-то не многие знают это .. но это работаетЭто, кстати, заставит ваш код работать на Unix, Windows и Mac ... потому что все они используют в
/
качестве разделителя каталогов ... даже если вы не хотите использовать предопределенные константы модуляos
.источник
var = var.replace('\\','/')
- замените \ на / и продолжайте работать только с косыми чертами :)Предположим, у вас есть файл
filedata.txt
с содержимым:Вы можете прочитать и разделить пути к файлам:
источник
Я использую следующее, поскольку, поскольку он использует функцию os.path.basename, он не добавляет косые черты в возвращаемый список. Он также работает с косыми чертами любой платформы: то есть с окном \\ или unix /. И, кроме того, он не добавляет \\\\, который Windows использует для путей к серверу :)
Так что для '\\\\ server \\ folder1 \\ folder2 \\ folder3 \\ folder4'
ты получаешь
[ 'Сервер', 'Folder1', 'folder2', 'folder3', 'Folder4']
источник
os.path.join()
должна возвращать исходную строку. Я бы сказал, что правильный вывод для вашего примера ввода[r'\\','server','folder1','folder2','folder3','folder4']
. Т.е. чтоos.path.split()
делает.На самом деле я не уверен, что это полностью отвечает на вопрос, но я весело провел время, написав эту маленькую функцию, которая хранит стек, придерживается манипуляций на основе os.path и возвращает список / стек элементов.
источник
Ниже строка кода может обрабатывать:
путь = re.split (r '[/// \]', путь)
источник
Один рекурсивный для удовольствия.
Не самый элегантный ответ, но должен работать везде:
источник
использование
ntpath.split()
источник
d:\\stuff
,morestuff\x0curtherdown\thefile.mux
)d:\\stuff, morestuff\x0curtherdown\thefile.mux
'\x0c'
является символом подачи формы. Способ создания символа фида формы - «\ f». Если вы действительно хотите буквальную строку '\ f', у вас есть два варианта:'\\f'
илиr'\f'
.