Wie erhalte ich den Dateinamen ohne die Erweiterung von einem Pfad in Python?

994

Wie erhalte ich den Dateinamen ohne die Erweiterung von einem Pfad in Python?

Joan Venge
quelle

Antworten:

1316

Abrufen des Dateinamens ohne Erweiterung:

import os
print(os.path.splitext("/path/to/some/file.txt")[0])

Drucke:

/path/to/some/file

Dokumentation füros.path.splitext .

Wichtiger Hinweis: Wenn der Dateiname mehrere Punkte enthält, wird nur die Erweiterung nach dem letzten entfernt. Zum Beispiel:

import os
print(os.path.splitext("/path/to/some/file.txt.zip.asc")[0])

Drucke:

/path/to/some/file.txt.zip

Weitere Antworten finden Sie unten, wenn Sie diesen Fall behandeln müssen.

Geo
quelle
13
Wenn dies eine ausreichend häufige Operation ist, sollte sie vielleicht ihren eigenen offiziellen Befehl verdienen? So etwas wie os.path.filename (path_to_file) anstelle von os.path.splitext (os.path.basename (path_to_file)) [0]
Fnord
19
Was ist, wenn der Dateiname mehrere Punkte enthält?
Mattatteok
101
Für alle, die sich das gleiche wie Matteok fragen, wenn es mehrere Punkte gibt, wird Splitext am letzten geteilt (so splitext('kitty.jpg.zip')gibt es ('kitty.jpg', '.zip')).
Chuck
50
Beachten Sie, dass dieser Code die vollständige Datei zurückgibt Pfad (ohne die Erweiterung), nicht nur die Dateinamen .
Aran-Fey
2
Ja, also müssten Sie tun splitext(basename('/some/path/to/file.txt'))[0](was ich immer zu tun scheine)
CpILL
531

Sie können Ihre eigenen machen mit:

>>> import os
>>> base=os.path.basename('/root/dir/sub/file.ext')
>>> base
'file.ext'
>>> os.path.splitext(base)
('file', '.ext')
>>> os.path.splitext(base)[0]
'file'

Wichtiger Hinweis: Wenn .der Dateiname mehr als einen enthält , wird nur der letzte entfernt. Zum Beispiel:

/root/dir/sub/file.ext.zip -> file.ext

/root/dir/sub/file.ext.tar.gz -> file.ext.tar

Weitere Antworten finden Sie weiter unten.

gimel
quelle
2
@ ScottWilson: Sie müssen jedoch noch importieren os.
LarsH
35
Was bedeutet "rollen"?
LarsH
50
Es ist die Abkürzung für "roll your own", was im amerikanischen Englisch "build it yourself" bedeutet.
Scott C Wilson
2
@ Alan W. Smith, "Just roll it:" hat in den letzten 10 Jahren einwandfrei funktioniert. Was bedeutet "weniger amerikanisch"? Ich bin nicht für Ihre Änderungen.
Logic1
4
Die Bearbeitung macht es klarer. Nicht jeder hat Englisch als Muttersprache.
Wenn
327

Verwendung pathlibin Python 3.4+

from pathlib import Path

Path('/root/dir/sub/file.ext').stem

wird zurückkehren

