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?

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.


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.


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'

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

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)

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

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

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

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


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.


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'

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

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)

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'

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

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

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.


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.


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)

-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

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

-3

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.