পাইথন os.path.join () একটি তালিকায়


97

আমি করতে পারি

>>> os.path.join("c:/","home","foo","bar","some.txt")
'c:/home\\foo\\bar\\some.txt'

কিন্তু যখন আমি করি

>>> s = "c:/,home,foo,bar,some.txt".split(",")
>>> os.path.join(s)
['c:/', 'home', 'foo', 'bar', 'some.txt']

আমি এখানে কি মিস করছি?

উত্তর:


197

সমস্যাটি হ'ল আর্গুমেন্ট হিসাবে os.path.joinগ্রহণ করবেন না list, এটি পৃথক যুক্তি থাকতে হবে।

এখানেই *'স্প্ল্যাট' অপারেটর খেলতে আসে ...

আমি করতে পারি

>>> s = "c:/,home,foo,bar,some.txt".split(",")
>>> os.path.join(*s)
'c:/home\\foo\\bar\\some.txt'

10
স্প্ল্যাটের জন্য আরও কিছু প্রসঙ্গ: docs.python.org/2/tutorial/…
ওয়ান

4
মনে রাখবেন যে আমি একটি পূর্ণ পথের শেষ অংশটি সরিয়ে ফেলতে এটি ব্যবহার করার চেষ্টা করেছি। এটির ফলে (ম্যাকে) ত্রুটি হয়েছে , কারণ এটিতে প্রথম স্ল্যাশ অনুপস্থিত /Users/...। এর সমাধানের জন্য, আমি যুক্ত করেছি যে ম্যানুয়ালি স্ল্যাশ করতে নেতৃত্ব দেওয়া হচ্ছে, যদি কেউ একই সমস্যার মুখোমুখি হয় ...
J0ANMM

23

ধরে joinনিই যে সেভাবে ডিজাইন করা হয়নি (এটি এটিজটওএ যেমন উল্লেখ করেছে), এবং এটি কেবল দুটি পরামিতি নিয়েছে, আপনি এখনও বিল্ট-ইন ব্যবহার করতে পারেন reduce:

>>> reduce(os.path.join,["c:/","home","foo","bar","some.txt"])
'c:/home\\foo\\bar\\some.txt'

একই আউটপুট:

>>> os.path.join(*["c:/","home","foo","bar","some.txt"])
'c:/home\\foo\\bar\\some.txt' 

কেবল সম্পূর্ণতা এবং শিক্ষামূলক কারণে (এবং অন্যান্য পরিস্থিতিতে যেখানে *কাজ করে না)।

পাইথন 3 এর ইঙ্গিত

reducefunctoolsমডিউলে সরানো হয়েছিল ।


4
পাইথন 3- reduceতে functoolsআমার মতো অন্য কেউ এটির সন্ধানে মডিউলে স্থানান্তরিত হয়েছিল।
আদম বদুরা

ইঙ্গিত দেওয়ার জন্য আপনাকে ধন্যবাদ, আমি আমার উত্তরটি সামঞ্জস্য করব।
থারস্টেন ক্র্যানজ

4
দয়া যে অজগরটি আলিঙ্গন এবং খোলার পরিবর্তে ক্রিয়ামূলক স্টাইল থেকে আরও বেশি দূরে চলে। চলন্ত reduceএকটি মডিউল দূরে একটি বিবৃতি হল।
শেরনান্দেজ

এমনকি 2.7 এ কেউ করতে পারেনfrom functools import reduce
দু'হাইম

14

তালিকাটি খালি থাকতে পারে এমন পরিস্থিতিতে আমি হোঁচট খেয়েছি। এই ক্ষেত্রে:

os.path.join('', *the_list_with_path_components)

প্রথম যুক্তিটি নোট করুন, যা ফলাফলকে পরিবর্তন করবে না।


8

এটা ঠিক পদ্ধতি। আপনি কিছু মিস করছেন না। সরকারী ডকুমেন্টেশন দেখায় যা আপনি বিভিন্ন পাথ সরবরাহ তালিকা unpacking ব্যবহার করতে পারেন:

s = "c:/,home,foo,bar,some.txt".split(",")
os.path.join(*s)

*sশুধু sইন এর আন্তঃ দ্রষ্টব্য os.path.join(*s)। তারকাচিহ্নটি ব্যবহার করে তালিকার আনপ্যাকিং ট্রিগার করবে, যার অর্থ প্রতিটি তালিকার যুক্তি পৃথক যুক্তি হিসাবে ফাংশনে সরবরাহ করা হবে।


আপনার লিঙ্কটিতে আরও একবার নজর দেওয়া ;-)
থারস্টেন ক্র্যাঞ্জ

@ গ্রেগ এস-তে অগ্রাধিকারে প্রাসঙ্গিক অংশগুলিকে উত্তরে অনুলিপি করা এবং কেবল একটি লিঙ্ক পেস্ট করুন না, সম্ভবত তাই
নিম্নবর্ণদের

2

আপনি যদি কার্যকরী প্রোগ্রামিং দৃষ্টিকোণ থেকে এটি ভাবতে চান তবে এটি একটি সাধারণ মানচিত্রের ক্রিয়াকলাপ হ্রাস হিসাবেও ভাবা যেতে পারে।

import os
folders = [("home",".vim"),("home","zathura")]
[reduce(lambda x,y: os.path.join(x,y), each, "") for each in folders]

reduceপাইথন ২.x এ অন্তর্নির্মিত পাইথন 3.x এ এটি সরানো হয়েছে itertoolsতবে স্বীকৃত উত্তরটি আরও ভাল।

এটি নীচে জবাব দেওয়া হয়েছে তবে আপনার কাছে যোগ দেওয়া দরকার এমন আইটেমের একটি তালিকা থাকলে উত্তর দেওয়া হচ্ছে।

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