จะรับชื่อไฟล์ที่ไม่มีนามสกุลจากพา ธ ใน Python ได้อย่างไร
จะรับชื่อไฟล์ที่ไม่มีนามสกุลจากพา ธ ใน Python ได้อย่างไร
คำตอบ:
รับชื่อไฟล์โดยไม่มีนามสกุล:
import os
print(os.path.splitext("/path/to/some/file.txt")[0])
พิมพ์:
/path/to/some/file
os.path.splitext
เอกสาร
หมายเหตุสำคัญ:หากชื่อไฟล์มีหลายจุดเฉพาะส่วนขยายหลังจากนามสกุลสุดท้ายจะถูกลบออก ตัวอย่างเช่น:
import os
print(os.path.splitext("/path/to/some/file.txt.zip.asc")[0])
พิมพ์:
/path/to/some/file.txt.zip
ดูคำตอบอื่น ๆ ด้านล่างหากคุณต้องการจัดการกับกรณีดังกล่าว
splitext('kitty.jpg.zip')
จะให้('kitty.jpg', '.zip')
)
splitext(basename('/some/path/to/file.txt'))[0]
(ซึ่งฉันมักจะทำ)
คุณสามารถสร้างของคุณเองด้วย:
>>> 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'
หมายเหตุสำคัญ: หากมีมากกว่าหนึ่ง.
ในชื่อไฟล์เฉพาะไฟล์ล่าสุดเท่านั้นที่จะถูกลบ ตัวอย่างเช่น:
/root/dir/sub/file.ext.zip -> file.ext
/root/dir/sub/file.ext.tar.gz -> file.ext.tar
ดูคำตอบอื่น ๆ ที่อยู่ด้านล่าง
os
แต่
ใช้pathlib
ใน Python 3.4+
from pathlib import Path
Path('/root/dir/sub/file.ext').stem
จะกลับมา
'file'
os.path
การแก้ปัญหานี้จะตัดเฉพาะส่วนขยาย (หรือsuffix
เป็นpathlib
สายมัน) Path('a.b.c').stem == 'a.b'
Path(Path('a.b.c').stem).stem
.with_suffix('')
เป็นวิธีที่จะไป p.suffix == ''
คุณอาจต้องการที่จะห่วงจน
>>> print(os.path.splitext(os.path.basename("hemanth.txt"))[0])
hemanth
`
เพื่อแสดงรหัสและ "/somepath/hermanth.txt" เป็นอินสแตนซ์ของเส้นทาง
os.path.basename
ไม่จำเป็นต้องมี os.path.basename
ควรใช้เพื่อรับชื่อไฟล์จากพา ธ ไฟล์เท่านั้น
ใน Python 3.4+ คุณสามารถใช้pathlib
วิธีแก้ปัญหาได้
from pathlib import Path
print(Path(your_path).resolve().stem)
resolve()
คือช่วยจัดการกับปัญหาหลายจุด คำตอบด้านล่างเกี่ยวกับการใช้ดัชนีจะไม่ทำงานหากเส้นทางคือ './foo.tar.gz'
https://docs.python.org/3/library/os.path.html
ใน python 3 pathlib "โมดูล pathlib เสนอวัตถุพา ธ ระดับสูง" ดังนั้น,
>>> from pathlib import Path
>>> p = Path("/a/b/c.txt")
>>> print(p.with_suffix(''))
\a\b\c
>>> print(p.stem)
c
หากคุณต้องการเก็บเส้นทางไปยังไฟล์และเพียงแค่ลบนามสกุล
>>> 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 () จะไม่ทำงานหากมีหลายจุดในส่วนขยาย
ตัวอย่างเช่น 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
คุณสามารถหาดัชนีของจุดแรกในชื่อฐานแล้วแบ่งชื่อฐานเพื่อให้ได้ชื่อไฟล์ที่ไม่มีนามสกุล
>>> 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')
ส่งข้อยกเว้น ValueError หาก.
ไม่พบเข็ม (ในกรณีข้างต้นคือจุด, ) ในกองหญ้า ไฟล์ที่ไม่มีนามสกุลก็มีเช่นกัน
@ IceAdor's หมายถึง rsplit ในความคิดเห็นถึงโซลูชั่นของ @ user2902201 rsplit เป็นวิธีที่ง่ายที่สุดที่รองรับหลายช่วงเวลา
นี่มันสะกดออกมา:
file = 'my.report.txt'
print file.rsplit('.', 1)[0]
my.report
แต่แม้ว่าฉันจะนำเข้าระบบปฏิบัติการฉันก็ไม่สามารถเรียกมันว่า path.basename เป็นไปได้หรือไม่ที่จะเรียกมันว่าโดยตรงเป็นชื่อฐาน?
import os
และจากนั้นใช้ os.path.basename
import
ไอเอ็นจีos
ไม่ได้หมายความว่าคุณสามารถใช้โดยไม่ได้หมายถึงos.foo
os
from os import foo
ใช้ได้
os
foo
path
หรือwalk
)
คิดว่าฉันจะโยนรูปแบบการใช้os.path.splitextโดยไม่ต้องใช้การทำดัชนีอาเรย์
ฟังก์ชั่นส่งคืน(root, ext)
คู่เสมอดังนั้นจึงปลอดภัยที่จะใช้:
root, ext = os.path.splitext(path)
ตัวอย่าง:
>>> import os
>>> path = 'my_text_file.txt'
>>> root, ext = os.path.splitext(path)
>>> root
'my_text_file'
>>> ext
'.txt'
วิธีอื่นไม่ได้ลบส่วนขยายหลายรายการ บางคนมีปัญหากับชื่อไฟล์ที่ไม่มีส่วนขยาย ตัวอย่างนี้เกี่ยวข้องกับทั้งสองอินสแตนซ์และใช้งานได้ทั้ง Python 2 และ 3 โดยจะจับเบสชื่อจากพา ธ แบ่งค่าตามจุดและส่งคืนอันแรกซึ่งเป็นส่วนเริ่มต้นของชื่อไฟล์
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
นี่คือชุดของตัวอย่างที่จะเรียกใช้:
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))
ในทุกกรณีค่าที่พิมพ์คือ:
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
สิ่งนี้จะคืนค่าที่filename
ไม่มีextension
(C: \ Users \ Public \ Videos \ Sample Videos \ wildlife)
temp = os.path.splitext(filename)[0]
ตอนนี้คุณสามารถได้รับเพียงfilename
จากอุณหภูมิด้วย
os.path.basename(temp) #this returns just the filename (wildlife)
โพรซีเดอร์การรับรู้ส่วนขยายจำนวนมาก ผลงานstr
และunicode
เส้นทาง ใช้งานได้ใน Python 2 และ 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)
พฤติกรรม:
>>> 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]
ในระบบ Windows ฉันใช้คำนำหน้าชื่อไดรเวอร์เช่นกันเช่น:
>>> s = 'c:\\temp\\akarmi.txt'
>>> print(os.path.splitext(s)[0])
c:\temp\akarmi
ดังนั้นเนื่องจากฉันไม่ต้องการชื่อไดรฟ์หรือชื่อไดเรกทอรีฉันจึงใช้:
>>> print(os.path.splitext(os.path.basename(s))[0])
akarmi
เพื่อความสะดวกของฟังก์ชั่นที่เรียบง่ายห่อสองวิธีจาก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
ทดสอบกับ Python 3.5
วิธีที่ง่ายที่สุดในการแก้ไขปัญหานี้คือ
import ntpath
print('Base name is ',ntpath.basename('/path/to/the/file/'))
ช่วยประหยัดเวลาและค่าใช้จ่ายในการคำนวณ
อย่างมากมากมากไม่มีโมดูลอื่น ๆ !!!
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)
เราสามารถทำอะไรง่าย ๆsplit
/ pop
เวทมนต์ตามที่เห็นที่นี่ ( https://stackoverflow.com/a/424006/1250044 ) เพื่อแยกชื่อไฟล์ (ตามหน้าต่างและความแตกต่าง 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
ชื่อไฟล์ที่นำเข้า os, file_extension = os.path.splitext ('/ d1 / d2 / example.cs') ชื่อไฟล์คือ '/ d1 / d2 / ตัวอย่าง' file_extension คือ '.cs'