পাইথনের ফাইল নাম থেকে এক্সটেনশন আহরণ করা হচ্ছে


উত্তর:


1985

হ্যাঁ. ব্যবহার os.path.splitext( পাইথন ২. এক্স ডকুমেন্টেশন বা পাইথন ৩. এক্স ডকুমেন্টেশন দেখুন ):

>>> 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"
জিয়াআরো

16
না endswith()বেশী না পোর্টেবল এবং pythonic হবে?
সেবাস্তিয়ান মাচ

79
@ ক্লিংটটনেট ঠিক আছে, সেক্ষেত্রে .asdআসলেই এক্সটেনশন !! আপনি যদি এটির বিষয়ে চিন্তা করেন তবে এটি foo.tar.gzএকটি gzip- সংকুচিত ফাইল ( .gz) যা টার ফাইল ( .tar) হতে পারে । তবে এটি প্রথমে একটি জিজেপ ফাইল । আমি এটি দ্বিগুণ এক্সটেনশানটি মোটেও ফেরত প্রত্যাশা করব না।
nosklo

157
স্ট্যান্ডার্ড পাইথন ফাংশন নামকরণের কনভেনশনটি সত্যিই বিরক্তিকর - প্রায় প্রতিবারই আমি এটি পুনরায় দেখি, আমি এটি হিসাবে ভূল করি splittext। তারা যদি এই নামের অংশগুলির মধ্যে বিরতি বোঝাতে কেবল কিছু করতে পারে তবে এটি যে এটি splitExtবা এটি স্বীকৃতি দেওয়া আরও সহজ হবে split_ext। নিশ্চয়ই আমি একমাত্র ব্যক্তি হতে পারি না যে এই ভুলটি করেছে?
আর্টঅফ ওয়ারফেয়ার

9
@ উইংটোফট আপনি আপনার মন্তব্যে ওয়ার্কজেগের ফাইলস্টোরাজ সম্পর্কে কিছুই উল্লেখ করেন নি এবং এই প্রশ্নের সেই নির্দিষ্ট পরিস্থিতি সম্পর্কে কিছুই নেই। আপনি ফাইলের নামটি কীভাবে পাস করেন তাতে কিছু ভুল হতে পারে। os.path.splitext('somefile.ext')=> ('somefile', '.ext')। কিছু তৃতীয় পক্ষের লাইব্রেরি উল্লেখ না করে নিখরচায় একটি আসল পাল্টা উদাহরণ সরবরাহ করুন।
গেভিথন

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

15
আউট কৌতুহল, কেন import os.pathপরিবর্তে from os import path?
কিসওয়া

2
ওহ, আমি কেবল ভাবছিলাম যে এর পিছনে কোনও নির্দিষ্ট কারণ রয়েছে (সম্মেলন ব্যতীত)। আমি এখনও পাইথন শিখছি এবং আরও শিখতে চেয়েছি!
কিসওয়া

55
এটি সত্যই নির্ভর করে, যদি আপনি এটি ব্যবহার করেন from os import pathতবে নামটি pathআপনার স্থানীয় ক্ষেত্রের মধ্যে নেওয়া হয়েছে, অন্যরা কোডটি খুঁজছেন তারা অবিলম্বে জানেন না যে ওএস মডিউলটির পথটি। আপনি যদি import os.pathএটি ব্যবহার করেন তবে এটি এটিকে osनेमস্পেসের মধ্যে রাখে এবং আপনি যেখানেই কল করেন লোকেরা তা মডিউল path()থেকে তা osঅবিলম্বে জানতে পারে ।
dennmat

18
আমি জানি এটি শব্দার্থগতভাবে কোনও আলাদা নয়, তবে আমি ব্যক্তিগতভাবে _, extension = os.path.splitext(filename)নির্মাণটিকে আরও সুন্দর দেখাচ্ছে।
টিম গিলবার্ট

3
আপনি যদি আরও জটিল if check_for_gzip and os.path.splitext(filename)[1] == '.gz':
ভাবের

238

সংস্করণে নতুন 3.4।

import pathlib

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

আমি অবাক হয়েছি pathlibএখনও কেউ উল্লেখ করেনি, pathlibদুর্দান্ত!

আপনার যদি সমস্ত প্রত্যয় প্রয়োজন (যেমন আপনার একটি থাকে .tar.gz), .suffixesতাদের একটি তালিকা ফিরিয়ে দেবেন!


