উইন্ডোজে পাইথন os.path.join


99

আমি অজগর শিখার চেষ্টা করছি এবং একটি প্রোগ্রাম তৈরি করছি যা একটি স্ক্রিপ্ট আউটপুট দেবে। আমি os.path.join ব্যবহার করতে চাই, তবে বেশ বিভ্রান্ত। ডক্স অনুসারে যদি আমি বলি:

os.path.join('c:', 'sourcedir')

আমি পেতে "C:sourcedir"। ডক্স অনুসারে, এটি স্বাভাবিক, তাই না?

তবে আমি কপিরাইট কমান্ডটি ব্যবহার করার সময় পাইথন এটি পছন্দসইভাবে আউটপুট দেয়, উদাহরণস্বরূপ:

import shutil
src = os.path.join('c:', 'src')
dst = os.path.join('c:', 'dst')
shutil.copytree(src, dst)

আমি পেয়েছি ত্রুটি কোড এখানে:

উইন্ডোজআরার: [ত্রুটি 3] সিস্টেমটি নির্দিষ্ট করা পথটি খুঁজে পাচ্ছে না: 'সি: এসসিআর /*.*'

আমি এর os.path.joinসাথে মোড়ালে যদি আমি os.path.normpathএকই ত্রুটি পাই get

যদি এটি এভাবে os.path.joinব্যবহার করা না যায় তবে আমি এর উদ্দেশ্য সম্পর্কে বিভ্রান্ত।

স্ট্যাক ওভারফ্লো দ্বারা প্রস্তাবিত পৃষ্ঠাগুলি অনুসারে, যোগে স্ল্যাশগুলি ব্যবহার করা উচিত নয় — এটি সঠিক, আমি ধরে নিই?

উত্তর:


60

উইন্ডোজ প্রতিটি ড্রাইভের জন্য বর্তমান ডিরেক্টরি একটি ধারণা আছে। এর কারণে, "c:sourcedir"বর্তমান সি: ডিরেক্টরিতে "সর্সিডির" অর্থ এবং আপনাকে একটি পরম ডিরেক্টরি উল্লেখ করতে হবে।

এগুলির যে কোনও একটিরই কাজ করা উচিত এবং একই ফলাফল দেওয়া উচিত, তবে ডাবল চেক করার জন্য আমার কাছে এই মুহুর্তে একটি উইন্ডোজ ভিএম আপ ছড়িয়ে নেই:

"c:/sourcedir"
os.path.join("/", "c:", "sourcedir")
os.path.join("c:/", "sourcedir")

8
os.path.join ('সি: /', 'সোর্সডির') আশানুরূপ কাজ করেছিল। আমি আপনাকে ধন্যবাদ জানাই খুব ভাল স্যার :) অন্যরা '//' 'সি:' 'সি: \\' কাজ করেনি (সি: two দুটি ব্যাকস্ল্যাশ তৈরি করেছে, সি: at মোটেই কাজ করেনি) ধন্যবাদ আবার ঘোস্টডোগ 74৪ , স্ম্যাসেরি এবং রজার প্যাট। আমি তোমার debtণে আছি :)
ফ্র্যাঙ্ক ই।

দুঃখিত, লাইন ব্রেকগুলি মন্তব্যে রাখা হয়নি, এটি দেখতে খুব অগোছালো দেখাচ্ছে
ফ্র্যাঙ্ক ই

এমনকি যদি এটি কিছু ক্ষেত্রে কার্যকর হয় তবে @ অ্যান্ড্রেস্টটির উত্তর অনেক ভাল সমাধান solution OS.sep ব্যবহার ওএসের উপর নির্ভর করে / এবং between এর মধ্যে চয়ন করবে।
SenhorLucas

ব্যবহার করার কোনও বিন্দু আছে os.path.joinবা os.sepআপনি যে c:কোনওভাবে নির্দিষ্ট করতে চলেছেন ? c:অন্যান্য ওএসগুলিতে কোনও ধারণা রাখে না।
naught101

