পাইথনের কোনও ফাইল নাম থেকে কোনও এক্সটেনশন (বা স্ট্রিপ) কীভাবে প্রতিস্থাপন করবেন?


112

পাইথনে এমন কোনও অন্তর্নির্মিত ফাংশন রয়েছে যা কোনও ফাইল নামের এক্সটেনশন (যদি এটি থাকে) প্রতিস্থাপন করে (বা মুছে ফেলবে)?

উদাহরণ:

print replace_extension('/home/user/somefile.txt', '.jpg')

আমার উদাহরণে: /home/user/somefile.txtহয়ে উঠবে/home/user/somefile.jpg

এটি গুরুত্বপূর্ণ কিনা তা আমি জানি না, তবে আমি লিখছি এমন একটি এসসিএস মডিউলের জন্য আমার এটি দরকার। (সুতরাং সম্ভবত আমি ব্যবহার করতে পারি এমন কিছু স্ক্যাসের নির্দিষ্ট ফাংশন রয়েছে?)

আমি কিছু চাই পরিচ্ছন্ন । স্ট্রিংয়ের মধ্যে সমস্ত উপস্থিতিগুলির একটি সাধারণ স্ট্রিং প্রতিস্থাপন .txtকরা স্পষ্টতই পরিষ্কার নয়। (এটি যদি আমার ফাইলের নাম হয় তবে ব্যর্থ হবে somefile.txt.txt.txt)



স্ক্যানস একটি অ্যাকশন স্ট্রিংয়ে ফাইলবেসে উঠার অনুমতি দেয়। আপনি কি আপনার স্ক্যানগুলিকে সুনির্দিষ্ট যুক্তি পোস্ট করতে পারেন যা এটির প্রয়োজন? এটি কি কর্মের জন্য, ইমিটার, স্ক্যানারটির জন্য?
বিডবডডগ

এর মধ্যে কোনওটি আর কাজ করবে বলে মনে হচ্ছে না কারণ পথটি একটি স্ট্রিক নয় একটি পিক্সিকপথ ফেরায়: পি
শিগাটা

উত্তর:


146

Os.path.splitext চেষ্টা করুন এটি আপনার যা চান তা করা উচিত।

import os
print os.path.splitext('/home/user/somefile.txt')[0]+'.jpg'

15
@ এস.লোট: বিশ্বাস করুন বা করবেন না। কিন্তু আমি করেছিলাম. আমি সর্বদা করি. সম্ভবত ভুল পদ দিয়ে।
ereOn

@ ইরেওন: যেহেতু আপনার প্রশ্নটি প্রায় একই শব্দবন্ধ ব্যবহার করে, তাই আমি আপনাকে কিছুটা অবাক করে দিয়েছি যে আপনি এটি খুঁজে পান নি। এক্ষেত্রে আপনার প্রশ্নের 5 টি শব্দ রয়েছে - যা সঠিকভাবে মেলে।
এসলট

পরিষ্কার দেখতে os.path.join এর সাথে কেবল নতুন নামটি রাখুন।
টনি ভিজাইলাইন

4
@ টনি ভিজালাইনেন: আপনার os.path.join ব্যবহার করা উচিত নয় কারণ এটি ওএস-নির্দিষ্ট পাথ বিভাজকের সাথে পাথ উপাদানগুলিতে যোগদানের জন্য। উদাহরণস্বরূপ, print os.path.join(os.path.splitext('/home/user/somefile.txt')[0], '.jpg')ফিরে আসবে /home/user/somefile/.jpg, যা কাম্য নয়।
স্কটস্ক্লো

@ S.Lott - 99 মানুষ আপ-ভোট এই উত্তর চমত্কার পরিষ্কার অর্থ হচ্ছে এই পোস্টটি সহায়ক, সব-ক্যাপ জন্য কোন প্রয়োজন shaming
JeffThompson

91

আনাপানার জবাবটি প্রসারিত করা হচ্ছে, কীভাবে প্যাথলিব (পাইথন> = 3.4) ব্যবহার করে কোনও এক্সটেনশন সরানো হবে :