12
.tar.gz পাওয়ার জন্য উদাহরণ:''.join(pathlib.Path('somedir/file.tar.gz').suffixes)
ব্যবহারকারীর 3780389

দুর্দান্ত উত্তর। আমি এই টিউটোরিয়ালটি ডকুমেন্টেশনের চেয়ে বেশি দরকারী বলে মনে করেছি: zetcode.com/python/pathlib
ব্যবহারকারী 118967

@ ব্যবহারকারীর 3780389 "foo.bar.tar.gz" এখনও একটি বৈধ ".tar.gz" হবে না? যদি তাই হয় তবে আপনার স্নিপেটটি .suffixes[-2:]কেবলমাত্র .tar.gz সর্বাধিক প্রাপ্তি নিশ্চিত করতে ব্যবহার করা উচিত ।
জেরোমেজ

111
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

4
আপনি x.tar.gz
কিরিল

19
আসলে না। "X.tar.gz" নামের একটি ফাইলের প্রসার "gz" "tar.gz" নয়। os.path.splitext এক্সটেনশন হিসাবে ".os" দেয়।
মুরাত ওরোলু

1
আমরা কি [-1] এর পরিবর্তে [1] ব্যবহার করতে পারি? আমি বিভক্তির সাথে [-1] বুঝতে পারি না
user765443

7
[-1] বিন্দু দ্বারা বিভক্ত আইটেমের শেষ আইটেম পেতে। উদাহরণ:"my.file.name.js".split('.') => ['my','file','name','js]
মুরাত ওরলু

1
@ বেঞ্জামিনআর আহ ঠিক আছে, আপনি ফলাফলের তালিকা সম্পর্কে একটি অপ্টিমাইজেশন করছেন। ['file', 'tar', 'gz']সঙ্গে 'file.tar.gz'.split('.') বনাম ['file.tar', 'gz'] সঙ্গে 'file.tar.gz'.rsplit('.', 1)। হ্যাঁ, হতে পারে।
মুরাত

40

জেপিজি আপনার তালিকায় কেন প্রদর্শিত হচ্ছে না তা আপনি নিজেই ভাবছেন না there

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

সম্ভাব্য সমাধানগুলি এখানে


35
না, এটি .gz হওয়া উচিত
রবার্ট সিমার

1
2 এক্সটেনশন পেতে এটি কি দুবার করবেন?
maazza

1
@ মাজাজা ইয়েপ gunzip somefile.tar.gz আউটপুট ফাইলের নাম কি?
ফ্লিপএমসিএফ

1
এ কারণেই আমাদের এক্সটেনশনটি 'টিজিজেড' যার অর্থ: টার + জিজিপ! : ডি
নুনো অ্যানিসেটো

1
@ পেটারহিল, আমি মনে করি না যে আপনি চান যে পাইথন স্ক্রিপ্টটি ফাইলের নাম তৈরি করতে ব্যবহৃত অ্যাপ্লিকেশন সম্পর্কে সচেতন হতে পারে। এটি প্রশ্নের সুযোগের বাইরে কিছুটা। উদাহরণটি বেছে নেবেন না, 'filename.csv.gz'ও বেশ বৈধ।
ফ্লিপএমসিএফ 21

16

আপনি পাথলিব মডিউলে কিছু দুর্দান্ত জিনিস খুঁজে পেতে পারেন (পাইথন 3.x এ উপলব্ধ)।

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

# Output 
'.txt'

14

যদিও এটি একটি পুরাতন বিষয়, তবে আমি অবাক হয়েছি কেন এই ক্ষেত্রে আরপিটিশন নামক অজগরটির খুব সাধারণ এপিআই উল্লেখ করা হয়নি কেন:

প্রদত্ত ফাইলের পরম পাথের সম্প্রসারণ পেতে, আপনি কেবল টাইপ করতে পারেন:

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

উদাহরণ:

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

আপনাকে দেবে: 'সিএসভি'


1
এপিআই সাথে পরিচিত না তাদের জন্য, rpartition একটি tuple ফেরৎ: ("string before the right-most occurrence of the separator", "the separator itself", "the rest of the string")। কোন বিভাজক পাওয়া আছে, ফিরে tuple হবে: ("", "", "the original string")
নিকোলে

13

শুধু 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'

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
যখন ফাইলটির কোনও এক্সটেনশন না থাকে তখন এটি ব্যতিক্রম ঘটায়।
থেরুভেনকদম

4
কোনও ফাইলের নামে অনেকগুলি পয়েন্ট থাকলে এই উত্তরটি সম্পূর্ণরূপে কোনও বৈকল্পিকটিকে উপেক্ষা করে। গেট_ এক্সটেনশনের উদাহরণ ('সেমিওকা -১.০.০.টার.এক্সজেড') => '.1.0.tar.xz' - ভুল।
PADYMKO

@ প্যাডেমিকো, আইএমএইচও-র ফাইলের নামের অংশ হিসাবে পুরো স্টপসের সাথে ফাইলের নাম তৈরি করা উচিত নয়। উপরের কোডটির ফলাফল 'টার.এক্সজেড' হওয়ার কথা নয়
ডুউ ভ্যান ডের

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
filenameযদি ফাইলনামে কিছু না থাকে তবে এটি শেষ চরটি ফিরে আসার ফলাফল .দেয়। কারণ স্ট্রিংটি পাওয়া না গেলে rfindরিটার্ন -1দেয়।
ম্যাটসেট

6

এটি একটি সরাসরি স্ট্রিং প্রতিনিধিত্ব কৌশল: আমি উল্লিখিত প্রচুর সমাধান দেখতে পাচ্ছি, তবে আমি মনে করি বেশিরভাগ বিভাজনের দিকে তাকিয়ে আছে। "বিভক্ত" এটি প্রতিটি ঘটনার সাথেই করে। । আপনি বরং যা খুঁজছেন তা বিভাজন is

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]+$ হিসাবে ।
পোল্ট

