Hoe krijg ik de bestandsnaam zonder de extensie van een pad in Python?

Hoe krijg ik de bestandsnaam zonder de extensie van een pad in Python?

Als ik bijvoorbeeld "/path/to/some/file.txt"had, zou ik "file"willen hebben.


Antwoord 1, autoriteit 100%

De naam van het bestand ophalen zonder de extensie:

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

Afdrukken:

/path/to/some/file

Documentatie voor os.path.splitext.

Belangrijke opmerking:Als de bestandsnaam meerdere punten heeft, wordt alleen de extensie na de laatste verwijderd. Bijvoorbeeld:

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

Afdrukken:

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

Zie andere antwoorden hieronder als u die zaak moet behandelen.


Antwoord 2, autoriteit 45%

Je kunt er zelf een maken met:

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

Belangrijke opmerking: als er meer dan één .in de bestandsnaam staat, wordt alleen de laatste verwijderd. Bijvoorbeeld:

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

Zie hieronder voor andere antwoorden die adressen.


Antwoord 3, Autoriteit 44%

Gebruik .stemVan pathlibin python 3.4 +

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

retourneert

'file'

Merk op dat als uw bestand meerdere extensies heeft .stemAlleen de laatste extensie verwijderen. Bijvoorbeeld, Path('file.tar.gz').stemretourneert 'file.tar'.


Antwoord 4, Autoriteit 16%

>>> print(os.path.splitext(os.path.basename("/path/to/file/hemanth.txt"))[0])
hemanth

Antwoord 5, Autoriteit 7%

In Python 3.4+ kunt u de pathliboplossing

from pathlib import Path
print(Path(your_path).resolve().stem)

Antwoord 6, Autoriteit 3%

https://docs.python.org/3/Library/os. pad.html

in Python 3 Pathlib “De Pathlib-module biedt padobjecten op hoog niveau.”
dus,

>>> from pathlib import Path
>>> p = Path("/a/b/c.txt")
>>> print(p.with_suffix(''))
\a\b\c
>>> print(p.stem)
c

Antwoord 7, Autoriteit 2%

OS.Path.Splitext () Work Werk als er meerdere stippen in de extensie zijn.

bijvoorbeeld, afbeeldingen.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

U kunt gewoon de index van de eerste stip in de Basename vinden en vervolgens de Basename snijden om alleen de bestandsnaam te krijgen zonder extensie.

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

Antwoord 8, Autoriteit 2%

Als u het pad naar het bestand wilt houden en gewoon de extensie wilt verwijderen

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

Antwoord 9, Autoriteit 2%

@ IceDor’s verwijst naar RSPLIT in een reactie op @ User2902201-oplossing. RSPLIT is de eenvoudigste oplossing die meerdere perioden ondersteunt.

Hier is het uitgelegd:

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

My.Report


Antwoord 10

Maar zelfs als ik OS importeer, kan ik het niet noemen. Basenaam. Is het mogelijk om het zo rechtstreeks als basenaam te noemen?

import osimporteren en gebruik vervolgens os.path.basename

importING osbetekent niet dat u os.fookunt gebruiken zonder te verwijzen naar os.


Antwoord 11

Ik dacht dat ik een variatie zou geven op het gebruik van de OS.Path.Splitext zonder de noodzaak om array-indexering te gebruiken.

De functie retourneert altijd een (root, ext)paar zodat het veilig is om te gebruiken:

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

Voorbeeld:

>>> import os
>>> path = 'my_text_file.txt'
>>> root, ext = os.path.splitext(path)
>>> root
'my_text_file'
>>> ext
'.txt'

Antwoord 12

De andere methoden verwijderen geen meerdere extensies. Sommigen hebben ook problemen met bestandsnamen die geen extensies hebben. Deze fragment behandelt beide gevallen en werkt in zowel Python 2 als 3. Het grijpt de basenaam van het pad, splitst de waarde op stippen en retourneert de eerste die het eerste deel van de bestandsnaam is.

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 is een reeks voorbeelden om uit te voeren:

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 elk geval is de afgedrukte waarde:

FileName

Antwoord 13

Twee of minder extensies

Zoals vermeld in de opmerkingen van andere Pathlib-antwoorden, kan het lastig zijn om met meerdere achtervoegsels om te gaan. Twee of minder achtervoegsels zijn niet zo slecht om te verwerken met .with_suffix('')en .stem.

from pathlib import Path
pth = Path('foo/bar/baz.baz/thefile.tar.gz')
fn = pth.with_suffix('').stem
print(fn)      # thefile

Een willekeurig aantal extensies