>>> from pathlib import Path

>>> filename = Path('/some/path/somefile.txt')

>>> filename_wo_ext = filename.with_suffix('')

>>> filename_replace_ext = filename.with_suffix('.jpg')

>>> print(filename)
/some/path/somefile.ext    

>>> print(filename_wo_ext)
/some/path/somefile

>>> print(filename_replace_ext)
/some/path/somefile.jpg

1
রিয়েল পাইথনের প্যাথলিব মডিউলের ব্যবহারের উদাহরণগুলির একটি ভাল লেখার ব্যবস্থা রয়েছে: রিয়েলপীথন
স্টিভেন সি হাওয়েল

2
এই উত্তরটি আমার সাধারণ পদ্ধতির, তবে আপনার একাধিক ফাইলের এক্সটেনশন থাকলে তা ব্যর্থ হবে বলে মনে হয়। উদাহরণস্বরূপ, pth = Path('data/foo.tar.gz'); print(pth.with_suffix('.jpg'))আউটপুট হবে 'data/foo.tar.jpg'। আমি মনে করি আপনি এটি করতে পারেন pth.with_suffix('').with_suffix('.jpg')তবে এটি চতুর, এবং .with_suffix('')কোনও .ফাইল এক্সটেনশনে বিন্দু সংখ্যক বিন্দু মোকাবেলার জন্য আপনাকে একটি ইচ্ছামত দীর্ঘ কলের যোগ করতে হবে (অবশ্যই, 2 টিরও বেশি একটি বহিরাগত প্রান্তের মামলা)।
টেল

@tel আপনি whileএটি সমাধান করতে একটি লুপ ব্যবহার করতে পারেন :pth = Path('data/foo.tar.gz'); while pth != pth.with_suffix(''): pth = pth.with_suffix(''); pth = pth.with_suffix('.jpg')
ডারিক

একাধিক এক্সটেনশান সমস্যার সমাধানের জন্য নীচে আমার উত্তরটি দেখুন ।
মাইকেল হল

33

@ জেথ্রো যেমন বলেছে, splitextএটি করার ঝরঝরে উপায়। তবে এক্ষেত্রে এটি নিজেকে বিভক্ত করা বেশ সহজ, যেহেতু এক্সটেনশনটি অবশ্যই চূড়ান্ত সময়ের পরে আসার ফাইলের অংশ হতে হবে :

filename = '/home/user/somefile.txt'
print( filename.rsplit( ".", 1 )[ 0 ] )
# '/home/user/somefile'

rsplitপাইথন বলে স্ট্রিং এর ডান দিক থেকে শুরু স্ট্রিং টুকরা সঞ্চালন, এবং 1সর্বাধিক একটি বিভক্ত সঞ্চালন বলছেন (যাতে যেমন 'foo.bar.baz'-> [ 'foo.bar', 'baz' ])। যেহেতু rsplitসর্বদা একটি খালি খালি অ্যারে ফিরিয়ে দেবে, 0তাই ফাইলের নাম বিয়োগের এক্সটেনশানটি পেতে আমরা নিরাপদে এটিতে সূচি দিতে পারি।


8
নোট করুন যে ব্যবহারের rsplitফলে ফটোগুলির জন্য বিভিন্ন ফলাফল হবে যা ডট দিয়ে শুরু হয় এবং এর কোনও এক্সটেনশন নেই (যেমন লিনাক্সে লুকানো ফাইলগুলি, যেমন .bashrc)। os.path.splitextএগুলির জন্য একটি খালি এক্সটেনশন ফিরিয়ে দেয় তবে rsplitব্যবহারটি পুরো ফাইল নামটিকে এক্সটেনশন হিসাবে বিবেচনা করবে।
ফ্লোরিয়ান ব্রুকার

4
এটি ফাইল নামের জন্য অপ্রত্যাশিত ফলাফলও দেবে/home/john.johnson/somefile
উইল ম্যানলে

7

আমি str.rsplit () ব্যবহার করে নিম্নলিখিত ওয়ান-লাইনার পদ্ধতির পছন্দ করি :

