Jak uzyskać nazwę pliku bez rozszerzenia ze ścieżki w Pythonie?
Jak uzyskać nazwę pliku bez rozszerzenia ze ścieżki w Pythonie?
Odpowiedzi:
Pobieranie nazwy pliku bez rozszerzenia:
import os
print(os.path.splitext("/path/to/some/file.txt")[0])
Wydruki:
/path/to/some/file
Dokumentacja dlaos.path.splitext
.
Ważna uwaga: jeśli nazwa pliku zawiera wiele kropek, usuwane jest tylko rozszerzenie po ostatniej. Na przykład:
import os
print(os.path.splitext("/path/to/some/file.txt.zip.asc")[0])
Wydruki:
/path/to/some/file.txt.zip
Zobacz inne odpowiedzi poniżej, jeśli chcesz poradzić sobie z tą sprawą.
splitext('kitty.jpg.zip')
daje ('kitty.jpg', '.zip')
).
splitext(basename('/some/path/to/file.txt'))[0]
(co zawsze robię)
Możesz tworzyć własne za pomocą:
>>> 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'
Ważna uwaga: jeśli .
w nazwie pliku znajduje się więcej niż jedna , usuwana jest tylko ostatnia. Na przykład:
/root/dir/sub/file.ext.zip -> file.ext
/root/dir/sub/file.ext.tar.gz -> file.ext.tar
Poniżej znajdują się inne odpowiedzi na to pytanie.
os
.
Używanie pathlib
w Pythonie 3.4+
from pathlib import Path
Path('/root/dir/sub/file.ext').stem
wróci
'file'
os.path
rozwiązania spowoduje to usunięcie tylko jednego rozszerzenia (lub suffix
, jak pathlib
to się nazywa). Path('a.b.c').stem == 'a.b'
Path(Path('a.b.c').stem).stem
.with_suffix('')
jest właściwą drogą. Prawdopodobnie chciałbyś zapętlić do p.suffix == ''
.
>>> print(os.path.splitext(os.path.basename("hemanth.txt"))[0])
hemanth
`
do wyświetlenia kodu i „/somepath/hermanth.txt” jako instancji ścieżki.
os.path.basename
nie jest konieczne. os.path.basename
powinien być używany tylko do uzyskania nazwy pliku ze ścieżki pliku.
W Pythonie 3.4+ możesz użyć tego pathlib
rozwiązania
from pathlib import Path
print(Path(your_path).resolve().stem)
resolve()
ścieżką? Czy naprawdę jest możliwe uzyskanie ścieżki do pliku i bez tego, aby nazwa pliku nie była częścią ścieżki bez tego? Oznacza to, że jeśli podasz ścieżkę do dowiązania symbolicznego, zwrócisz nazwę pliku (bez rozszerzenia) pliku, na który wskazuje dowiązanie symboliczne.
resolve()
jest pomoc w rozwiązaniu problemu wielu kropek. Poniższa odpowiedź na temat korzystania z indeksu nie będzie działać, jeśli ścieżka to „./foo.tar.gz”
https://docs.python.org/3/library/os.path.html
W python 3 pathlib „Moduł pathlib oferuje obiekty ścieżki wysokiego poziomu”. więc,
>>> from pathlib import Path
>>> p = Path("/a/b/c.txt")
>>> print(p.with_suffix(''))
\a\b\c
>>> print(p.stem)
c
Jeśli chcesz zachować ścieżkę do pliku i po prostu usuń rozszerzenie
>>> file = '/root/dir/sub.exten/file.data.1.2.dat'
>>> print ('.').join(file.split('.')[:-1])
/root/dir/sub.exten/file.data.1.2
'/root/dir/sub.exten/file.data.1.2.dat'.rsplit('.', 1)
os.path.splitext () nie będzie działać, jeśli rozszerzenie ma wiele kropek.
Na przykład 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
Możesz po prostu znaleźć indeks pierwszej kropki w basenieame, a następnie pokroić basename, aby uzyskać tylko nazwę pliku bez rozszerzenia.
>>> 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
'haystack'.index('needle')
zgłasza wyjątek ValueError, jeśli igła (w powyższym przypadku kropka .
) nie znajduje się w stogu siana. Istnieją również pliki bez żadnego rozszerzenia.
Ale nawet gdy importuję system operacyjny, nie mogę nazwać go path.basename. Czy można to nazwać tak bezpośrednio jak basename?
import os
, a następnie użyj os.path.basename
import
ing os
nie oznacza, że możesz używać os.foo
bez odwoływania się do os
.
from os import foo
.
os
modułu, jeśli ma on element o nazwie foo
.
path
, lub walk
).
Pomyślałem, że wrzucę wariant użycia os.path.splitext bez potrzeby korzystania z indeksowania tablic.
Funkcja zawsze zwraca (root, ext)
parę, więc korzystanie z niej jest bezpieczne:
root, ext = os.path.splitext(path)
Przykład:
>>> import os
>>> path = 'my_text_file.txt'
>>> root, ext = os.path.splitext(path)
>>> root
'my_text_file'
>>> ext
'.txt'
Inne metody nie usuwają wielu rozszerzeń. Niektóre mają również problemy z nazwami plików, które nie mają rozszerzeń. Ten fragment dotyczy obu instancji i działa zarówno w Pythonie 2, jak i 3. Pobiera basename ze ścieżki, dzieli wartość na kropki i zwraca pierwszą, która jest początkową częścią nazwy pliku.
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
Oto zestaw przykładów do uruchomienia:
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))
W każdym przypadku drukowana wartość to:
FileName
Path('/path/to/file.txt').stem
. (1,23μs vs 8,39μs)
import os
filename = C:\\Users\\Public\\Videos\\Sample Videos\\wildlife.wmv
Zwraca to filename
bez extension
(C: \ Users \ Public \ Videos \ Sample Videos \ wildlife)
temp = os.path.splitext(filename)[0]
Teraz możesz uzyskać tylko filename
z temp. Z
os.path.basename(temp) #this returns just the filename (wildlife)
Procedura uwzględniająca wiele rozszerzeń. Działa str
i unicode
ścieżki. Działa w Python 2 i 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)
Zachowanie:
>>> 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'
import os
path = "a/b/c/abc.txt"
print os.path.splitext(os.path.basename(path))[0]
Dla wygody prosta funkcja owijająca dwie metody z 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
Testowane z Python 3.5.
najprostszym sposobem rozwiązania tego jest
import ntpath
print('Base name is ',ntpath.basename('/path/to/the/file/'))
oszczędza to czas i koszty obliczeń.
Bardzo, bardzo, bardzo prosto, żadnych innych modułów !!!
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)
Możemy zrobić trochę prostego split
/ pop
magicznego pokazanego tutaj ( https://stackoverflow.com/a/424006/1250044 ), aby wyodrębnić nazwę pliku (uwzględniając różnice między oknami i 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
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
import os nazwa pliku, file_extension = os.path.splitext ('/ d1 / d2 / example.cs') nazwa pliku to '/ d1 / d2 / example' file_extension to '.cs'