มีฟังก์ชั่นในการดึงนามสกุลจากชื่อไฟล์หรือไม่?
มีฟังก์ชั่นในการดึงนามสกุลจากชื่อไฟล์หรือไม่?
คำตอบ:
ใช่. ใช้os.path.splitext
(ดูเอกสาร Python 2.XหรือเอกสารPython 3.X ):
>>> import os
>>> filename, file_extension = os.path.splitext('/path/to/somefile.ext')
>>> filename
'/path/to/somefile'
>>> file_extension
'.ext'
ไม่เหมือนกับความพยายามในการแยกสตริงด้วยตนเองส่วนใหญ่os.path.splitext
จะถือว่า/a/b.c/d
เป็นไม่มีส่วนขยายอย่างถูกต้องแทนที่จะมีส่วนขยาย.c/d
และจะถือว่า.bashrc
ไม่มีส่วนขยายแทนที่จะมีส่วนขยาย.bashrc
:
>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')
endswith()
เป็นแบบพกพาและ pythonic เพิ่มเติมหรือไม่
.asd
เป็นส่วนเสริมจริงๆ !! หากคุณคิดว่ามันfoo.tar.gz
เป็นไฟล์บีบอัด gzip ( .gz
) ซึ่งเกิดขึ้นเป็นไฟล์ tar ( .tar
) แต่เป็นไฟล์ gzipตั้งแต่แรก ฉันไม่คาดหวังให้ส่งคืนส่วนขยายแบบคู่เลย
splittext
เกือบทุกครั้งที่ผมมองอีกครั้งนี้ขึ้นมาผมว่ามันเป็นความผิดพลาดเป็นอยู่ หากพวกเขาก็จะทำอะไรที่มีความหมายการหยุดพักระหว่างส่วนของชื่อนี้ก็ต้องการจะง่ายมากที่จะรับรู้ว่ามันเป็นหรือsplitExt
split_ext
แน่นอนฉันไม่สามารถเป็นคนเดียวที่ทำผิดนี้ได้?
os.path.splitext('somefile.ext')
('somefile', '.ext')
รู้สึกฟรีให้ตัวอย่างเคาน์เตอร์จริงโดยไม่ต้องอ้างอิงห้องสมุดบุคคลที่สาม
import os.path
extension = os.path.splitext(filename)[1]
import os.path
แทนfrom os import path
?
from os import path
ชื่อpath
นั้นจะถูกนำมาใช้ในขอบเขตของคุณแล้วคนอื่นที่ดูโค้ดอาจไม่ทราบทันทีว่าพา ธ นั้นเป็นพา ธ จากโมดูลระบบปฏิบัติการ ที่ไหนที่คุณใช้import os.path
มันจะเก็บไว้ในos
เนมสเปซและทุกที่ที่คุณโทรออกคนจะรู้ว่ามันpath()
มาจากos
โมดูลทันที
_, extension = os.path.splitext(filename)
ดูดีกว่ามาก
if check_for_gzip and os.path.splitext(filename)[1] == '.gz':
ใหม่ในเวอร์ชัน 3.4
import pathlib
print(pathlib.Path('yourPath.example').suffix) # '.example'
ฉันประหลาดใจที่ยังไม่มีใครพูดถึงpathlib
มันpathlib
เยี่ยมยอด!
หากคุณต้องการคำต่อท้ายทั้งหมด (เช่นถ้าคุณมี.tar.gz
) .suffixes
จะส่งคืนรายการของพวกเขา!
''.join(pathlib.Path('somedir/file.tar.gz').suffixes)
.suffixes[-2:]
เพื่อให้มั่นใจว่าจะได้รับ. tar.gz อย่างมากเท่านั้น
import os.path
extension = os.path.splitext(filename)[1][1:]
เพื่อให้ได้ข้อความของส่วนขยายโดยไม่มีจุด
ตัวเลือกหนึ่งอาจแยกออกจากจุด:
>>> filename = "example.jpeg"
>>> filename.split(".")[-1]
'jpeg'
ไม่มีข้อผิดพลาดเมื่อไฟล์ไม่มีส่วนขยาย:
>>> "filename".split(".")[-1]
'filename'
แต่คุณต้องระวัง:
>>> "png".split(".")[-1]
'png' # But file doesn't have an extension
"my.file.name.js".split('.') => ['my','file','name','js]
['file', 'tar', 'gz']
กับ'file.tar.gz'.split('.')
เทียบ กับ['file.tar', 'gz']
'file.tar.gz'.rsplit('.', 1)
ใช่อาจจะเป็น
คุณควรคิดว่าทำไม JPG ถึงไม่ปรากฏในรายการของคุณ
os.path.splitext(filename)[1][1:].strip().lower()
วิธีการแก้ปัญหาใด ๆ ข้างต้นทำงาน แต่ใน linux ฉันได้พบว่ามีการขึ้นบรรทัดใหม่ในตอนท้ายของสตริงส่วนขยายซึ่งจะป้องกันไม่ให้ตรงกับการประสบความสำเร็จ เพิ่มstrip()
วิธีการไปยังจุดสิ้นสุด ตัวอย่างเช่น:
import os.path
extension = os.path.splitext(filename)[1][1:].strip()
[1:]
ใน.splittext(filename)[1][1:]
) - ขอบคุณล่วงหน้า
splittext()
(ไม่เหมือนถ้าคุณแบ่งสตริงโดยใช้ '.') รวมถึง '.' ตัวอักษรในส่วนขยาย เพิ่มเติม[1:]
กำจัดมัน
ด้วย splitext มีปัญหากับไฟล์ที่มีนามสกุลคู่ (เช่นfile.tar.gz
, file.tar.bz2
ฯลฯ .. )
>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
>>> fileExtension
'.gz'
แต่ควรจะ: .tar.gz
ทางออกที่เป็นไปได้อยู่ที่นี่
gunzip somefile.tar.gz
ชื่อไฟล์ที่ส่งออกคืออะไร?
คุณสามารถค้นหาสิ่งที่ยอดเยี่ยมบางอย่างในโมดูล pathlib (มีให้ใน python 3.x)
import pathlib
x = pathlib.PurePosixPath("C:\\Path\\To\\File\\myfile.txt").suffix
print(x)
# Output
'.txt'
แม้ว่าจะเป็นหัวข้อเก่า แต่ฉันสงสัยว่าทำไมไม่มีใครพูดถึง api ง่าย ๆ ของงูใหญ่ที่เรียกว่า rpartition ในกรณีนี้:
ในการรับส่วนขยายของไฟล์ที่ระบุพา ธ สัมบูรณ์คุณสามารถพิมพ์:
filepath.rpartition('.')[-1]
ตัวอย่าง:
path = '/home/jersey/remote/data/test.csv'
print path.rpartition('.')[-1]
จะให้คุณ: 'csv'
("string before the right-most occurrence of the separator", "the separator itself", "the rest of the string")
นี้: หากมีตัวคั่นไม่พบ tuple ("", "", "the original string")
ที่กลับมาจะได้รับ:
เพียงแค่ทุกคนjoin
pathlib suffixes
>>> x = 'file/path/archive.tar.gz'
>>> y = 'file/path/text.txt'
>>> ''.join(pathlib.Path(x).suffixes)
'.tar.gz'
>>> ''.join(pathlib.Path(y).suffixes)
'.txt'
แปลกใจที่สิ่งนี้ยังไม่ได้กล่าวถึง:
import os
fn = '/some/path/a.tar.gz'
basename = os.path.basename(fn) # os independent
Out[] a.tar.gz
base = basename.split('.')[0]
Out[] a
ext = '.'.join(basename.split('.')[1:]) # <-- main part
# if you want a leading '.', and if no result `None`:
ext = '.' + ext if ext else None
Out[] .tar.gz
ประโยชน์ที่ได้รับ:
ฟังก์ชั่น:
def get_extension(filename):
basename = os.path.basename(filename) # os independent
ext = '.'.join(basename.split('.')[1:])
return '.' + ext if ext else None
[-1]
แล้ว
คุณสามารถใช้split
a filename
:
f_extns = filename.split(".")
print ("The extension of the file is : " + repr(f_extns[-1]))
สิ่งนี้ไม่ต้องการไลบรารีเพิ่มเติม
filename='ext.tar.gz'
extension = filename[filename.rfind('.'):]
filename
การถูกส่งคืนถ้าชื่อไฟล์ไม่มี.
เลย นี่เป็นเพราะrfind
ส่งคืน-1
หากไม่พบสตริง
นี่เป็นเทคนิคการนำเสนอสตริงโดยตรง: ฉันเห็นวิธีแก้ปัญหามากมายที่กล่าวถึง แต่ฉันคิดว่าส่วนใหญ่มองแยก แยกได้อย่างไรก็ตามไม่ว่าจะเกิดขึ้นที่ "." ทุกครั้ง . สิ่งที่คุณต้องการจะมองหาคือพาร์ติชัน
string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]
โซลูชันอื่นที่มีการแยกขวา:
# to get extension only
s = 'test.ext'
if '.' in s: ext = s.rsplit('.', 1)[1]
# or, to get file name and extension
def split_filepath(s):
"""
get filename and extension from filepath
filepath -> (filename, extension)
"""
if not '.' in s: return (s, '')
r = s.rsplit('.', 1)
return (r[0], r[1])
แม้แต่คำถามนี้ก็ได้รับคำตอบแล้วฉันก็จะเพิ่มโซลูชันใน Regex
>>> import re
>>> file_suffix = ".*(\..*)"
>>> result = re.search(file_suffix, "somefile.ext")
>>> result.group(1)
'.ext'
ซับในตัวจริงถ้าคุณชอบ regex และมันก็ไม่สำคัญว่าคุณจะมี "." เพิ่มเติม ระหว่างกลาง
import re
file_ext = re.search(r"\.([^.]+)$", filename).group(1)
ดูผลลัพธ์ที่นี่ : คลิกที่นี่
นี่คือวิธีที่ง่ายที่สุดที่จะได้รับทั้งชื่อไฟล์และส่วนต่อขยายในเพียงเส้นเดียว
fName, ext = 'C:/folder name/Flower.jpeg'.split('/')[-1].split('.')
>>> print(fName)
Flower
>>> print(ext)
jpeg
ไม่เหมือนกับโซลูชันอื่น ๆ คุณไม่จำเป็นต้องนำเข้าแพ็คเกจใด ๆ
สำหรับ funsies ... เพียงรวบรวมนามสกุลใน dict และติดตามทั้งหมดในโฟลเดอร์ จากนั้นดึงส่วนขยายที่คุณต้องการ
import os
search = {}
for f in os.listdir(os.getcwd()):
fn, fe = os.path.splitext(f)
try:
search[fe].append(f)
except:
search[fe]=[f,]
extensions = ('.png','.jpg')
for ex in extensions:
found = search.get(ex,'')
if found:
print(found)
ลองนี้:
files = ['file.jpeg','file.tar.gz','file.png','file.foo.bar','file.etc']
pen_ext = ['foo', 'tar', 'bar', 'etc']
for file in files: #1
if (file.split(".")[-2] in pen_ext): #2
ext = file.split(".")[-2]+"."+file.split(".")[-1]#3
else:
ext = file.split(".")[-1] #4
print (ext) #5
foo.tar
เป็นชื่อไฟล์ที่ถูกต้อง จะเกิดอะไรขึ้นถ้าฉันโยนรหัสของคุณลงไป สิ่งที่เกี่ยวกับ.bashrc
หรือfoo
? มีฟังก์ชั่นห้องสมุดสำหรับสิ่งนี้ด้วยเหตุผล ...
# try this, it works for anything, any length of extension
# e.g www.google.com/downloads/file1.gz.rs -> .gz.rs
import os.path
class LinkChecker:
@staticmethod
def get_link_extension(link: str)->str:
if link is None or link == "":
return ""
else:
paths = os.path.splitext(link)
ext = paths[1]
new_link = paths[0]
if ext != "":
return LinkChecker.get_link_extension(new_link) + ext
else:
return ""
def NewFileName(fichier):
cpt = 0
fic , *ext = fichier.split('.')
ext = '.'.join(ext)
while os.path.isfile(fichier):
cpt += 1
fichier = '{0}-({1}).{2}'.format(fic, cpt, ext)
return fichier
name_only=file_name[:filename.index(".")
ซึ่งจะทำให้ชื่อไฟล์ของคุณเป็น "." อันแรกซึ่งจะเป็นชื่อสามัญที่สุด
file.name.ext
basename
ที่นี่สับสนเล็กน้อยตั้งแต่os.path.basename("/path/to/somefile.ext")
กลับมา"somefile.ext"