এই সমস্ত সমাধান কেবল আংশিক সন্তুষ্টিজনক। আপনার যখন কোনও একক নির্দিষ্ট কেস থাকে তখন ম্যানুয়ালি বিভাজক যুক্ত করা ঠিক আছে, তবে আপনি যদি প্রোগ্রামালিকভাবে এটি করতে চান তবে সেই মানদণ্ডটি কী, যার os.path.join('c:','folder')থেকে আলাদাভাবে কাজ করে os.path.join('folder','file')? এটি কারণ :বা 'সি: `ড্রাইভের কারণে?
ভিনসেঞ্জুও

125

আরও বেশি পেডেন্টিক হওয়ার জন্য, সবচেয়ে অজগর ডকের সামঞ্জস্য উত্তরটি হ'ল:

mypath = os.path.join('c:', os.sep, 'sourcedir')

যেহেতু আপনারও পিক্সিক রুট পাথের জন্য os.sep প্রয়োজন:

mypath = os.path.join(os.sep, 'usr', 'lib')

4
আমার অজ্ঞতাটি ক্ষমা করুন - মনে হচ্ছে কোডটি এখনও উইন্ডোজ এবং লিনাক্সের মধ্যে পরিবর্তিত হয়, তবে কী os.sepউন্নত হয়?
পিয়ানোজেমস

4
ইনজেক্ট করার চেষ্টা করার সময় দয়া করে এই স্নাফুকে নোট করুন os.sep। এটি কেবল বেয়ার ড্রাইভ লেটারের পরে কাজ করে। >>> os.path.join ("সি: \ বিদায়", os.sep, "টেম্প") 'সি: \\ টেম্প'
জোবু

4
আমার উত্তর এই এক বন্ধ তৈরী করে একটি সিস্টেম অ্যাগনোস্টিক- সমাধান প্রদান @pianoJames stackoverflow.com/a/51276165/3996580
স্কট Gigante

আমি এই সমস্ত "পেডেন্টিক" সমাধানগুলির বিন্দুটি বুঝতে পারি না। os.sepআপনি যখন বিভাজক সম্পর্কে অনুমান না করে পাথ পরিচালনা করতে চান তখন কার্যকর। os.path.join()এটি ইতিমধ্যে সঠিক বিভাজকটি জানে বলে এটি ব্যবহার করা অর্থহীন । এটির অর্থহীনতাও যদি আপনার নামের সাথে স্পষ্টভাবে মূল ডিরেক্টরিটি নির্দিষ্ট করার প্রয়োজন হয় (যেমন আপনি নিজের উদাহরণে দেখতে পারেন)। কেন "c:" + os.sepকেবল সহজ পরিবর্তে "c:\\"বা সহজ os.sep + "usr"পরিবর্তে না "/usr"? এছাড়াও মনে রাখবেন যে উইন শেলগুলিতে আপনি পারবেন না cd c:তবে আপনি পারবেন cd c:\ , এটির পরামর্শ দিয়েছিল যে মূল নামটি আসলে c:\
মাইকেল একোকা

13

os.path.join('C:', 'src')আপনার প্রত্যাশার মতো কারণটি কাজ করছে না কারণ আপনি যে লিঙ্কটিতে লিঙ্ক করেছেন তার কোনও কারণ:

নোট করুন যে উইন্ডোজটিতে, যেহেতু প্রতিটি ড্রাইভের জন্য একটি বর্তমান ডিরেক্টরি রয়েছে, os.path.join ("c:", "foo") ড্রাইভ সিতে বর্তমান ডিরেক্টরিটির সাথে সম্পর্কিত একটি পথকে উপস্থাপন করে: (সি: foo), সি নয় : oo ফু।

ঘোস্টডগ যেমন বলেছিল, আপনি সম্ভবত এটি চান mypath=os.path.join('c:\\', 'sourcedir')