'file'
Fett gedruckt
quelle
9
Dies ist der empfohlene Weg seit Python 3.
Miladiouss
1
Beachten Sie, dass dies wie bei os.pathLösungen nur eine Erweiterung entfernt (oder suffix, wie pathlibes heißt). Path('a.b.c').stem == 'a.b'
BallpointBen
@BallpointBen Was ist der optimale Weg, um mehrere Suffixe zu entfernen? Sicherlich muss es ein besserer Weg, alsPath(Path('a.b.c').stem).stem
hoan
1
@hoan Ich denke, wiederholtes Anrufen .with_suffix('')ist der richtige Weg. Sie möchten wahrscheinlich bis schleifen p.suffix == ''.
BallpointBen
218
>>> print(os.path.splitext(os.path.basename("hemanth.txt"))[0])
hemanth
hemanth.hm
quelle
7
+1 dafür. 3 genau gleiche Antworten, aber dies ist die direkteste. Sie hätten einfach `den Code und "/somepath/hermanth.txt" als Pfadinstanz anzeigen können.
Cregox
2
@ hemanth.hm Beachten Sie, dass in dieser von Ihnen angegebenen Erklärung os.path.basenamenicht erforderlich ist. os.path.basenamesollte nur verwendet werden, um den Dateinamen aus dem Dateipfad abzurufen.
arrt_
74

In Python 3.4+ können Sie die pathlibLösung verwenden

from pathlib import Path

print(Path(your_path).resolve().stem)
Morgoth
quelle
4
Warum machst du resolve()den Weg? Ist es wirklich möglich, einen Pfad zu einer Datei abzurufen, ohne dass der Dateiname ohne diesen Teil des Pfads ist? Dies bedeutet, dass Sie den Dateinamen (ohne die Erweiterung) der Datei zurückgeben, auf die der Symlink verweist, wenn Sie einen Pfad zu symlink angeben.
Boris
1
Ein möglicher Grund für die Verwendung resolve()ist die Lösung des Problems mit mehreren Punkten. Die folgende Antwort zur Verwendung des Index funktioniert nicht, wenn der Pfad "./foo.tar.gz" lautet
William Allcock
30

https://docs.python.org/3/library/os.path.html

In Python 3 pathlib "Das pathlib-Modul bietet übergeordnete Pfadobjekte." damit,

>>> from pathlib import Path
>>> p = Path("/a/b/c.txt")
>>> print(p.with_suffix(''))
\a\b\c
>>> print(p.stem)
c
jjisnow
quelle
1
Dies ist die beste Python 3-Lösung für den allgemeinen Fall, dass die Erweiterung aus einem vollständigen Pfad entfernt wird. Durch die Verwendung von stem wird auch der übergeordnete Pfad entfernt. Wenn Sie eine doppelte Erweiterung erwarten (z. B. bla.tar.gz), können Sie diese sogar zweimal verwenden: p.with_suffix (''). With_suffix ('').
Eelco van Vliet
24

Wenn Sie den Pfad zur Datei beibehalten und einfach die Erweiterung entfernen möchten

>>> file = '/root/dir/sub.exten/file.data.1.2.dat'
>>> print ('.').join(file.split('.')[:-1])
/root/dir/sub.exten/file.data.1.2

quelle
16
Wenn Sie in der letzten Periode teilen möchten, verwenden Sie rsplit:'/root/dir/sub.exten/file.data.1.2.dat'.rsplit('.', 1)
IceArdor
21

os.path.splitext () funktioniert nicht , wenn die Erweiterung mehrere Punkte enthält.

Zum Beispiel images.tar.gz

>>> import os
>>> file_path = '/home/dc/images.tar.gz'
>>> file_name = os.path.basename(file_path)
>>> print os.path.splitext(file_name)[0]
images.tar

Sie können einfach den Index des ersten Punkts im Basisnamen finden und dann den Basisnamen in Scheiben schneiden, um nur den Dateinamen ohne Erweiterung zu erhalten.

>>> import os
>>> file_path = '/home/dc/images.tar.gz'
>>> file_name = os.path.basename(file_path)
>>> index_of_dot = file_name.index('.')
>>> file_name_without_extension = file_name[:index_of_dot]
>>> print file_name_without_extension
images
Dheeraj Chakravarthi
quelle
1
index_of_dot = file_name.index ('.') Dies wird durchgeführt, nachdem der Basisname der Datei abgerufen wurde, damit sie nicht bei .env
Dheeraj Chakravarthi
2
Wichtiger Punkt, da eine Reihe solcher Erweiterungen häufig vorkommt. .tar.gz .tar.bz .tar.7z
2
Beachten Sie, dass 'haystack'.index('needle')eine ValueError-Ausnahme ausgelöst wird, wenn die Nadel (im obigen Fall der Punkt .) nicht im Heuhaufen gefunden wird. Es gibt auch Dateien ohne Erweiterung.
Czechnology
15

@ IceAdor's bezieht sich in einem Kommentar zur Lösung von @ user2902201 auf rsplit. rsplit ist die einfachste Lösung, die mehrere Perioden unterstützt.

Hier ist es geschrieben:

file = 'my.report.txt'
print file.rsplit('.', 1)[0]

mein Bericht

dlink
quelle
13

Aber selbst wenn ich os importiere, kann ich es nicht path.basename nennen. Ist es möglich, es so direkt wie den Basisnamen aufzurufen?

import osund dann verwenden os.path.basename

importing osbedeutet nicht, dass Sie os.fooohne Bezugnahme verwenden können os.

Devin Jeanpierre
quelle
1
Wenn Sie jedoch foo direkt anrufen möchten, können Sie es verwenden from os import foo.
tgray
Sie haben eine sehr nicht standardmäßige Version des osModuls, wenn ein Mitglied aufgerufen wird foo.
Tadhg McDonald-Jensen
2
Es ist ein Platzhaltername. (zB überlegen path, oder walk).
Devin Jeanpierre
13

Ich dachte, ich würde eine Variation der Verwendung von os.path.splitext einfügen ohne die Array-Indizierung verwenden zu müssen.

Die Funktion gibt immer ein (root, ext)Paar zurück, sodass die Verwendung sicher ist:

root, ext = os.path.splitext(path)

Beispiel:

>>> import os
>>> path = 'my_text_file.txt'
>>> root, ext = os.path.splitext(path)
>>> root
'my_text_file'
>>> ext
'.txt'
ScottMcC
quelle
os.path.splittext () ist Version 3.6+
Yzmir Ramirez
6

Die anderen Methoden entfernen nicht mehrere Erweiterungen. Einige haben auch Probleme mit Dateinamen, die keine Erweiterungen haben. Dieses Snippet behandelt beide Instanzen und funktioniert sowohl in Python 2 als auch in Python 3. Es übernimmt den Basisnamen aus dem Pfad, teilt den Wert in Punkte auf und gibt den ersten zurück, der der erste Teil des Dateinamens ist.

import os

def get_filename_without_extension(file_path):
    file_basename = os.path.basename(file_path)
    filename_without_extension = file_basename.split('.')[0]
    return filename_without_extension

Hier sind einige Beispiele:

example_paths = [
    "FileName", 
    "./FileName",
    "../../FileName",
    "FileName.txt", 
    "./FileName.txt.zip.asc",
    "/path/to/some/FileName",
    "/path/to/some/FileName.txt",
    "/path/to/some/FileName.txt.zip.asc"
]

for example_path in example_paths:
    print(get_filename_without_extension(example_path))

In jedem Fall lautet der gedruckte Wert:

FileName
Alan W. Smith
quelle
Mit Ausnahme des Mehrwerts der Behandlung mehrerer Punkte ist diese Methode viel schneller als Path('/path/to/file.txt').stem. (1,23μs vs 8,39μs)
raratiru
Dies funktioniert nicht für den Dateinamen nvdcve-1.1-2002.json.zip
Michele
Ich habe es auf fileBasename.split ('. Json') [0] aufgeteilt und es hat funktioniert
Michele
4

import os

filename = C:\\Users\\Public\\Videos\\Sample Videos\\wildlife.wmv

Dies gibt das filenameohne extension(C: \ Benutzer \ Öffentlich \ Videos \ Beispielvideos \ Wildlife) zurück.

temp = os.path.splitext(filename)[0]  

Jetzt können Sie nur die filenamevon der Zeit mit bekommen

os.path.basename(temp)   #this returns just the filename (wildlife)
Lerncode
quelle
3

Ein Verfahren mit mehreren Erweiterungen. Funktioniert für strund unicodePfade. Funktioniert in Python 2 und 3.

import os

def file_base_name(file_name):
    if '.' in file_name:
        separator_index = file_name.index('.')
        base_name = file_name[:separator_index]
        return base_name
    else:
        return file_name

def path_base_name(path):
    file_name = os.path.basename(path)
    return file_base_name(file_name)

Verhalten:

>>> path_base_name('file')
'file'
>>> path_base_name(u'file')
u'file'
>>> path_base_name('file.txt')
'file'
>>> path_base_name(u'file.txt')
u'file'
>>> path_base_name('file.tar.gz')
'file'
>>> path_base_name('file.a.b.c.d.e.f.g')
'file'
>>> path_base_name('relative/path/file.ext')
'file'
>>> path_base_name('/absolute/path/file.ext')
'file'
>>> path_base_name('Relative\\Windows\\Path\\file.txt')
'file'
>>> path_base_name('C:\\Absolute\\Windows\\Path\\file.txt')
'file'
>>> path_base_name('/path with spaces/file.ext')
'file'
>>> path_base_name('C:\\Windows Path With Spaces\\file.txt')
'file'
>>> path_base_name('some/path/file name with spaces.tar.gz.zip.rar.7z')
'file name with spaces'

quelle
1
import os
path = "a/b/c/abc.txt"
print os.path.splitext(os.path.basename(path))[0]
user4949344
quelle
0

Auf dem Windows-System habe ich auch das Präfix für den Treibernamen verwendet, z.

>>> s = 'c:\\temp\\akarmi.txt'
>>> print(os.path.splitext(s)[0])
c:\temp\akarmi

Da ich keinen Laufwerksbuchstaben oder Verzeichnisnamen benötige, verwende ich:

>>> print(os.path.splitext(os.path.basename(s))[0])
akarmi
Zéiksz
quelle
0

Zur Vereinfachung eine einfache Funktion, die die beiden Methoden umschließt os.path:

def filename(path):
  """Return file name without extension from path.

  See https://docs.python.org/3/library/os.path.html
  """
  import os.path
  b = os.path.split(path)[1]  # path, *filename*
  f = os.path.splitext(b)[0]  # *file*, ext
  #print(path, b, f)
  return f

Getestet mit Python 3.5.

Griff
quelle
0

Der einfachste Weg, dies zu beheben, ist zu

import ntpath 
print('Base name is ',ntpath.basename('/path/to/the/file/'))

Dies spart Ihnen Zeit und Rechenaufwand.

Nkoro Joseph Ahamefula
quelle
0

Sehr sehr sehr einfach keine anderen Module !!!

import os
p = r"C:\Users\bilal\Documents\face Recognition python\imgs\northon.jpg"

# Get the filename only from the initial file path.
filename = os.path.basename(p)

# Use splitext() to get filename and extension separately.
(file, ext) = os.path.splitext(filename)

# Print outcome.
print("Filename without extension =", file)
print("Extension =", ext)
Bilal
quelle
-1

Wir könnten etwas Einfaches split/ popMagisches tun, wie hier zu sehen ( https://stackoverflow.com/a/424006/1250044 ), um den Dateinamen zu extrahieren (unter Berücksichtigung der Windows- und POSIX-Unterschiede).

def getFileNameWithoutExtension(path):
  return path.split('\\').pop().split('/').pop().rsplit('.', 1)[0]

getFileNameWithoutExtension('/path/to/file-0.0.1.ext')
# => file-0.0.1

getFileNameWithoutExtension('\\path\\to\\file-0.0.1.ext')
# => file-0.0.1
yckart
quelle
os.path.splitext () [0] macht dasselbe.
Charles Plager
@CharlesPlager os.path.splitext () funktioniert nicht, wenn die Erweiterung mehrere Punkte enthält. stackoverflow.com/a/37760212/1250044
yckart
Es funktioniert für mich: In [72]: os.path.splitext ('one.two.three.ext') Out [72]: ('one.two.three', '.ext')
Charles Plager
-1
import os
list = []
def getFileName( path ):
for file in os.listdir(path):
    #print file
    try:
        base=os.path.basename(file)
        splitbase=os.path.splitext(base)
        ext = os.path.splitext(base)[1]
        if(ext):
            list.append(base)
        else:
            newpath = path+"/"+file
            #print path
            getFileName(newpath)
    except:
        pass
return list

getFileName("/home/weexcel-java3/Desktop/backup")
print list
Shivendra Singh
quelle
-3

Import os Dateiname, file_extension = os.path.splitext ('/ d1 / d2 / example.cs') Dateiname ist '/ d1 / d2 / Beispiel' file_extension ist '.cs'

Antonio Ramasco
quelle