How to get the extension of a filename from the path

L

Lad

Hello,
what is a way to get the the extension of a filename from the path?
E.g., on my XP windows the path can be
C:\Pictures\MyDocs\test.txt
and I would like to get
the the extension of the filename, that is here
txt


I would like that to work on Linux also
Thank you for help
L.
 
D

Dale Strickland-Clark

Lad said:
Hello,
what is a way to get the the extension of a filename from the path?
E.g., on my XP windows the path can be
C:\Pictures\MyDocs\test.txt
and I would like to get
the the extension of the filename, that is here
txt


I would like that to work on Linux also
Thank you for help
L.

Like this, you mean?('c:\\pictures\\mydocs\\test', '.txt')
 
T

Tom Anderson

what is a way to get the the extension of a filename from the path?
E.g., on my XP windows the path can be
C:\Pictures\MyDocs\test.txt
and I would like to get
the the extension of the filename, that is here
txt

You want os.path.splitext:
import os
os.path.splitext("C:\Pictures\MyDocs\test.txt") ('C:\\Pictures\\MyDocs\test', '.txt')
os.path.splitext("C:\Pictures\MyDocs\test.txt")[1] '.txt'
I would like that to work on Linux also

It'll be fine.

tom
 
F

Fredrik Lundh

Lad said:
what is a way to get the the extension of a filename from the path?
E.g., on my XP windows the path can be
C:\Pictures\MyDocs\test.txt
and I would like to get
the the extension of the filename, that is here
txt

I would like that to work on Linux also
Thank you for help

os.path.splitext(filename) splits a filename into a name part (which may include
a path) and an extension part:

import os
f, e = os.path.splitext(filename)

the extension will include the separator, so the following is always true:

assert f + e == filename

if you don't want the period, you can strip it off:

if e[:1] == ".":
e = e[1:]

but it's often easier to change your code to take the dot into account; instead
of

if e[:1] == ".":
e = e[1:]
if e == "txt":
handle_text_file(filename)
elif e in ("png", "jpg"):
handle_image_file(filename)

do

if e == ".txt":
handle_text_file(filename)
elif e in (".png", ".jpg"):
handle_image_file(filename)

on the other hand, for maximum portability, you can use

f, e = os.path.splitext(filename)
if e.startswith(os.extsep):
e = e[len(os.extsep):]
if e == "txt":
...

but that's probably overkill...

</F>
 
G

gene tani

Lad said:
Hello,
what is a way to get the the extension of a filename from the path?
E.g., on my XP windows the path can be
C:\Pictures\MyDocs\test.txt
and I would like to get
the the extension of the filename, that is here
txt


I would like that to work on Linux also
Thank you for help
L.

minor footnote: windows paths can be raw strings for os.path.split(),
or you can escape "/"
tho Tom's examp indicates unescaped, non-raw string works with
splitext()

import os.path
# winpath='C:\\Pictures\\MyDocs\\test.txt'
winpath=r'C:\Pictures\MyDocs\test.txt'
fpath,fname_ext=os.path.split(winpath)
print "path: %s ;;;;; fname and ext: %s"%(fpath, fname_ext)
ext=fname_ext.split(".")[-1]
print ext
 
P

Peter Hansen

Fredrik said:
on the other hand, for maximum portability, you can use

f, e = os.path.splitext(filename)
if e.startswith(os.extsep):
e = e[len(os.extsep):]
if e == "txt":
...

Is there ever a time when the original `e` could evaluate True, yet not
startswith(os.extsep)? In other words, could the first test be just

if e:
e = e[len(os.extsep):]

Also, note that for truly maximum portability one probably needs to add
to the code some knowledge of case-sensitivity and do a .lower() when
appropriate, as "txt" and "TXT" (and others) are equivalent on Windows
file systems. On that note, is there a common idiom for detecting that
information?

-Peter
 
T

Tom Anderson

minor footnote: windows paths can be raw strings for os.path.split(),
or you can escape "/"
tho Tom's examp indicates unescaped, non-raw string works with
splitext()

DOH. Yes, my path's got a tab in it, hasn't it!

tom
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,995
Messages
2,570,236
Members
46,821
Latest member
AleidaSchi

Latest Threads

Top