පයිතන් හි ගොනු නාමයෙන් දිගුව උපුටා ගැනීම


Answers:


2039

ඔව්. භාවිතා කරන්න os.path.splitext( පයිතන් 2.X ප්‍රලේඛනය හෝ පයිතන් 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', '')

15
නැවත පැමිණීම basenameනිසා මෙහි භාවිතය ටිකක් අවුල් සහගතයos.path.basename("/path/to/somefile.ext")"somefile.ext"
ජියාරෝ

17
නැහැ endswith()වැඩි අතේ ගෙන යා හැකි හා pythonic විය?
සෙබස්තියන් මැක්

79
@ klingt.net හොඳයි, එවැනි අවස්ථාවක, .asdඇත්ත වශයෙන්ම දිගුවයි !! ඔබ ඒ ගැන සිතන්නේ නම්, foo.tar.gzඑය gzip- සම්පීඩිත ගොනුවක් ( .gz) තාර ගොනුවක් ( .tar) වේ. නමුත් එය මුලින්ම gzip ගොනුවකි . එය ද්විත්ව දිගුව නැවත ලබා දෙනු ඇතැයි මම අපේක්ෂා නොකරමි.
nosklo

164
සම්මත පයිතන් ශ්‍රිත නම් කිරීමේ සම්මුතිය ඇත්තෙන්ම කරදරකාරී ය - මම මෙය නැවත බැලූ සෑම අවස්ථාවකම පාහේ එය වැරදියි splittext. මෙම නාමයේ කොටස් අතර ඇති බිඳවැටීම සංකේතවත් කිරීමට ඔවුන් යමක් කරන්නේ නම්, එය splitExtහෝ බව හඳුනා ගැනීම වඩා පහසු වනු ඇත split_ext. මෙම වැරැද්ද කළ එකම පුද්ගලයා මට විය නොහැකිද?
ArtOfWarfare

9
Ing වින්ග්ටොෆ්ට් ඔබේ අදහස් දැක්වීමේදී වර්ක්සෙග්ගේ ෆයිල් ස්ටෝරේජ් ගැන කිසිවක් සඳහන් නොකළ අතර මෙම ප්‍රශ්නයට එම සුවිශේෂී අවස්ථාව ගැන කිසිවක් නැත. ඔබ ගොනු නාමය සම්මත කළ ආකාරය සම්බන්ධයෙන් යමක් වැරදියි. os.path.splitext('somefile.ext')=> ('somefile', '.ext'). සමහර තෙවන පාර්ශවීය පුස්තකාලයක් යොමු නොකර සත්‍ය ප්‍රතිවිරුද්ධ උදාහරණයක් සපයන්න.
ගෙව්ටන්

407
import os.path
extension = os.path.splitext(filename)[1]

15
කුතුහලයෙන්, ඒ import os.pathවෙනුවට ඇයි from os import path?
කිස්වා

2
ඔහ්, මම කල්පනා කරමින් සිටියේ එය පිටුපස නිශ්චිත හේතුවක් තිබේද (සම්මුතිය හැර). මම තවමත් පයිතන් ඉගෙන ගනිමින් සිටින අතර වැඩිදුර ඉගෙන ගැනීමට කැමැත්තෙමි!
කිස්වා

56
එය සැබවින්ම රඳා පවතී, ඔබ භාවිතා කරන්නේ from os import pathනම් නම pathඔබේ දේශීය විෂය පථයට ගෙන ඇති අතර, කේතය දෙස බලන අනෙක් අයද OS මොඩියුලයේ මාර්ගය බව වහාම නොදැන සිටිය හැකිය. ඔබ import os.pathඑය භාවිතා කරන්නේ නම් එය osනාම අවකාශය තුළ තබා ගන්නා අතර ඔබ ඇමතුම ලබා දෙන ඕනෑම තැනක එය මොඩියුලයේ path()සිට osවහාම දැන ගනී.
dennmat

20
එය අර්ථාන්විතව වෙනස් නොවන බව මම දනිමි, නමුත් මම පෞද්ගලිකව මෙම ඉදිකිරීම් _, extension = os.path.splitext(filename)වඩා හොඳ පෙනුමක් ඇති බව සොයා ගතිමි .
ටිම් ගිල්බට්

3
ඔබට වඩාත් සංකීර්ණ ප්‍රකාශනයක කොටසක් ලෙස දිගුව අවශ්‍ය නම් [1] වඩාත් ප්‍රයෝජනවත් විය හැකිය: if check_for_gzip and os.path.splitext(filename)[1] == '.gz':
ජෙරාඩ්

251

3.4 අනුවාදයේ නව.

import pathlib

print(pathlib.Path('yourPath.example').suffix) # '.example'

කිසිවෙකු pathlibතවමත් සඳහන් නොකිරීම ගැන මට පුදුමයි , pathlibනියමයි!

ඔබට සියලු උපසර්ගයන් අවශ්‍ය නම් (උදා: ඔබට අ .tar.gz) තිබේ නම් , .suffixesඒවා ලැයිස්තුවක් නැවත ලබා දෙනු ඇත!


13
.tar.gz ලබා ගැනීම සඳහා උදාහරණය:''.join(pathlib.Path('somedir/file.tar.gz').suffixes)
user3780389

නියම පිළිතුර. මෙම නිබන්ධනය ප්‍රලේඛනයට වඩා ප්‍රයෝජනවත් බව මට පෙනී ගියේය
user118967

37 user3780389 "foo.bar.tar.gz" තවමත් වලංගු ".tar.gz" නොවේද? එසේ නම්, ඔබේ .suffixes[-2:]ස්නිපටය භාවිතා කළ යුත්තේ .tar.gz ලබා ගැනීම පමණි.
jeromej

112
import os.path
extension = os.path.splitext(filename)[1][1:]

තිතක් නොමැතිව දිගුවේ පෙළ පමණක් ලබා ගැනීමට.


73

සරල භාවිත අවස්ථා සඳහා එක් විකල්පයක් තිතෙන් බෙදිය හැකිය:

>>> filename = "example.jpeg"
>>> filename.split(".")[-1]
'jpeg'

ගොනුවට දිගුවක් නොමැති විට දෝෂයක් නොමැත:

>>> "filename".split(".")[-1]
'filename'

නමුත් ඔබ ප්‍රවේශම් විය යුතුයි:

>>> "png".split(".")[-1]
'png'    # But file doesn't have an extension

යුනික්ස් පද්ධතිවල සැඟවුණු ලිපිගොනු සමඟ ක්‍රියා නොකරනු ඇත:

>>> ".bashrc".split(".")[-1]
'bashrc'    # But this is not an extension

සාමාන්‍ය භාවිතය සඳහා, කැමති වන්න os.path.splitext


4
ඔබ x.tar.gz
කිරිල්

19
ඇත්ත වශයෙන්ම නොවේ. "X.tar.gz" නම් ගොනුවක දිගුව "gz" නොව "tar.gz" වේ. os.path.splitext ".os" ද දිගුවක් ලෙස ලබා දෙයි.
මුරාත් Çorlu

1
අපට [-1] වෙනුවට [1] භාවිතා කළ හැකිද? භේදය සමඟ මට [-1] තේරුම් ගත නොහැකි විය
user765443

7
[-1] තිතෙන් බෙදූ අවසන් අයිතම ලබා ගැනීමට. උදාහරණය:"my.file.name.js".split('.') => ['my','file','name','js]
Murat Çorlu

1
En බෙන්ජමින් ආර් හරි, ඔබ කරන්නේ ප්‍රති result ල ලැයිස්තුව පිළිබඳ ප්‍රශස්තිකරණයකි. ['file', 'tar', 'gz']සමග 'file.tar.gz'.split('.') එදිරිව ['file.tar', 'gz'] සමග 'file.tar.gz'.rsplit('.', 1). ඔව්, විය හැකිය.
Murat Çorlu

40

එහි පහළට එකතු කිරීම වටී, එබැවින් ඔබේ ලැයිස්තුවේ JPG නොපෙන්වන්නේ මන්දැයි ඔබ කල්පනා නොකරයි.

os.path.splitext(filename)[1][1:].strip().lower()

19

ඉහත සඳහන් ඕනෑම විසඳුමක් ක්‍රියාත්මක වේ, නමුත් ලිනක්ස් හි මම සොයාගෙන ඇත්තේ දිගු කිරීමේ නූල අවසානයේ නව රේඛාවක් ඇති අතර එමඟින් තරඟ සාර්ථක වීම වලක්වනු ඇත. strip()ක්රමය අවසානයට එකතු කරන්න . උදාහරණයක් වශයෙන්:

import os.path
extension = os.path.splitext(filename)[1][1:].strip() 

1
මගේ අවබෝධය සඳහා, දෙවන දර්ශකය / පෙත්ත ආරක්ෂා කරන අතිරේක හැසිරීම් මොනවාදැයි කරුණාකර ඔබට පැහැදිලි කළ හැකිද? (එනම් [1:]ඇතුළත .splittext(filename)[1][1:]) - කල්තියා ස්තූතියි
සැමුවෙල් හාමර්

1
එය මා වෙනුවෙන්ම හදුනාගෙන ඇත: splittext()(ඔබ '.' භාවිතා කරමින් නූලක් බෙදුවහොත් මෙන් නොව) '.' දිගුවේ අක්ෂර. අතිරේක [1:]එය ඉවත් කරයි.
සැමුවෙල් හාමර්

17

Splitext සමග ද්විත්ව දීර්ඝ ලිපි ගොනු සමඟ ගැටළු (උදා: ඇත file.tar.gz, file.tar.bz2ආදිය ..)

>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
>>> fileExtension 
'.gz'

නමුත් විය යුත්තේ: .tar.gz

හැකි විසඳුම් මෙහි ඇත


37
නැත, එය විය යුතුය .gz
රොබට් සීමර්

1
දිගු 2 ලබා ගැනීමට එය දෙවරක් කරනවාද?
maazza

1
@maazza yep. gunzip somefile.tar.gz ප්‍රතිදාන ගොනු නාමය කුමක්ද?
FlipMcF

1
'Tgz' දිගුව අප සතුව ඇත්තේ මේ නිසා ය: tar + gzip! : D
Nuno Aniceto

1
etpeterhil ඔබේ පයිතන් ස්ක්‍රිප්ට් ගොනු නාමය නිර්මාණය කිරීමට භාවිතා කරන යෙදුම ගැන දැනුවත් වීමට ඔබට අවශ්‍ය යැයි මම නොසිතමි. එය ප්‍රශ්නයේ විෂය පථයෙන් ටිකක් වැඩිය. උදාහරණය තෝරා නොගන්න, 'filename.csv.gz' ද වලංගු වේ.
FlipMcF

16

පාත්ලිබ් මොඩියුලයේ ඔබට විශාල දේවල් සොයාගත හැකිය (පයිතන් 3.x හි ඇත).

import pathlib
x = pathlib.PurePosixPath("C:\\Path\\To\\File\\myfile.txt").suffix
print(x)

# Output 
'.txt'

15

හුදෙක් 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'

14

එය පැරණි මාතෘකාවක් වුවද, මෙම නඩුවේ rpartition නමින් ඉතා සරල පයිතන් වර්ගයක් සඳහන් නොකිරීමට හේතුව කුමක්දැයි මම කල්පනා කරමි.

දී ඇති ගොනුවේ නිරපේක්ෂ මාර්ගය දීර් extension කිරීම සඳහා, ඔබට සරලව ටයිප් කළ හැකිය:

filepath.rpartition('.')[-1]

උදාහරණයක්:

path = '/home/jersey/remote/data/test.csv'
print path.rpartition('.')[-1]

ඔබට ලබා දෙනු ඇත: 'csv'


1
ඒපීඅයි ගැන හුරු නැති අය සඳහා, rpartition විසින් ටුපල් එකක් ලබා දෙයි : ("string before the right-most occurrence of the separator", "the separator itself", "the rest of the string"). බෙදුම්කරුවෙකු සොයාගත නොහැකි නම්, ආපසු ලබා දුන් ටුපල් වනුයේ : ("", "", "the original string").
නිකොලේ

12

පුදුමයට කරුණක් නම් මෙය තවම සඳහන් නොවීමයි:

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
ගොනුවේ දිගුවක් නොමැති විට මෙය ව්‍යතිරේකයකි.
thiruvenkadam

4
ගොනු නාමයක නමේ බොහෝ කරුණු අඩංගු නම් මෙම පිළිතුර ප්‍රභේදයක් නොසලකා හරිනු ඇත. උදාහරණ get_extension ('cmocka-1.1.0.tar.xz') => '.1.0.tar.xz' - වැරදිය.
PADYMKO

ADPADYMKO, IMHO එකක් ගොනු නාමයේ කොටසක් ලෙස සම්පූර්ණ නැවතුම් සහිත ගොනු නාම නිර්මාණය නොකළ යුතුය. ඉහත කේතය 'tar.xz' හි ප්‍රති result ලයක් නොවිය යුතුය
Douwe van der Leest

2
[-1]එදාට වෙනස් කරන්න .
පැස්කල් වී කූටන්

11

ඔබ භාවිතා කළ හැකිය splitමත filename:

f_extns = filename.split(".")
print ("The extension of the file is : " + repr(f_extns[-1]))

මේ සඳහා අමතර පුස්තකාලයක් අවශ්‍ය නොවේ


10
filename='ext.tar.gz'
extension = filename[filename.rfind('.'):]

2
මෙහි ප්‍රති results ලය වනුයේ filenameගොනු නාමය කිසිසේත් නොමැති නම් ආපසු ලබා දීමේ අවසාන වර්‍ගයයි .. මෙයට හේතුව rfindනූල -1සොයාගත නොහැකි නම් ආපසු පැමිණීමයි.
mattst

6

මෙය string ජු නූල් නිරූපණ ක්‍රමයකි: සඳහන් කර ඇති විසඳුම් රාශියක් මා දකින නමුත් බොහෝ දෙනා භේදය දෙස බලයි. කෙසේ වෙතත් බෙදීම එය "සෑම අවස්ථාවකම" කරයි. . ඔබ සොයන්නේ බෙදීමයි.

string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]

2
rpartition දැනටමත් @weiyixie විසින් යෝජනා කරන ලදී .
නිකොලේ

5

නිවැරදි භේදය සහිත තවත් විසඳුමක්:

# 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])

5

මෙම ප්‍රශ්නයට දැනටමත් පිළිතුරු ලැබී ඇති අතර මම විසඳුම රෙජෙක්ස් හි එක් කරමි.

>>> import re
>>> file_suffix = ".*(\..*)"
>>> result = re.search(file_suffix, "somefile.ext")
>>> result.group(1)
'.ext'

1
හෝ \.[0-9a-z]+$දී මෙන් මෙම පශ්චාත් .
pault


0

මේ සරලම ක්රමය හුදෙක් දී ගොනු සහ ව්යාප්ති දෙකම ලබා ගැනීමට තනි මාර්ගය .

fName, ext = 'C:/folder name/Flower.jpeg'.split('/')[-1].split('.')

>>> print(fName)
Flower
>>> print(ext)
jpeg

වෙනත් විසඳුම් මෙන් නොව, මේ සඳහා ඔබට කිසිදු පැකේජයක් ආනයනය කිරීමට අවශ්‍ය නොවේ.


2
මෙය සියලුම ලිපිගොනු හෝ වර්ග සඳහා ක්‍රියා
නොකරයි.

0

විනෝදය සඳහා ... දිගුව ඩෙක්ට් එකකින් එකතු කර ඒවා සියල්ලම ෆෝල්ඩරයක ලුහුබඳින්න. ඉන්පසු ඔබට අවශ්‍ය දිගු අදින්න.

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)

