পাইথনের উপাদানগুলির মধ্যে কীভাবে কোনও ডস পাথ বিভক্ত করা যায়


153

আমার একটি স্ট্রিং ভেরিয়েবল রয়েছে যা ডস পাথের প্রতিনিধিত্ব করে যেমন:

var = "d:\stuff\morestuff\furtherdown\THEFILE.txt"

আমি এই স্ট্রিংটিতে বিভক্ত করতে চাই:

[ "d", "stuff", "morestuff", "furtherdown", "THEFILE.txt" ]

আমি ব্যবহার করার চেষ্টা করেছি split()এবং replace()তবে তারা হয় কেবল প্রথম ব্যাকস্ল্যাশ প্রক্রিয়াজাত করে অথবা তারা স্ট্রিংয়ে হেক্স নম্বরগুলি সন্নিবেশ করায়।

আমাকে এই স্ট্রিং ভেরিয়েবলটি কোনওভাবে কাঁচা স্ট্রিংয়ে রূপান্তর করতে হবে যাতে আমি এটি পার্স করতে পারি।

এটি করার সর্বোত্তম উপায় কী?

আমার আরও যোগ করা উচিত varযে আমি যে পথটিকে বিশ্লেষণের চেষ্টা করছি তার সামগ্রীর উপাদানগুলি হ'ল একটি কমান্ড লাইন ক্যোয়ারির রিটার্ন মান। আমি নিজে তৈরি করি এমন কোনও পথের ডেটা নয়। এটি কোনও ফাইলে সংরক্ষণ করা হয়েছে এবং কমান্ড লাইন সরঞ্জামটি ব্যাকস্ল্যাশগুলি থেকে মুক্তি পাবে না।


6
আপনি এই উত্তরগুলি পর্যালোচনা os.path.splitকরার সাথে সাথে মনে রাখবেন যে এটি আপনার পক্ষে কাজ করছে না কারণ আপনি সেই স্ট্রিংটি যথাযথভাবে ছাড়ছেন না।
জেদ স্মিথ

আপনার পক্ষে স্ট্রিং থেকে বাঁচতে হবে বা কাঁচা স্ট্রিং ব্যবহার করতে হবে: ভুল ব্যাখ্যা দেওয়ার r"d:\stuff\morestuff\furtherdown\THEFILE.txt"মতো জিনিসগুলি রোধ করতে \s
স্মি

উত্তর:


164

লোকেরা তাদের নিজস্ব পাথরের ফিডিং ফাংশনগুলি লিখে ভুল হয়ে গেছে load স্পেসস, স্ল্যাশস, ব্যাকস্ল্যাশস, কোলোনস - বিভ্রান্তির সম্ভাবনাগুলি অন্তহীন নয়, তবে ভুলগুলি সহজেই করা যায়। সুতরাং আমি ব্যবহারের জন্য একটি স্টিকার আছি os.pathএবং সেই ভিত্তিতে এটির প্রস্তাব দিন।

(তবে, পুণ্যের দিকে যাওয়ার পথটি সহজেই নেওয়া যায় না এবং অনেক লোক এটি সন্ধান করার পরে পিচ্ছিল পথ অবলম্বন করার জন্য প্রলুব্ধ হয় one তারা একদিন যতক্ষণ না সমস্ত কিছু টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো না হওয়া পর্যন্ত তারা বুঝতে পারবে না) এবং সম্ভবত, অন্য কারও কারও জন্য কাজ করতে হবে কেন সব কিছু ভুল হয়ে গেছে, এবং দেখা গেছে যে কেউ ফাইল ফাইল তৈরি করেছে যা স্ল্যাশ এবং ব্যাকস্ল্যাশগুলিতে মিশ্রিত হয়েছে - এবং কোনও ব্যক্তি পরামর্শ দিয়েছেন যে উত্তরটি "এটি না করা" Don এই লোকগুলির মধ্যে কেউ হবেন না sla যিনি স্ল্যাশ এবং ব্যাকস্ল্যাশ মিশ্রিত করেছেন তিনি ব্যতীত - আপনি যদি চান তবে আপনি সেগুলি হতে পারেন))

আপনি ড্রাইভ এবং পাথ + ফাইলটি এই জাতীয়ভাবে পেতে পারেন:

drive, path_and_file = os.path.splitdrive(path)

পাথ এবং ফাইলটি পান:

path, file = os.path.split(path_and_file)

