删除字符串中的最后路径组件

我有一条路:

myPath = "C:\Users\myFile.txt"

我想删除结束路径,以便字符串只包含:

"C:\Users"

到目前为止,我使用的是分割,但它只是给我一个列表,我卡在这一点。

myPath = myPath.split(os.sep)
89616 次浏览

You should not manipulate paths directly, there is os.path module for that.

>>> import os.path
>>> print os.path.dirname("C:\Users\myFile.txt")
C:\Users
>>> print os.path.dirname(os.path.dirname("C:\Users\myFile.txt"))
C:\

Like this.

You can also use os.path.split, like this

>>> import os
>>> os.path.split('product/bin/client')
('product/bin', 'client')

It splits the path into two parts and returns them in a tuple. You can assign the values in variables and then use them, like this

>>> head, tail = os.path.split('product/bin/client')
>>> head
'product/bin'
>>> tail
'client'

The current way to do this (Python > 3.4) is to use the standard library's pathlib module.

>>> import pathlib
>>> path = pathlib.Path(r"C:\Users\myFile.txt")
>>> path.parent
WindowsPath('C:/Users')   #if using a Windows OS


>>> print(path.parent)
C:\Users

This has the additional benefit of being cross platform as pathlib will make a path object suited for the current operating system (I am using Windows 10)

Other useful attributes/methods are:

path.name
>> "myFile.txt"
path.stem
>> "myFile"
path.parts
>> ("C:\\", "Users", "myFile.txt")
path.with_suffix(".csv")
>> "myFile.csv"
path.iterdir()
>> #iterates over all files/directories in path location
path.isdir()
>> #tells you if path is file or directory

While it is true that you should not maybe manipulate paths directly, and should use os.path module, sometimes, you may have your path as a string (for example, if your path was inside a text document, xml, etc.).

In such a situation, it might be safe and maybe even convenient to use string operations (as I found in my use case).

An example (assuming you have read your path from a text file, xml, etc. to a variable called path):

directory = "/".join(list(path.split('/')[0:-1]))

The path is split with " / " as a seperator, sliced to remove the last item in the list, in OPs case "myFile.txt", and joined back with " / " as a seperator.

This will give the path with the file name removed.

OP had the path

myPath = "C:\Users\myFile.txt"

He will have

"C:\Users"