12

পেডেন্টিক হওয়ার জন্য, পাথ বিভাজক হিসাবে হার্ডকোড / / / হয় সম্ভবত ভাল নয়। এই সেরা হতে পারে?

mypath = os.path.join('c:%s' % os.sep, 'sourcedir')

বা

mypath = os.path.join('c:' + os.sep, 'sourcedir')

12

উইন্ডোজ এবং লিনাক্স উভয় ক্ষেত্রেই কাজ করে এমন একটি সিস্টেম-অজ্ঞোস্টিক সমাধানের জন্য, ইনপুট পাথ যাই হোক না কেন, যে কোনওটি ব্যবহার করতে পারে os.path.join(os.sep, rootdir + os.sep, targetdir)

উইন্ডোজগুলিতে:

>>> os.path.join(os.sep, "C:" + os.sep, "Windows")
'C:\\Windows'

লিনাক্সে:

>>> os.path.join(os.sep, "usr" + os.sep, "lib")
'/usr/lib'

4
ধন্যবাদ! এটি আরও কার্যকর কারণ যেহেতু এটি পূর্ববর্তী জবু উল্লিখিত গোটচায় ভোগে না: os.path.join (os.sep, "C: \\ a" + os.sep, "b") "C" দেয়: উইন্ডোজে \\ a \\ b "।
পিয়ানোজেমস

4
যদিও এই উদাহরণগুলির মধ্যে উভয়ই অজন্যস্টিক তবে কীভাবে? c:* নিক্সের usrঅস্তিত্ব নেই , এবং উইন্ডোতে উপস্থিত নেই ..
নট 101

ফাংশন কলটি os.path.join(os.sep, rootdir + os.sep, targetdir)হ'ল সিস্টেম অগনস্টিক কারণ এটি কোড পরিবর্তন করার প্রয়োজন ছাড়াই without সিস্টেম-নির্দিষ্ট উদাহরণগুলির সাথে উভয়কেই কাজ করে।
স্কট গিগান্ট

এই সমাধান, আগে এ পদে এটি অনুপ্রাণিত মতো, এখনও মত rootdir সেটিং উপর নির্ভর করে rootdir = "usr" if nix else "c:"। তবে আরও প্রত্যক্ষ এবং নির্ভুল rootdir = "/usr" if nix else "c:\\"কাজ ঠিক os.sepতেমনই অ্যাক্রোব্যাটিকস এবং পরবর্তী মাথা চুলকানো ছাড়াই করে । কোন বিপদ যে * স্নো একটি রুট ডিরেক্টরিটি একটা ফরওয়ার্ড স্ল্যাশ ছাড়া অন্য যেকোন সহ শুরু হবে, বা যে উইন্ডোজ একটি trailing কোলন এবং ব্যাকস্ল্যাশ (উইন শাঁস মধ্যে যেমন ছাড়া নামে রুট ডিরেক্টরি থাকবে, আপনি শুধু ব্যবহার করতে পারবেন না cd c:, আপনি চাই পেছনের ব্যাকস্ল্যাশ নির্দিষ্ট করা দরকার), তবে অন্যথায় কেন ভান করবেন?
মাইকেল একোকা

7

আমি বলবো এটি একটি (উইন্ডোজ) পাইথন বাগ।

বাগ কেন?

আমি মনে করি এই বিবৃতি হওয়া উচিত True

os.path.join(*os.path.dirname(os.path.abspath(__file__)).split(os.path.sep))==os.path.dirname(os.path.abspath(__file__))

তবে এটি Falseউইন্ডোজ মেশিনে রয়েছে।


4
আমি একমত হতে আগ্রহী যে এটি পাইথন বাগ তৈরি করে। এটা কি এখনও আছে? ( ২০১৫ সালের শেষের দিকে গৌরবময় ইউটোপিয়ান ভবিষ্যত থেকে লেখা Writ )
সিসিল কারি

