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 .stem
Van pathlib
in 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 .stem
Alleen de laatste extensie verwijderen. Bijvoorbeeld, Path('file.tar.gz').stem
retourneert '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 pathlib
oplossing
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 os
importeren en gebruik vervolgens os.path.basename
import
ING os
betekent niet dat u os.foo
kunt 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 fnp
een pad is, terwijl fn
een 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 rsplit
en 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 filename
zonder de extension
(C:\Users\Public\Videos\Sample Videos\wildlife)
temp = os.path.splitext(filename)[0]
Je kunt nu alleen de filename
uit 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
/ pop
magie 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 “\”