2

সত্যিকারের ওয়ান-লাইনার, যদি আপনি রেজেেক্স পছন্দ করেন। এবং আপনার "অতিরিক্ত" থাকলেও কিছু যায় আসে না। মাঝখানে

import re

file_ext = re.search(r"\.([^.]+)$", filename).group(1)

ফলাফলের জন্য এখানে দেখুন: এখানে ক্লিক করুন


0

ফাইলের নাম এবং এক্সটেনশন উভয়ই একটি একক লাইনে পাওয়ার জন্য এটি সহজ পদ্ধতি

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

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

অন্যান্য সমাধানগুলির মতো নয়, আপনাকে এ জন্য কোনও প্যাকেজ আমদানি করতে হবে না।


2
এটি সমস্ত ফাইল বা প্রকারের জন্য উদাহরণস্বরূপ 'আর্কাইভ.এটার.
gz

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. ফাইলের নাম বিভাজন করা এবং পেনাল্টিমেট এক্সটেনশানটি পরীক্ষা করে দেখুন, এটি কি পেন_েক্সট তালিকায় আছে?
  3. যদি হ্যাঁ হয় তবে এটি সর্বশেষ এক্সটেনশনের সাথে যোগ দিন এবং এটি ফাইলের এক্সটেনশন হিসাবে সেট করুন
  4. যদি না হয় তবে কেবলমাত্র ফাইলের এক্সটেনশন হিসাবে শেষ এক্সটেনশনটি রেখে দিন
  5. এবং তারপরে এটি পরীক্ষা করে দেখুন

1
এটি বিশেষ মামলার একগুচ্ছের জন্য বিরতি দেয়। গৃহীত উত্তর দেখুন। এটি চাকাটিকে পুনরায় উদ্বেগ করছে, কেবল বগি পথে।
রবার্ট

আমি আমার উত্তর আপডেট করেছি
ইবনেউল হুসাইনান

হ্যালো! এই কোডটি কীভাবে এবং কেন এই সমস্যার সমাধান করে তার ব্যাখ্যা সহ প্রশ্নটি সমাধান করতে পারে যদিও আপনার পোস্টের মান উন্নত করতে সত্যই সহায়তা করবে এবং সম্ভবত আরও বেশি ভোটের ফলাফল হবে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, কেবল এখনই জিজ্ঞাসা করা ব্যক্তি নয়। দয়া করে সম্পাদনা ব্যাখ্যা যোগ করতে পারেন এবং সীমাবদ্ধতা এবং অনুমানের কি প্রয়োগ একটি ইঙ্গিত দিতে আপনার উত্তর।
ব্রায়ান

@ ব্রায়ান এর মতো?
ইবনেউল হুসেনান

আপনি কেবল এটি আরও খারাপ করছেন, এটিকে নতুন উপায়ে ভাঙ্গছেন। 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 দ্বারা উল্লিখিত হিসাবে, এই বিন্দু সহ ফাইলের নামের জন্য কাজ করবে না। এছাড়াও, তার এক্সটেনশনটি দরকার!
উমর দস্তগীর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.