আমি উইন্ডোজ সম্পর্কিত সম্মানের সাথে এই প্রশ্নের উত্তর দিতে পারি না, যেহেতু আমার উইন্ডোজ মেশিনে অ্যাক্সেস নেই তবে আমি অনুমান করি যে এই প্রশ্ন সম্পর্কে পাইথনের আচরণের কোনও পরিবর্তন হয়নি। যাইহোক, এই বিবৃতিটি লিনাক্স বাস্তবায়নের ক্ষেত্রেও সত্য নয়, যেহেতু প্রথম বিবৃতিটি নেতৃস্থানীয় বিভাজক (ওরফ রুট ডিরেক্টরি) ব্যতীত ফেরত পাঠায়, অন্যদিকে দ্বিতীয় বিবৃতিটি নেতৃস্থানীয় বিভাজক সহ পথ ফেরায়।
জর্জি

সুতরাং আমি এই প্রশ্নটি সম্পর্কে আমার উত্তরটি আর পছন্দ করি না। তবে আমি এ বিষয়ে পাইথনের আচরণও পছন্দ করি না।
জর্জি

@ সিসিল আমি একই প্রশ্নে এই মুহুর্তে রয়েছি ... এটি এখনও মনে হয় না।
জোশমকোড

5

উইন্ডোজ পথে যোগ দিতে, চেষ্টা করুন

mypath=os.path.join('c:\\', 'sourcedir')

মূলত, আপনার স্ল্যাশ থেকে বাঁচতে হবে


4

সর্বাধিক হার্ডকোডযুক্ত (কাঁচা স্ট্রিং লিটারেল ব্যবহার করে বা ব্যাকস্ল্যাশ থেকে বেরিয়ে আসা) থেকে শুরু করে সর্বনিম্ন উইন্ডোজে পাথের চিকিত্সার জন্য আপনার কয়েকটি সম্ভাব্য পন্থা রয়েছে। এখানে কয়েকটি উদাহরণ অনুসরণ করা হবে যা প্রত্যাশা অনুযায়ী কাজ করবে। আপনার প্রয়োজনের সাথে আরও ভাল ফিট করে এমনটি ব্যবহার করুন।

In[1]: from os.path import join, isdir

In[2]: from os import sep

In[3]: isdir(join("c:", "\\", "Users"))
Out[3]: True

In[4]: isdir(join("c:", "/", "Users"))
Out[4]: True

In[5]: isdir(join("c:", sep, "Users"))
Out[5]: True

0

@ জর্জি- এর সাথে সম্মতি

আমি তখন বলতে হবে কেন আমরা খোঁড়া প্রয়োজন os.path.join- ব্যবহার করা ভাল str.joinবা unicode.joinউদাঃ

sys.path.append('{0}'.join(os.path.dirname(__file__).split(os.path.sep)[0:-1]).format(os.path.sep))

4
হ্যাঁ, ঠিক আছে, এটি সেভাবে পরিষ্কার হয় a আপনি যখন থাকবেন তখন কেন রেজিক্সগুলি ব্যবহার করবেন না? বা একটি পার্ল স্ক্রিপ্ট কল এবং আউটপুট প্রক্রিয়া?
জিন-

আমি এটি একটি ভাল ধারণা বলে মনে করি না কারণ os.path.join বেশ ভাল শব্দার্থবিজ্ঞান ... সুতরাং আপনি এটি একটি কোডে দেখেন এবং সরাসরি কী ঘটছে তা বুঝতে পারবেন।
SenhorLucas

0

আপনার মন্তব্যের জবাব: "অন্যদের '//' 'সি:', 'সি: \\' কাজ করেনি (সি: two দুটি ব্যাকস্ল্যাশ তৈরি করেছে, সি: at মোটেই কাজ করেনি)"