পৃথক ফোল্ডারের নাম পাওয়া বিশেষত সুবিধাজনক নয়, তবে এটি হ'ল স্নায়বিক অস্বস্তিযুক্ত অস্বস্তি যা পরে এমন কিছু খুঁজে পাওয়ার আনন্দকে আরও বাড়িয়ে তোলে যা আসলে ভালভাবে কাজ করে:

folders = []
while 1:
    path, folder = os.path.split(path)

    if folder != "":
        folders.append(folder)
    else:
        if path != "":
            folders.append(path)

        break

folders.reverse()

(এটি একটি পপ "\"শুরুতে foldersযদি পথ মূলত পরম ছিল। যদি আপনি যে চাইনি আপনি কোড একটি বিট হারাতে পারেন।)


@ ব্রোন - ব্যাকস্ল্যাশ থেকে বেরিয়ে আসার বিষয়ে চিন্তা করার চেয়ে আমি এই সমাধানটি ব্যবহার করতে পছন্দ করি। ধন্যবাদ!
BeeBand

1
আমি ভুল প্রমাণিত হতে পেরে খুশি হব তবে আমার কাছে প্রস্তাবিত সমাধানটি কাজ না করে বলে মনে হচ্ছে যদি এই "সি: r usr \ rs0 \ my0 \ in111102.log" এর মতো কোনও পথ ব্যবহার করা হয় (প্রাথমিক ইনপুটটি কাঁচা স্ট্রিং না হয় তবে) )?
শেয়ারিচার্ড

1
দেখে মনে হচ্ছে এটি কোনও পাথকে সঠিকভাবে বিভক্ত করবে না যদি এটিতে কেবল OSX এর মধ্যে একটি ডিরেক্টরি থাকে যেমন "/ path / to / আমার / ফোল্ডার /", যাতে আপনি এই দুটি লাইন শুরুতে যুক্ত করতে চান তা অর্জন করতে: if path.endswith("/"):এবং path = path[:-1]
কেভিন লন্ডন

1
আমি
@

1
আমি সাথে একমত jaycode : Tompa এর সমাধান হয় ক্যানোনিকাল পদ্ধতি এবং গৃহীত উত্তর হওয়া উচিত ছিল। এই অত্যধিক জটিল, অদক্ষ এবং ত্রুটি-প্রবণ বিকল্প উত্পাদন কোডে মাস্টার পাস করতে ব্যর্থ। আছে কোন প্রচেষ্টা (... এবং ব্যর্থ, অবশ্যই) iteratively এই pathnames পৃথক্ বিশ্লেষণ করতে যখন সহজ স্ট্রিং বিভাজন শুধুমাত্র একটি সঙ্গে সফল যুক্তিসংগত কারণ কোডের একক লাইন।
সিসিল কারি

287

আমি করবো

import os
path = os.path.normpath(path)
path.split(os.sep)

প্রথমে ওএসের জন্য একটি স্ট্রিংয়ে পাথ স্ট্রিংটিকে স্বাভাবিক করুন। তারপরে os.sepঅবশ্যই স্ট্রিং ফাংশন বিভাজনে একটি সীমানা হিসাবে ব্যবহার করা নিরাপদ safe


25
একটি সত্য উত্তর: এটি উত্থিত হয়েছে । ক্যানোনিকাল সমাধান অবশ্যই সহজতম। দেখ! কারণ এটি মার্জিত এবং সংশ্লেষজনক এবং এর কোনও অপ্রয়োজনীয় প্রান্তের কেস নেই।
সিসিল কারি

20
ওয়ান-লাইনার হিসাবে,os.path.normpath(a_path).split(os.path.sep)
ড্যানিয়েল ফারেল

2
এটি পথ = মূলের জন্য কাজ করছে বলে মনে হচ্ছে না। সেক্ষেত্রে, পথ.স্প্লিটের ফলাফল ['', '']। আসলে সাধারণভাবে, এই বিভাজন () সমাধানটি খালি স্ট্রিং নাম (যা উপযুক্ত স্ল্যাশ দ্বারা প্রতিস্থাপন করা যেতে পারে) সহ একটি বাম দিকের ডিরেক্টরি দেয়। মূল সমস্যাটি হ'ল একটি একক স্ল্যাশ (ওএসের উপর নির্ভর করে এগিয়ে বা পিছনে) হ'ল মূল ডিরেক্টরিটির নাম , অন্যদিকে যেখানে অন্যত্র এটি পৃথককারী
বিশ্বব্যাপী

2
এটি কি তখন একটি লিস্ট্রিপ দিয়ে আরও ভাল কাজ করবে? os.path.normpath(path).lstrip(os.path.sep).split(os.path.sep)
বিদার