Als er meer dan twee extensies zijn, kunt u een lus gebruiken om het algemene geval af te handelen waarin er 0, 1 of veel achtervoegsels kunnen zijn.

pth = Path('foo/bar/baz/thefile.tar.gz.bz.7zip')
pth.name       # 'thefile.tar.gz.bz.7zip'
pth.suffixes   # ['.tar', '.gz', '.bz', '.7zip']

dus

fn = pth.name
for s in pth.suffixes:
    fn = fn.rsplit(s)[0]
print(fn)      # thefile

of

fnp = Path(pth.name)  
for _ in fnp.suffixes:
    fnp = fnp.with_suffix('')
print(fnp)     # thefile

Houd er rekening mee dat fnpeen pad is, terwijl fneen tekenreeks is, die de vorm van de voorkeurslus kan bepalen.

In het geval dat u de eerste extensie kent

Als de extensie bijvoorbeeld .tar, .tar.gz, .tar.gz.bz, enz. zou kunnen zijn; je kunt eenvoudig de bekende extensie rspliten het eerste element nemen:


pth = Path('foo/bar/baz.baz/thefile.tar.gz')
fn = pth.name.rsplit('.tar')[0]
print(fn)      # thefile

Antwoord 14

import os

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

Dit retourneert de filenamezonder de extension(C:\Users\Public\Videos\Sample Videos\wildlife)

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

Je kunt nu alleen de filenameuit de tijdelijke versie halen met

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

Antwoord 15

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

Antwoord 16

Een procedure voor het herkennen van meerdere extensies. Werkt voor str– en unicode-paden. Werkt in Python 2 en 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)

Gedrag:

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

Antwoord 17

import os
filename, file_extension =os.path.splitext(os.path.basename('/d1/d2/example.cs'))
  • FileName is ‘Voorbeeld’

  • File_Extension is ‘.cs’


Antwoord 18

Zeer heel erg simply geen andere modules !!!

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)

Antwoord 19

Op Windows-systeem gebruikte ik ook het prefix van DRIVERNAME, zoals:

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

Dus omdat ik geen stationsletter of directorynaam nodig heb, gebruik ik:

>>> print(os.path.splitext(os.path.basename(s))[0])
akarmi

Antwoord 20

de gemakkelijkste manier om dit op te lossen is om

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

dit bespaart u tijd en rekenkosten.


Antwoord 21

We zouden wat simpele split/ popmagie kunnen doen zoals hier te zien is (https://stackoverflow.com/a/424006/1250044), om de bestandsnaam te extraheren (met inachtneming van de verschillen tussen vensters en POSIX).

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

Antwoord 22

Voor het gemak een eenvoudige functie die de twee methoden van 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

Getest met Python 3.5.


Antwoord 23

Ik heb niet erg goed gezocht, maar ik zag niemand die regex voor dit probleem gebruikte.

Ik interpreteerde de vraag als “geef een pad, retourneer de basisnaam zonder de extensie.”

bijv.

"path/to/file.json"= & GT; "file"

"path/to/my.file.json"= & gt; "my.file"

In Python 2.7, waar we nog steeds wonen zonder pathlib

def get_file_name_prefix(file_path):
    basename = os.path.basename(file_path)
    file_name_prefix_match = re.compile(r"^(?P<file_name_pre fix>.*)\..*$").match(basename)
    if file_name_prefix_match is None:
        return file_name
    else:
        return file_name_prefix_match.group("file_name_prefix")
get_file_name_prefix("path/to/file.json")
>> file
get_file_name_prefix("path/to/my.file.json")
>> my.file
get_file_name_prefix("path/to/no_extension")
>> no_extension

Antwoord 24

Verbetering van @SPINUP-antwoord:

fn = pth.name
for s in pth.suffixes:
    fn = fn.rsplit(s)[0]
    break
print(fn)      # thefile 

Dit werkt voor bestandsnamen zonder extensie ook


Antwoord 25

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

Antwoord 26

Ik heb de antwoorden gelezen en ik merk dat er veel goede oplossingen zijn.
Dus, voor degenen die op zoek zijn naar een van beide (naam of extensie), hier is een andere oplossing, met behulp van de os module, beide methoden ondersteunen bestanden met meerdere extensies.

import os
def get_file_name(path):
    if not os.path.isdir(path):
        return os.path.splitext(os.path.basename(path))[0].split(".")[0]
def get_file_extension(path):
    extensions = []
    copy_path = path
    while True:
        copy_path, result = os.path.splitext(copy_path)
        if result != '':
            extensions.append(result)
        else:
            break
    extensions.reverse()
    return "".join(extensions)

Opmerking: deze oplossing voor Windows ondersteunt geen bestandsnamen met het teken “\”

Other episodes