Wie erhalte ich den Dateinamen ohne die Erweiterung aus einem Pfad in Python?
Den Namen der Datei ohne die Erweiterung erhalten:
import os
print(os.path.splitext("/path/to/some/file.txt")[0])
Drucke:
/path/to/some/file
Wichtiger Hinweis: Wenn der Dateiname mehrere Punkte enthält, wird nur die Erweiterung nach der 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 weiter unten, wenn Sie diesen Fall behandeln müssen.
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
Siehe unten für andere Antworten, die das ansprechen.
>>> print(os.path.splitext(os.path.basename("hemanth.txt"))[0])
hemanth
Eine lesbare Version mit Pathlib
in Python 3.4+
from pathlib import Path
Path('/root/dir/sub/file.ext').stem
Druckt:
datei
Der Vollständigkeit halber hier die pathlib
Lösung für python 3.2+:
from pathlib import Path
print(Path(your_path).resolve().stem)
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
os.path.splitext () wird nicht funktionieren 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
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
@ IceAdor's verweist in einem Kommentar zu @ user2902201s Lösung auf rsplit. rsplit ist die einfachste Lösung, die mehrere Perioden unterstützt.
Hier heißt es:
file = 'my.report.txt'
print file.rsplit('.', 1)[0]
mein Bericht
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'
Aber selbst wenn ich os importiere, kann ich es nicht path.basename nennen. Kann man es so direkt wie den Basisnamen aufrufen?
import os
und dann os.path.basename
import
ing os
bedeutet nicht, dass Sie os.foo
verwenden können, ohne sich auf os
zu beziehen.
import os
filename = C:\\Users\\Public\\Videos\\Sample Videos\\wildlife.wmv
Dies gibt das filename
ohne das extension
zurück (C:\Users\Public\Videos\Sample Videos\wildlife)
temp = os.path.splitext(filename)[0]
Jetzt können Sie nur noch das filename
aus dem Temp mit holen
os.path.basename(temp) #this returns just the filename (wildlife)
Ein Verfahren, bei dem mehrere Nebenstellen berücksichtigt werden. Funktioniert für str
und unicode
Pfade. 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'
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 3. Es extrahiert den Basisnamen aus dem Pfad, teilt den Wert in Punkte auf und gibt den ersten zurück, der den Anfangsteil des Dateinamens darstellt.
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 aufgedruckte Wert:
FileName
Auf Windows-Systemen habe ich auch das Präfix des Treibernamens verwendet, wie zum Beispiel:
>>> 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
import os
path = "a/b/c/abc.txt"
print os.path.splitext(os.path.basename(path))[0]
der einfachste Weg, dies zu beheben, ist
import ntpath
print('Base name is ',ntpath.basename('/path/to/the/file/'))
dies spart Ihnen Zeit und Rechenaufwand.
Für maximale Esoterik:
def strip_suffix(filename):
"""
>>> video.mp4
video
>>> video.extra.mp4
video.extra
"""
return ''.join((name_dot[0] + name_dot[1] for name_dot in itertools.Zip_longest(filename.split('.')[0:-1], '.', fillvalue='.')))[0:-1]
Hinweis: Dies ist nur zum Spaß. Verwenden Sie dies nicht. Verwenden Sie stattdessen os.path.splitext
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
Wir könnten eine einfache split
/pop
- Magie ausführen, 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
Der Einfachheit halber eine einfache Funktion, die die beiden Methoden von os.path
umschließt:
_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.