ඒක භයානක අදහසක්. ඔබ මීට පෙර එකතු නොකළ ඕනෑම ගොනු දිගුවක් සඳහා ඔබේ කේතය කැඩී යයි!
රොබට්

0

මේක උත්සාහ කරන්න:

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
  1. සියලුම ගොනු නාමයන් ලැයිස්තුව තුළ ලබා ගන්න
  2. ගොනුවේ නම බෙදීම සහ අවසාන දිගුව පරීක්ෂා කරන්න, එය pen_ext ලැයිස්තුවේ තිබේද නැද්ද?
  3. ඔව් නම් එය අවසන් දිගුව සමඟ සම්බන්ධ කර එය ගොනුවේ දිගුව ලෙස සකසන්න
  4. එසේ නොවේ නම් අවසාන දිගුව ගොනුවේ දිගුව ලෙස තබන්න
  5. ඉන්පසු එය පරීක්ෂා කරන්න

1
මෙය විශේෂ අවස්ථා රාශියක් සඳහා කැඩී යයි. පිළිගත් පිළිතුර බලන්න. එය රෝදය ප්‍රතිනිර්මාණය කරන්නේ දෝෂ සහිත ආකාරයකින් පමණි.
රොබට්

හෙලෝ! මෙම කේතය මඟින් ගැටළුව විසඳන්නේ කෙසේද සහ ඇයි යන්න පිළිබඳ පැහැදිලි කිරීමක් ඇතුළුව ප්‍රශ්නය විසඳිය හැකි අතර එය ඔබගේ තනතුරේ ගුණාත්මකභාවය වැඩි දියුණු කිරීමට සැබවින්ම උපකාරී වන අතර බොහෝ විට වැඩි ඡන්ද ප්‍රමාණයක් ලැබෙනු ඇත. ඔබ දැන් අසන පුද්ගලයා පමණක් නොව අනාගතයේ දී පා readers කයන් සඳහා වන ප්‍රශ්නයට පිළිතුරු සපයන බව මතක තබා ගන්න. පැහැදිලි කිරීම් එක් කිරීමට කරුණාකර ඔබේ පිළිතුර සංස්කරණය කර සීමාවන් සහ උපකල්පන අදාළ වන්නේ කුමක් දැයි ඇඟවීමක් කරන්න.
බ්‍රයන්