উইন্ডোজ ব্যবহার করে সোসিরডিরের সামনে os.path.join('c:', 'sourcedir') স্বয়ংক্রিয়ভাবে দুটি ব্যাকস্ল্যাশ যুক্ত হবে ।\\

পাথ সমাধান করতে, যেমন পাইথন ফরওয়ার্ড স্ল্যাশ সঙ্গে এছাড়াও উইন্ডোজ উপর কাজ করে -> '/' , সহজভাবে যোগ .replace('\\','/')দিয়ে os.path.joinনীচের হিসাবে: -

os.path.join('c:\\', 'sourcedir').replace('\\','/')

যেমন: os.path.join('c:\\', 'temp').replace('\\','/')

আউটপুট: 'সি: / টেম্প'


0

প্রস্তাবিত সমাধানগুলি আকর্ষণীয় এবং একটি ভাল রেফারেন্স অফার করে তবে সেগুলি কেবল আংশিকভাবে সন্তুষ্টিজনক। আপনার যখন কোনও একক নির্দিষ্ট কেস থাকে বা আপনি ইনপুট স্ট্রিংয়ের ফর্ম্যাটটি জানেন তখন ম্যানুয়ালি পৃথককারী যুক্ত করা ঠিক আছে তবে জেনেরিক ইনপুটগুলিতে আপনি প্রোগ্রামিকভাবে এটি করতে চান এমন কিছু ক্ষেত্রে থাকতে পারে।

কিছুটা পরীক্ষা-নিরীক্ষার মাধ্যমে, আমি বিশ্বাস করি যে মাপদণ্ডটি হ'ল প্রথম বিভাগটি যদি ড্রাইভ লেটার হয় তবে পথটি ডিলিমিটার যুক্ত করা হয় না, যার অর্থ একটি একক অক্ষর যার পরে একটি কোলন থাকে, এটি সত্যিকারের ইউনিটের সাথে মিল রাখে না কেন।

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

import os
testval = ['c:','c:\\','d:','j:','jr:','data:']

for t in testval:
    print ('test value: ',t,', join to "folder"',os.path.join(t,'folder'))
test value:  c: , join to "folder" c:folder
test value:  c:\ , join to "folder" c:\folder
test value:  d: , join to "folder" d:folder
test value:  j: , join to "folder" j:folder
test value:  jr: , join to "folder" jr:\folder
test value:  data: , join to "folder" data:\folder

মানদণ্ডগুলির জন্য পরীক্ষা করার এবং কোনও পাথ সংশোধন করার জন্য একটি সুবিধাজনক উপায় os.path.splitdriveহ'ল পরীক্ষার মানটির সাথে প্রথম ফিরে আসা উপাদানটির তুলনা করে ব্যবহার করা যেতে পারেt+os.path.sep if os.path.splitdrive(t)[0]==t else t

পরীক্ষা:

for t in testval:
    corrected = t+os.path.sep if os.path.splitdrive(t)[0]==t else t
    print ('original: %s\tcorrected: %s'%(t,corrected),' join corrected->',os.path.join(corrected,'folder'))
original: c:    corrected: c:\  join corrected-> c:\folder
original: c:\   corrected: c:\  join corrected-> c:\folder
original: d:    corrected: d:\  join corrected-> d:\folder
original: j:    corrected: j:\  join corrected-> j:\folder
original: jr:   corrected: jr:  join corrected-> jr:\folder
original: data: corrected: data:  join corrected-> data:\folder

পিছনের জায়গাগুলির জন্য এটি আরও দৃust় হতে সম্ভবত উন্নতি করা যেতে পারে এবং আমি এটি কেবল উইন্ডোতে পরীক্ষা করেছি তবে আমি আশা করি এটি একটি ধারণা দেয়। ওস.পাথও দেখুন : আপনি কি এই আচরণটি ব্যাখ্যা করতে পারেন? উইন্ডোজ অন্যান্য সিস্টেমে আকর্ষণীয় বিশদ জন্য।

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