149

I have the following string:

a = "/home/user/Downloads/repo/test.txt" 

My goal is just to create a string which contains only test, how can I do this ?

actually a comes from

f = tkFileDialog.asksaveasfile(mode='w', defaultextension=".txt") 

and a is equal to a = f.name

but I realized f.name does not give me just the name of the file.

4
  • 2
    Just to be clear, you want the final part without the extension? Commented Jun 15, 2018 at 13:44
  • Hint: look in module os.path Commented Jun 15, 2018 at 13:45
  • os.path.splitext(os.path.basename(a))[0] Commented Jun 15, 2018 at 13:46
  • 22
    Ignore all of those old answers for python 2.x on the question from 2009. Use pathlib. Commented Apr 12, 2019 at 19:53

3 Answers 3

365

In Python 3.4+, you can use the pathlib module (included in Python's standard library):

>>> from pathlib import Path >>> p = Path("/home/user/Downloads/repo/test.txt") >>> print(p.stem) test >>> print(p.name) test.txt 
Sign up to request clarification or add additional context in comments.

6 Comments

is there a way to get the stem and its extension? EDIT: looked in the documentation, the answer is p.name
Won't work if there's multiple extensions e.g. test.original.txt.
For the else who looking for: you can get the parent directory via: p.parent and suffixes (extensions) via p.suffixes
Unfortunately, p.parent does not yield a Path so it breaks the chain. :/
@Raphael It does. Are you using Python's native pathlib or some other package?
|
19

Use the os.path module to work with paths; the os.path.basename() function gives you the last part after the last path separator, and os.path.splitext() gives you the filename with the extension split off:

import os.path basename = os.path.splitext(os.path.basename(f.name))[0] 

Using the os.path functions ensures that your code will continue to work correctly on different operating systems, even if the path separators are different.

In Python 3.4 or newer (or as a separate backport install), you can also use the pathlib library, which offers a more object-oriented approach to path handling. pathlib.Path() objects have a .stem attribute, which is the final component without the extension suffix:

try: import pathlib except ImportError: # older Python version, import the backport instead import pathlib2 as pathlib basename = pathlib.Path(f.name).stem 

Demo:

>>> import os.path >>> a = "/home/user/Downloads/repo/test.txt" >>> os.path.basename(a) 'test.txt' >>> os.path.splitext(os.path.basename(a)) ('test', '.txt') >>> os.path.splitext(os.path.basename(a))[0] 'test' >>> import pathlib >>> pathlib.Path(a) PosixPath('/home/user/Downloads/repo/test.txt') >>> pathlib.Path(a).stem 'test' 

Comments

2

It seems that you're either looking for os.path.basename or os.path.splitext:

>>> import os.path >>> os.path.basename("/var/log/err.log") 'err.log' >>> os.path.splitext(os.path.basename("/var/log/err.log")) ('err', '.log') >>> os.path.splitext(os.path.basename("/var/log/err.log"))[0] 'err' >>> 

Comments