wake-up-neo.com

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

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

821
Joan Venge

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.

1138
Geo

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.

428
gimel
>>> print(os.path.splitext(os.path.basename("hemanth.txt"))[0])
hemanth
197
hemanth.hm

Eine lesbare Version mit Pathlib in Python 3.4+

from pathlib import Path

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

Druckt:

datei

140
bold

Der Vollständigkeit halber hier die pathlib Lösung für python 3.2+:

from pathlib import Path

print(Path(your_path).resolve().stem)
46
Morgoth

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
25
user2902201

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
20

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
19
jjisnow

@ 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

13
dlink

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'
12
ScottMcC

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

importing os bedeutet nicht, dass Sie os.foo verwenden können, ohne sich auf os zu beziehen.

12

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)
4
learncode

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'
4
Lycan

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
3
Alan W. Smith

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
2
Zéiksz
import os
path = "a/b/c/abc.txt"
print os.path.splitext(os.path.basename(path))[0]
2
user4949344

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.

1
joseph nkoro

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

1
Connor
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
1
shivendra singh

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
1
yckart

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.

0
handle