ඒ වගේ බ්‍රයන්?
ඉබ්නුල් හුසේනන්

ඔබ එය වඩාත් නරක අතට හැරවීම, එය නව ආකාරවලින් බිඳ දැමීම පමණි. foo.tarවලංගු ගොනු නාමයකි. මම එය ඔබේ කේතයට විසි කළහොත් කුමක් සිදුවේද? ගැන .bashrcහෝ foo? මේ සඳහා පුස්තකාල කාර්යයක් ඇත ...
රොබට්

අවසාන දිගුව සඳහා දිගු ගොනුවක් ලැයිස්තුවක් සාදන්න, ලැයිස්තුවේ නොමැති නම් අවසන් දිගුව ගොනුවේ දිගුව ලෙස තබන්න
ඉබ්නුල් හුසේනන්

-2
# 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 ""

-3
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

-5
name_only=file_name[:filename.index(".")

එමඟින් ඔබට ගොනුවේ නම පළමු "." දක්වා ලබා දෙනු ඇත, එය වඩාත් සුලභ වනු ඇත.


1
පළමුව, ඔහුට අවශ්‍ය වන්නේ නම නොව දිගුවයි. දෙවනුව, ඔහුට නමක් අවශ්‍ය වුවද, එය වැනි ලිපිගොනු මගින් වැරදියි:file.name.ext
ya_dimon

_Ya_dimon සඳහන් කළ පරිදි, මෙය තිත් සහිත ගොනු නාම සඳහා ක්‍රියා නොකරයි. ඊට අමතරව, ඔහුට දිගුව අවශ්‍යයි!
උමාර් දස්තිර්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.