my_filename.rsplit('.', 1)[0] + '.jpg'

উদাহরণ:

>>> my_filename = '/home/user/somefile.txt'
>>> my_filename.rsplit('.', 1)
>>> ['/home/user/somefile', 'txt']

2
এটি ব্যর্থ হয় যদি সামারফিলের কোনও এক্সটেনশন না থাকে এবং ব্যবহারকারী 'জন.ডো' থাকে।
মারেক জেদলিস্কি

তারা সবাই কি তাহলে ব্যর্থ হবে না?
খাওয়া মিমিদিনিশ

6

পাইথন> = 3.4 এর জন্য:

from pathlib import Path

filename = '/home/user/somefile.txt'

p = Path(filename)
new_filename = p.parent.joinpath(p.stem + '.jpg') # PosixPath('/home/user/somefile.jpg')
new_filename_str = str(new_filename) # '/home/user/somefile.jpg'

1
আমি মনে করি জেএস দ্বারা প্রস্তাবিত প্যাথলিব পদ্ধতির। অনেক সহজ।
h0b0

4

একাধিক এক্সটেনশান পরিচালনা করছে

আপনার একাধিক এক্সটেনশান রয়েছে এমন ক্ষেত্রে এই ওয়ান-লাইনার ব্যবহার করে pathlibএবংstr.replace ট্রিট ব্যবহার করে:

এক্সটেনশানগুলি সরান / সরান

>>> from pathlib import Path
>>> p = Path("/path/to/myfile.tar.gz")
>>> str(p).replace("".join(p.suffixes), "")
'/path/to/myfile'

এক্সটেনশানগুলি প্রতিস্থাপন করুন

>>> p = Path("/path/to/myfile.tar.gz")
>>> new_ext = ".jpg"
>>> str(p).replace("".join(p.suffixes), new_ext)
'/path/to/myfile.jpg'

যদি আপনি কোনও pathlibঅবজেক্ট আউটপুটও চান তবে আপনি অবশ্যই লাইনটি ভিতরে আবদ্ধ করতে পারেনPath()

>>> Path(str(p).replace("".join(p.suffixes), ""))
PosixPath('/path/to/myfile')

একটি ফাংশন এ সব মোড়ানো

from pathlib import Path
from typing import Union

PathLike = Union[str, Path]


def replace_ext(path: PathLike, new_ext: str = "") -> Path:
    extensions = "".join(Path(path).suffixes)
    return Path(str(p).replace(extensions, new_ext))


p = Path("/path/to/myfile.tar.gz")
new_ext = ".jpg"

assert replace_ext(p, new_ext) == Path('/path/to/myfile.jpg')
assert replace_ext(str(p), new_ext) == Path('/path/to/myfile.jpg')
assert replace_ext(p) == Path('/path/to/myfile')

পাথলিবিতে এর জন্য একটি শর্টকাট রয়েছে: পথ () .ফুফিক্স ("") দ্বারা একটি এক্সটেনশন সরানো হবে এবং পথ.উইথ_সফিক্স ("। txt") এটি প্রতিস্থাপন করবে।
লেবি

সঠিক। তবে এটি কেবল প্রথম এক্সটেনশনটি সরিয়ে দেয়। সুতরাং উপরের উদাহরণে, with_suffixপরিবর্তে ব্যবহারের পরিবর্তে আমার উত্তরটির পরিবর্তে replaceকেবল সরিয়ে দেওয়া হবে "জেনারেল" হওয়ার লক্ষ্য ছিল, তবে আপনি যদি কেবলমাত্র একটি একক বর্ধনের আশা করেন তবে এটি একটি ক্লিনার সমাধান হবে। .gz.tar.gzwith_suffix
মাইকেল হল

3

এর আরেকটি উপায় হ'ল str.rpartition(sep)পদ্ধতিটি ব্যবহার করা ।

উদাহরণ স্বরূপ:

filename = '/home/user/somefile.txt'
(prefix, sep, suffix) = filename.rpartition('.')

new_filename = prefix + '.jpg'

print new_filename
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.