102

I have a path:

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

I would like to remove the end path so that the string only contains:

"C:\Users"

So far I am using split, but it just gives me a list, and im stuck at this point.

myPath = myPath.split(os.sep)
thefourtheye
  • 233,700
  • 52
  • 457
  • 497
Brock Woolf
  • 46,656
  • 50
  • 121
  • 144

4 Answers4

143

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.

Daniel Kluev
  • 11,025
  • 2
  • 36
  • 36
47

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'
thefourtheye
  • 233,700
  • 52
  • 457
  • 497
19

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
johnDanger
  • 1,990
  • 16
  • 22
1

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"