1
@ ইউজার 60561 কারণ লিনাক্সে, ব্যাকস্ল্যাশ ফাইলের নামগুলিতে একটি অনুমোদিত চরিত্র, অন্যদিকে উইন্ডোজে একটি ফরোয়ার্ড স্ল্যাশ হয় না। এজন্য উইন্ডোজে, normpathবিভাজক হিসাবে ফরোয়ার্ড স্ল্যাশকে স্বীকৃতি দেবে। লিনাক্স-এ, normpathকেবল ধরে নেওয়া হবে যে আপনার কাছে একটি ডিরেক্টরি বলা হয় \1\2এবং এর ভিতরে একটি ফাইল বা ডিরেক্টরি রয়েছে 3
ভোজিসলাভ স্টোজকোভিক

81

আপনি কেবল সর্বাধিক পাইথোনিক পদ্ধতির (আইএমএইচও) ব্যবহার করতে পারেন:

import os

your_path = r"d:\stuff\morestuff\furtherdown\THEFILE.txt"
path_list = your_path.split(os.sep)
print path_list

যা আপনাকে দেবে:

['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

এখানে ক্লুটি os.sepপরিবর্তে '\\'বা এর পরিবর্তে ব্যবহার করা হয় '/', কারণ এটি এটি সিস্টেমকে স্বতন্ত্র করে তোলে।

ড্রাইভ লেটার থেকে কোলন অপসারণ করতে (যদিও আপনি এটি করতে চান তার কোনও কারণ আমি দেখতে পাচ্ছি না), আপনি লিখতে পারেন:

path_list[0] = path_list[0][0]

22
এটি কাজ করে some times। অন্যান্য সময় (কমপক্ষে উইন্ডোজে) আপনি দেখতে পাথগুলি দেখতে পাবেন folder\folder2\folder3/file.txt। প্রথমে পাথটিকে স্বাভাবিককরণ (os.path.normpath) করা ভাল এবং তারপরে এটি ভাগ করা।
ভিকি ২

7
এই উত্তর প্রায় ছিল। হিসাবে vikki প্রস্তাব দেওয়া, আগে স্ট্রিং বিভাজন মন্ত্র স্বাভাবিক pathnames ব্যর্থতা প্রচলিত প্রান্ত ক্ষেত্রে নিয়তি (যেমন, /foo//bar)। দেখুন Tompa এর উত্তর একটি আরো জোরালো সমাধান জন্য।
সিসিল কারি

62

পাইথন> = 3.4 এ এটি অনেক সহজ হয়ে গেছে। আপনি এখন pathlib.Path.partsকোনও পাথের সমস্ত অংশ পেতে ব্যবহার করতে পারেন।

উদাহরণ:

>>> from pathlib import Path
>>> Path('C:/path/to/file.txt').parts
('C:\\', 'path', 'to', 'file.txt')
>>> Path(r'C:\path\to\file.txt').parts
('C:\\', 'path', 'to', 'file.txt')

পাইথন 3 এর একটি উইন্ডোজ ইনস্টল-এ এটি ধরে নেওয়া হবে যে আপনি উইন্ডোজ পাথের সাথে কাজ করছেন এবং * নিক্সে এটি ধরে নেওয়া হবে যে আপনি পিক্সিক পাথ নিয়ে কাজ করছেন। এটি সাধারণত আপনি যা চান তা হয় তবে এটি যদি না হয় তবে আপনি ক্লাসগুলি pathlib.PurePosixPathবা pathlib.PureWindowsPathপ্রয়োজন মতো ব্যবহার করতে পারবেন :

>>> from pathlib import PurePosixPath, PureWindowsPath
>>> PurePosixPath('/path/to/file.txt').parts
('/', 'path', 'to', 'file.txt')
>>> PureWindowsPath(r'C:\path\to\file.txt').parts
('C:\\', 'path', 'to', 'file.txt')
>>> PureWindowsPath(r'\\host\share\path\to\file.txt').parts
('\\\\host\\share\\', 'path', 'to', 'file.txt')

সম্পাদনা: পাইথন 2 এর ব্যাকপোর্টও উপলব্ধ রয়েছে: প্যাথলিব 2


3
প্যাথ.পার্টসটি হ'ল আমি সবসময় চেয়েছিলাম তবে আমি আজ অবধি জানি না known
জামেঞ্জেরি

কেন এটি একটি সুন্দর নেটিভ অজগর ফাংশনটির চারপাশে মোড়ানো হয়নি?
এডুয়ার্ডো পিগনেটেলি

2
এই উত্তর!
নাইরেজ

11

এখানে সমস্যাটি শুরু হয় আপনি কীভাবে প্রথম স্থানে স্ট্রিং তৈরি করছেন তা দিয়ে শুরু হয়।

a = "d:\stuff\morestuff\furtherdown\THEFILE.txt"

: এই ভাবে সম্পন্ন, পাইথন বিশেষ ক্ষেত্রে এই চেষ্টা করছে \s, \m, \f, এবং \T। আপনার ক্ষেত্রে, \fফর্মফিড (0x0C) হিসাবে বিবেচনা করা হচ্ছে যখন অন্য ব্যাকস্ল্যাশগুলি সঠিকভাবে পরিচালনা করা হয়। আপনার যা করতে হবে তা হ'ল:

b = "d:\\stuff\\morestuff\\furtherdown\\THEFILE.txt"      # doubled backslashes
c = r"d:\stuff\morestuff\furtherdown\THEFILE.txt"         # raw string, no doubling necessary

তারপরে আপনি এইগুলির দুটি একবারে বিভক্ত হয়ে গেলে আপনি যা চান ফলাফল পাবেন get


@W। ক্রেগ ট্রেডার - ধন্যবাদ, তবে এই পথটি আমি নিজেই তৈরি করি না - এটি অন্য প্রোগ্রাম থেকে আমার কাছে ফিরে আসে এবং আমাকে এই ডেটাটি একটি ভেরিয়েবলে সংরক্ষণ করতে হয়। আমি নিশ্চিত না যে কীভাবে কোনও ভেরিয়েবলে সঞ্চিত ডেটা "কাঁচা পাঠ্যে" রূপান্তর করতে হয়।
BeeBand

"কাঁচা পাঠ্য" বলে কিছু নেই ... উত্সে আপনি এটি কীভাবে উপস্থাপন করেন তা ঠিক। হয় স্ট্রিংয়ের জন্য আর "" প্রিপেন্ড করুন, অথবা এটির মাধ্যমে পাস করুন ('\\', '/')
মার্কো মারিয়ানি

@ বিবিন্ড, অন্যান্য প্রোগ্রাম থেকে আপনি কীভাবে ডেটা ফিরিয়ে আনছেন? আপনি কি এটি ফাইল, পাইপ, সকেট থেকে পড়ছেন? যদি তা হয় তবে আপনার অভিনব কিছু করার দরকার নেই; ব্যাকস্ল্যাশ দ্বিগুণ করার বা কাঁচা স্ট্রিং ব্যবহার করার একমাত্র কারণ হ'ল পাইথন কোডে স্ট্রিং ধ্রুবক স্থাপন করা। অন্যদিকে, অন্য প্রোগ্রামটি যদি দ্বিগুণ-ব্যাকস্ল্যাশ তৈরি করে, তবে আপনি আপনার পথটি বিভক্ত করার আগে এটি পরিষ্কার করতে চান।
ক্রেগ ট্রেডার

@W। ক্রেগ ট্রেডার - আমি এটি একটি ফাইল থেকে পড়ছি, যা অন্য কোনও প্রোগ্রাম দ্বারা রচিত হয়। আমি পেতে পারি না split()বা replace()কোনও কারণে কাজ করতে পারি - আমি হেক্স মান পেতে থাকি। যদিও আপনি ঠিক বলেছেন, আমি মনে করি আমি কাঁচা স্ট্রিং আইডিয়াটি দিয়ে ভুল গাছটি ছাঁটাই করছি - আমার মনে হয় আমি কেবল split()ভুলভাবে ব্যবহার করছি । কারণ আমি এই সমাধানগুলির কয়েকটি ব্যবহার করে চেষ্টা করেছি split()এবং সেগুলি এখন আমার জন্য কাজ করে।
BeeBand

10

আরও কিছুটা সংক্ষিপ্ত সমাধানের জন্য নিম্নলিখিতগুলি বিবেচনা করুন:

def split_path(p):
    a,b = os.path.split(p)
    return (split_path(a) if len(a) and len(b) else []) + [b]

এটি এই সমস্যার আমার প্রিয় সমাধান। খুব সুন্দর.
মুর উইল

1
পথটি শেষ হলে এটি কাজ করে না /। এছাড়াও, আপনার পথটি যদি শুরু হয় তবে তালিকার শুরুতে একটি খালি স্ট্রিং দেয়/
সোরিগ

4

আমি প্রকৃতপক্ষে এটির একটি প্রকৃত উত্তর অবদান রাখতে পারি না (যেহেতু আমি এখানে নিজেকে খুঁজে পাওয়ার আশায় এসেছি), তবে আমার কাছে বিবিধ পদ্ধতির সংখ্যা এবং উল্লিখিত সমস্ত সতর্কতামূলক বিষয়গুলি হ'ল পাইথনের ওস.প্যাথ মডিউলটির এই নিরঙ্কর প্রয়োজন একটি অন্তর্নির্মিত ফাংশন হিসাবে।


4

জেনারেটর সহ কার্যকরী উপায় ।

def split(path):
    (drive, head) = os.path.splitdrive(path)
    while (head != os.sep):
        (head, tail) = os.path.split(head)
        yield tail

কর্মে:

>>> print([x for x in split(os.path.normpath('/path/to/filename'))])
['filename', 'to', 'path']

3

এটা আমার জন্য কাজ করে:

>>> a=r"d:\stuff\morestuff\furtherdown\THEFILE.txt"
>>> a.split("\\")
['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

অবশ্যই আপনাকে প্রথম উপাদানটি থেকে কোলনটি সরিয়ে ফেলতে হবে, তবে এটি রাখার ফলে পথটি পুনরায় একত্রিত করা সম্ভব হয়।

rপরিবর্তক চিহ্ন হিসাবে "কাঁচা" STRING আক্ষরিক; এম্বেড থাকা ব্যাকস্ল্যাশগুলি কীভাবে দ্বিগুণ হয় না তা লক্ষ্য করুন।


@ আনউইন্ড - rআপনার স্ট্রিংয়ের সামনের অংশটি কী বোঝায়?
BeBBand

2
r এর অর্থ কাঁচা স্ট্রিং - এটি \ অক্ষরগুলিকে স্বয়ংক্রিয়ভাবে পালিয়ে যায় । আপনি যখনই পাথ করছেন তখন এটি ব্যবহার করা কার্যকর।
ওয়েইন ওয়ার্নার

1
@ বিবিন্ড: আপনার যত্নের দরকার নেই; কোডটি সংকলন / বিশ্লেষণের সময় r "" কেবল এমন কিছু বিষয় যা এটি একবার পার্স করার পরে স্ট্রিংয়ের সম্পত্তি হয়ে ওঠে। এর অর্থ কেবল "এখানে একটি স্ট্রিং আক্ষরিক, তবে ব্যাকস্ল্যাশ ছাড়া ব্যাকস্ল্যাশকে অন্য কোনও অর্থ থাকার অর্থ ব্যাখ্যা করবেন না"।
বিনোদন

3
আমার মনে হয় আপনি মাইনাসের কথা উল্লেখ করা সহায়ক হতে পারে তবে এটিকে হার্ড কোডিংয়ের পরিবর্তে a.split (os.sep) ব্যবহার করে আরও অস্পষ্ট ব্যবহার করা ভাল?
টিম ম্যাকজিল্টন

4
আপনার ব্যাখ্যা করার সুযোগটি মিস করার জন্য os.path.splitএবং আপনাকে os.pathsepযেগুলি লিখেছেন তার চেয়ে দু'টিই বহনযোগ্য বলে বিবেচনা করার জন্য আমি আপনাকে নীচে নামাতে হবে । এটি এখন ওপি-র জন্য কোনও বিষয় নয়, তবে যখন সে প্ল্যাটফর্মগুলি সরানোর জন্য এমন কিছু লিখবে তখন তা হবে।
জেদ স্মিথ

3

সম্পর্কে স্টাফ mypath.split("\\")হিসাবে ভাল প্রকাশ করা হবে mypath.split(os.sep)sepআপনার নির্দিষ্ট প্ল্যাটফর্মের জন্য পাথ বিভাজক (উদাহরণস্বরূপ, \উইন্ডোজের /জন্য, ইউনিক্সের জন্য, ইত্যাদি) এবং পাইথন বিল্ডটি কোনটি ব্যবহার করতে হবে তা জানে। আপনি যদি ব্যবহার করেন sepতবে আপনার কোডটি প্ল্যাটফর্ম অজিনস্টিক হবে।


1
বা os.path.split। আপনি সাবধানতা অবলম্বন করতে চান os.pathsep, কারণ এটি :ওএস এক্স-এর পাইথন আমার সংস্করণে রয়েছে (এবং os.path.splitসঠিকভাবে পরিচালনা করে /)।
জেদ স্মিথ

4
আপনার মানে os.sep, না os.pathsepডক্সে থাকা বুদ্ধি অনুসরণ করুন os.sep: নোট করুন যে এটি জানার পরে পথের নামগুলি পার্স করতে বা বোঝাতে যথেষ্ট নয় - os.path.split () এবং os.path.join () ব্যবহার করুন।
জন-এরিক

1

পুনরায় স্প্লিট () স্ট্রিং.স্প্লিট () এর পরে আরও কিছুটা সাহায্য করতে পারে

import re    
var = "d:\stuff\morestuff\furtherdown\THEFILE.txt"
re.split( r'[\\/]', var )
['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

আপনি যদি লিনাক্স এবং ম্যাক পাথগুলি সমর্থন করতে চান তবে কেবল ফিল্টার যুক্ত করুন (কিছুই নয়, ফলস্বরূপ), সুতরাং এটি অবাঞ্ছিত '' কে বিভক্ত () থেকে অপসারণ করবে যেহেতু তাদের পথগুলি '/' বা '//' দিয়ে শুরু হয়। উদাহরণস্বরূপ '// মাউন্ট / ...' বা '/ var / tmp /'

import re    
var = "/var/stuff/morestuff/furtherdown/THEFILE.txt"
result = re.split( r'[\\/]', var )
filter( None, result )
['var', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

1

আপনি পুনরাবৃত্তভাবে os.path.splitস্ট্রিং করতে পারেন

import os
def parts(path):
    p,f = os.path.split(path)
    return parts(p) + [f] if f else [p]

এটি কয়েকটি পাথের স্ট্রিংগুলির বিরুদ্ধে পরীক্ষা করা এবং এর সাথে পাথটি পুনরায় একত্রিত করা os.path.join

>>> for path in [
...         r'd:\stuff\morestuff\furtherdown\THEFILE.txt',
...         '/path/to/file.txt',
...         'relative/path/to/file.txt',
...         r'C:\path\to\file.txt',
...         r'\\host\share\path\to\file.txt',
...     ]:
...     print parts(path), os.path.join(*parts(path))
... 
['d:\\', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt'] d:\stuff\morestuff\furtherdown\THEFILE.txt
['/', 'path', 'to', 'file.txt'] /path\to\file.txt
['', 'relative', 'path', 'to', 'file.txt'] relative\path\to\file.txt
['C:\\', 'path', 'to', 'file.txt'] C:\path\to\file.txt
['\\\\', 'host', 'share', 'path', 'to', 'file.txt'] \\host\share\path\to\file.txt

ড্রাইভ চিঠিগুলি, ইউএনসি পাথ এবং পরম ও আপেক্ষিক পাথগুলি কীভাবে আপনি মোকাবেলা করতে চান তার উপর নির্ভর করে তালিকার প্রথম উপাদানটির সাথে আলাদাভাবে আচরণ করা প্রয়োজন। গত পরিবর্তন [p]করতে [os.path.splitdrive(p)]বাহিনীর tuple মধ্যে ড্রাইভ লেটার এবং ডিরেক্টরিটি রুট আউট বিভাজন দ্বারা সমস্যা।

import os
def parts(path):
    p,f = os.path.split(path)
    return parts(p) + [f] if f else [os.path.splitdrive(p)]

[('d:', '\\'), 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']
[('', '/'), 'path', 'to', 'file.txt']
[('', ''), 'relative', 'path', 'to', 'file.txt']
[('C:', '\\'), 'path', 'to', 'file.txt']
[('', '\\\\'), 'host', 'share', 'path', 'to', 'file.txt']

সম্পাদনা: আমি বুঝতে পেরেছি যে এই উত্তরটি ব্যবহারকারী 1556435 দ্বারা উপরে বর্ণিত অনুরূপ । পথটির ড্রাইভ উপাদানটির পরিচালনা ভিন্ন হওয়ায় আমি আমার উত্তরটি ছেড়ে দিচ্ছি।


0

অন্যদের মত ব্যাখ্যা - আপনার সমস্যা ব্যবহার থেকে পক্ষপাতিত্ব \, যা স্ট্রিং আক্ষরিক / ধ্রুবক মধ্যে পালানোর চরিত্র। ওটো, আপনার যদি অন্য উত্স থেকে ফাইলের স্ট্রিং থাকে (ফাইল, কনসোল থেকে পড়া বা ওএস ফাংশন দ্বারা ফিরে আসে) - '\\' বা আর '\' এ বিভাজন করতে সমস্যা হত না।

এবং অন্যরা যেমন পরামর্শ দিয়েছে, আপনি যদি \প্রোগ্রামের আক্ষরিক ব্যবহার করতে চান তবে আপনাকে এটির নকল করতে হবে \\বা পুরো আক্ষরিকের উপসর্গ তৈরি করতে হবে r, যেমন r'lite\ral'বা r"lite\ral"পার্সার রূপান্তর করতে \এবং rসিআর (ক্যারেজ রিটার্ন) চরিত্রটি এড়ানোর জন্য ।

আরও একটি উপায় আছে - কেবল আপনার \কোডটিতে ব্যাকস্ল্যাশ পাথরনাম ব্যবহার করবেন না ! যেহেতু গত শতাব্দীতে উইন্ডোজ পাথরনামগুলিকে স্বীকৃতি দেয় এবং কাজ করে যা ডিরেক্টরি বিভাজক হিসাবে ফরোয়ার্ড স্ল্যাশ ব্যবহার করে /! কোনওভাবেই অনেকে জানেন না যে .. তবে এটি কার্যকর:

>>> var = "d:/stuff/morestuff/furtherdown/THEFILE.txt"
>>> var.split('/')
['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

এটি আপনার কোডটিকে ইউনিক্স, উইন্ডোজ এবং ম্যাকের জন্য কাজ করবে ... কারণ এগুলি সমস্তই /ডিরেক্টরি বিভাজক হিসাবে ব্যবহার করে ... এমনকি আপনি যদি মডিউলটির পূর্বনির্ধারিত স্থায়ী উপাদান ব্যবহার করতে না চান তবেও os


দুর্ভাগ্যক্রমে আমি আমার অজগর স্ক্রিপ্ট থেকে চালিত অন্য প্রোগ্রাম থেকে ডেটা আমার কাছে ফিরিয়ে দেওয়া হচ্ছে। '\' বা '/' ব্যবহার করবেন কিনা সে সম্পর্কে আমার কোনও নিয়ন্ত্রণ নেই - এটি তৃতীয় পক্ষের প্রোগ্রাম যা এটি নির্ধারণ করে (সম্ভবত প্ল্যাটফর্মের ভিত্তিতে)।
BeeBand

@BeBand: আহ, তাহলে আপনি যখন পরীক্ষায় স্ট্রিংটি আপনার প্রোগ্রামে সরবরাহ করেছিলেন তখন পরীক্ষার সময় আপনি যে সমস্যার মুখোমুখি হন তা আপনার সমস্যা হবে না। বা পাথটি পাওয়ার পরে আপনি নিম্নলিখিত দুষ্ট হ্যাকটি করতে পারেন: var = var.replace('\\','/')- সাথে replace প্রতিস্থাপন করুন / এবং কেবলমাত্র ফরোয়ার্ড স্ল্যাশ নিয়ে কাজ করুন :)
নাস বনভ

এটি প্রকৃতপক্ষে একটি অশুভ হ্যাক: ও)
বিব্যান্ড

@ বিয়ানব্যান্ড: এজন্যই আমি সতর্ক করেছিলাম। যখন আমি বলি কিছু মন্দ, আমি মানে না এটা ব্যবহার করা উচিত - কিন্তু এক উচিত খুব সচেতন কেন তারা এটি এবং অনিচ্ছাকৃত পরিণতি সতর্কতা ব্যবহার করছেন হও। এই ক্ষেত্রে, খুব সম্ভবত সম্ভাব্য পরিণতি হ'ল যদি এটি ইউনিক্স ফাইল সিস্টেমে or name ফাইল বা ডিরেক্টরিতে ব্যবহার করা হয় (এটি সত্যিই কঠিন তবে সম্ভব) - এই কোডটি 'ব্রেক' হয়ে যাবে
নাস বানভ

0

ধরে নেওয়া যাক আপনার filedata.txtসামগ্রীতে একটি ফাইল রয়েছে:

d:\stuff\morestuff\furtherdown\THEFILE.txt
d:\otherstuff\something\otherfile.txt

আপনি ফাইলের পাথগুলি পড়তে এবং বিভক্ত করতে পারেন:

>>> for i in open("filedata.txt").readlines():
...     print i.strip().split("\\")
... 
['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']
['d:', 'otherstuff', 'something', 'otherfile.txt']

এটি সত্যিই কাজ করে, ধন্যবাদ! তবে আমি ব্রোনের সমাধানটি বেছে নিয়েছি কারণ আমি ব্যাকস্ল্যাশ থেকে বেরিয়ে আসার বিষয়ে চিন্তা করা পছন্দ করি না।
BeeBand

9
পাইথোনিক নয় যেহেতু এটি ফাইল সিস্টেম নির্ভর।
জেবি।

0

আমি নিম্নলিখিতটি ব্যবহার করি কারণ এটি os.path.basename ফাংশনটি ব্যবহার করে এটি প্রত্যাবর্তিত তালিকায় কোনও স্ল্যাশ যুক্ত করে না। এটি যে কোনও প্ল্যাটফর্মের স্ল্যাশগুলির সাথেও কাজ করে: যেমন উইন্ডোর \\ বা ইউনিক্সের /। এবং তদ্ব্যতীত, এটি সার্ভারের পাথগুলির জন্য উইন্ডোজগুলি ব্যবহার করে না :)

def SplitPath( split_path ):
    pathSplit_lst   = []
    while os.path.basename(split_path):
        pathSplit_lst.append( os.path.basename(split_path) )
        split_path = os.path.dirname(split_path)
    pathSplit_lst.reverse()
    return pathSplit_lst

সুতরাং '\\\\ সার্ভার \\ ফোল্ডার 1 \\ ফোল্ডার 2 \\ ফোল্ডার 3 \\ ফোল্ডার 4' এর জন্য

তুমি পাও

[ 'সার্ভার', 'FOLDER1', 'folder2', 'folder3', 'folder4']


1
এটি আক্রমণকারীটিকে অনুসরণ করে না যে আপনার ফলাফলটি পাস করার ফলে os.path.join()আসল স্ট্রিংটি ফিরে আসবে। আমি আপনার উদাহরণ ইনপুট জন্য সঠিক আউটপুট বলতে চাই [r'\\','server','folder1','folder2','folder3','folder4']। অর্থাৎ কি os.path.split()করে।
জন-এরিক

0

আমি এটির পুরোপুরি প্রশ্নের উত্তর দিচ্ছি কিনা তা আমি নিশ্চিত নই, তবে এই ছোট্ট ফাংশনটি লেখার জন্য আমি মজাদার সময় পেলাম যা একটি স্ট্যাক রাখে, ওএস.প্যাথ-ভিত্তিক ম্যানিপুলেশনগুলিতে লেগে থাকে এবং আইটেমের তালিকা / স্ট্যাক ফিরিয়ে দেয়।

  9 def components(path):
 10     ret = []
 11     while len(path) > 0:
 12         path, crust = split(path)
 13         ret.insert(0, crust)
 14
 15     return ret
 16

0

কোডের নীচে লাইন পরিচালনা করতে পারে:

  1. সি: / পাথ / পথ
  2. সি: // পথ // পথ
  3. সি: \ পথ \ পথ
  4. সি: \ পথ \ পথ

পাথ = পুনরায় স্প্লিট (আর '[/// \]', পথ)


0

মজা জন্য এক পুনরাবৃত্ত।

সর্বাধিক মার্জিত উত্তর নয়, তবে সর্বত্র কাজ করা উচিত:

import os

def split_path(path):
    head = os.path.dirname(path)
    tail = os.path.basename(path)
    if head == os.path.dirname(head):
        return [tail]
    return split_path(head) + [tail]

সত্যই, দুঃখিত। প্রশ্নটি খুব যত্ন সহকারে পড়া উচিত ছিল ... একটি 'ডস' পথ।
ডুজনু

-1

ব্যবহার ntpath.split()


আমি যখন os.path.split ব্যবহার করি () আমি পেয়েছি, ( d:\\stuff, morestuff\x0curtherdown\thefile.mux)
BeeBand

বিব্যান্ড যেমন উল্লেখ করেছে, os.path.split () সত্যিই পছন্দসই কাজটি করে না।
বিনোদন

দুঃখিত, আমি ঠিক বুঝতে পেরেছি। এনটিপথ ডস পাথগুলি পার্স করবে।
ডিফ্ট_কোড

এমনকি এনটিপথ দিয়ে আমি এখনও d:\\stuff, morestuff\x0curtherdown\thefile.mux
পেয়েছি

2
@BeBand: আপনার স্ট্রিং এড়িয়ে যাওয়ার সমস্যা আছে। '\x0c'ফর্ম ফিড অক্ষর। ফর্ম ফিড অক্ষর তৈরির উপায় হ'ল '' চ '। আপনি যদি সত্যিই আক্ষরিক স্ট্রিং '\ f' চান তবে আপনার দুটি বিকল্প রয়েছে: '\\f'বা r'\f'
ডিফ্ট_কোড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.