Làm cách nào để có được tên tệp mà không có phần mở rộng từ một đường dẫn trong Python?
Làm cách nào để có được tên tệp mà không có phần mở rộng từ một đường dẫn trong Python?
Câu trả lời:
Lấy tên của tệp mà không cần phần mở rộng:
import os
print(os.path.splitext("/path/to/some/file.txt")[0])
Bản in:
/path/to/some/file
Tài liệu choos.path.splitext
.
Lưu ý quan trọng: Nếu tên tệp có nhiều dấu chấm, chỉ phần mở rộng sau phần cuối cùng bị xóa. Ví dụ:
import os
print(os.path.splitext("/path/to/some/file.txt.zip.asc")[0])
Bản in:
/path/to/some/file.txt.zip
Xem các câu trả lời khác dưới đây nếu bạn cần xử lý trường hợp đó.
splitext('kitty.jpg.zip')
sẽ cho ('kitty.jpg', '.zip')
).
splitext(basename('/some/path/to/file.txt'))[0]
(điều mà tôi dường như luôn luôn làm)
Bạn có thể làm cho riêng mình với:
>>> 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'
Lưu ý quan trọng: Nếu có nhiều hơn một .
trong tên tệp, chỉ có cái cuối cùng bị xóa. Ví dụ:
/root/dir/sub/file.ext.zip -> file.ext
/root/dir/sub/file.ext.tar.gz -> file.ext.tar
Xem dưới đây cho câu trả lời khác giải quyết rằng.
os
mặc dù.
Sử dụng pathlib
trong Python 3.4+
from pathlib import Path
Path('/root/dir/sub/file.ext').stem
sẽ trở lại
'file'
os.path
các giải pháp, điều này sẽ chỉ loại bỏ một phần mở rộng (hoặc suffix
, như cách pathlib
gọi nó). Path('a.b.c').stem == 'a.b'
Path(Path('a.b.c').stem).stem
.with_suffix('')
là cách để đi. Bạn có thể muốn lặp lại cho đến khi p.suffix == ''
.
>>> print(os.path.splitext(os.path.basename("hemanth.txt"))[0])
hemanth
`
để hiển thị mã và "/somepath/hermanth.txt" làm ví dụ đường dẫn.
os.path.basename
không cần thiết. os.path.basename
chỉ nên được sử dụng để lấy tên tệp từ đường dẫn tệp.
Trong Python 3.4+, bạn có thể sử dụng pathlib
giải pháp
from pathlib import Path
print(Path(your_path).resolve().stem)
resolve()
là con đường? Có thực sự có thể có được một đường dẫn đến một tập tin và không có tên tệp là một phần của đường dẫn mà không có điều đó? Điều này có nghĩa là nếu bạn đưa ra một đường dẫn đến symlink, bạn sẽ trả lại tên tệp (không có phần mở rộng) của tệp mà symlink trỏ tới.
resolve()
là để giúp giải quyết vấn đề nhiều dấu chấm. Câu trả lời bên dưới về việc sử dụng chỉ mục sẽ không hoạt động nếu đường dẫn là './foo.tar.gz'
https://docs.python.org/3/l Library / os.path.html
Trong python 3 pathlib "Mô-đun pathlib cung cấp các đối tượng đường dẫn mức cao." vì thế,
>>> from pathlib import Path
>>> p = Path("/a/b/c.txt")
>>> print(p.with_suffix(''))
\a\b\c
>>> print(p.stem)
c
Nếu bạn muốn giữ đường dẫn đến tệp và chỉ cần xóa phần mở rộng
>>> 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 () sẽ không hoạt động nếu có nhiều dấu chấm trong phần mở rộng.
Ví dụ: hình ảnh.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
Bạn chỉ có thể tìm thấy chỉ mục của dấu chấm đầu tiên trong tên cơ sở và sau đó cắt tên cơ sở để chỉ lấy tên tệp mà không cần mở rộng.
>>> 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')
sẽ ném ngoại lệ ValueError nếu .
không tìm thấy kim (trong trường hợp trên là dấu chấm ) trong haystack. Các tập tin không có bất kỳ phần mở rộng tồn tại quá.
Nhưng ngay cả khi tôi nhập os, tôi không thể gọi nó là path.basename. Có thể gọi nó là trực tiếp như tên cơ sở?
import os
và sau đó sử dụng os.path.basename
import
ing os
không có nghĩa là bạn có thể sử dụng os.foo
mà không cần tham khảo os
.
from os import foo
.
os
mô-đun nếu nó có một thành viên được gọi foo
.
path
, xem xét , hoặc walk
).
Nghĩ rằng tôi sẽ sử dụng os.path.splitext mà không cần sử dụng lập chỉ mục mảng.
Hàm luôn trả về một (root, ext)
cặp để sử dụng an toàn:
root, ext = os.path.splitext(path)
Thí dụ:
>>> import os
>>> path = 'my_text_file.txt'
>>> root, ext = os.path.splitext(path)
>>> root
'my_text_file'
>>> ext
'.txt'
Các phương pháp khác không xóa nhiều tiện ích mở rộng. Một số cũng có vấn đề với tên tệp không có phần mở rộng. Đoạn mã này xử lý cả hai phiên bản và hoạt động trong cả Python 2 và 3. Nó lấy tên cơ sở từ đường dẫn, chia giá trị trên các dấu chấm và trả về cái đầu tiên là phần đầu tiên của tên tệp.
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
Đây là một tập hợp các ví dụ để chạy:
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))
Trong mọi trường hợp, giá trị được in là:
FileName
Path('/path/to/file.txt').stem
. (1,23μs so với 8,39μs)
import os
filename = C:\\Users\\Public\\Videos\\Sample Videos\\wildlife.wmv
Điều này trả về filename
mà không có extension
(C: \ Users \ Public \ Video \ Video mẫu \ động vật hoang dã)
temp = os.path.splitext(filename)[0]
Bây giờ bạn có thể nhận được chỉ filename
từ temp với
os.path.basename(temp) #this returns just the filename (wildlife)
Một thủ tục nhận thức nhiều phần mở rộng. Hoạt động cho str
và unicode
đường dẫn. Hoạt động trong Python 2 và 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)
Hành vi:
>>> 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]
Để thuận tiện, một hàm đơn giản bao gồm hai phương thức từ 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
Đã thử nghiệm với Python 3.5.
cách dễ nhất để giải quyết điều này là
import ntpath
print('Base name is ',ntpath.basename('/path/to/the/file/'))
Điều này giúp bạn tiết kiệm thời gian và chi phí tính toán.
Rất rất rất rất đơn giản không có mô-đun nào khác !!!
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)
Chúng ta có thể làm một số đơn giản split
/ pop
kỳ diệu như đã thấy ở đây ( https://stackoverflow.com/a/424006/1250044 ), để trích xuất các tên tập tin (tôn trọng các cửa sổ và sự khác biệt 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
nhập tên tệp os, file_extension = os.path.splitext ('/ d1 / d2 / example.cs') tên tệp là '/ d1 / d2 / example' file_extension là '.cs'