Search code examples
pythonpathdirectory

Python: change part (single directory name) of path


What would be the best way to change a single directory name (only the first occurence) within a path?

Example:

source_path = "/path/to/a/directory/or/file.txt"
target_path = "/path/to/different/directory/or/file.txt"

I this case, the instruction would be: "replace the first directory of the name 'a' with a directory of the name 'different'"

I can think of methods where I would split up the path in its single parts first, then find the first "a", replace it and join it again. But I wonder if there is a more elegant way to deal with this. Maybe a built-in python function.


Solution

  • There is a function called os.path.split that can split a path into the final part and all leading up to it but that's the closest your going to get. Therefore the most elegant thing we can do is create a function that calls that continuously:

    import os, sys 
    def splitall(path): 
        allparts = [] 
        while 1: 
            parts = os.path.split(path) 
            if parts[0] == path: # sentinel for absolute paths 
                allparts.insert(0, parts[0]) 
                break 
            elif parts[1] == path: # sentinel for relative paths 
                allparts.insert(0, parts[1]) 
                break 
            else: 
                path = parts[0] 
                allparts.insert(0, parts[1]) 
                return allparts
    

    Then you could use it like this, joining back together with os.path.join:

    >>> source_path = '/path/to/a/directory/or/file'
    >>> temp = splitall(source_path)
    >>> temp
    ['path', 'to', 'a', 'directory', 'or', 'file']
    >>> temp[2] = 'different'
    >>> target_path = os.path.join(*temp)
    >>> target_path
    'path/to/different/directory/or/file'