পাইথনে কীভাবে একটি পরম ফাইল পাথ পাবেন


723

যেমন একটি পাথ দেওয়া "mydir/myfile.txt"হয়েছে, পাইথনের বর্তমান কার্যনির্বাহী ডিরেক্টরিটির সাথে সম্পর্কিত ফাইলটির পরম পথটি আমি কীভাবে খুঁজে পাব? উইন্ডোজে যেমন, আমি এখানে দিয়ে শেষ করতে পারি:

"C:/example/cwd/mydir/myfile.txt"

2
অনুরূপ প্রশ্ন: স্ট্যাকওভারফ্লো.com
রাজ

উত্তর:


1054
>>> import os
>>> os.path.abspath("mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'

এটি ইতিমধ্যে পরম পাথ থাকলেও কাজ করে:

>>> import os
>>> os.path.abspath("C:/example/cwd/mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'

29
দ্রষ্টব্য: সবচেয়ে প্ল্যাটফর্মে এই ফাংশন কলিং সমতূল্য normpath()নিম্নরূপ: normpath(join(os.getcwd(), path))। সুতরাং যদি এর mydir/myfile.txtঅধীনে না হয় os.getcwd()তবে পরম পথটি আসল পথ নয়
coanor

32
@ কোয়ানোর? একটি সুনির্দিষ্ট রুট ছাড়া, mydir/myfile.txtপরোক্ষভাবে সাম্প্রতিক কাজ করা ভিতরে একটি পাথ বোঝায় যেমন অতএব সমতূল্য ./mydir/myfile.txt। আপনি যে পথটি ইনপুট করতে চেয়েছিলেন সেটি সেই পথ নাও হতে পারে তবে আমি যতদূর বলতে পারি পথের সঠিক ব্যাখ্যার মতো মনে হচ্ছে। আপনি বিস্তারিত বলতে পারেন?
jpmc26

2
@ jpmc26 আমি ঠিক কোনারকে অনুসরণ করি না, তবে আমি এটিই বলব (আমার ধারণা অনুসারে), abspathফাংশনের সাথে একটি আসল ফাইলের সাথে কোনও যোগসূত্র নেই । আপনি যে কোনও পথের নাম দিতে পারেন non অস্তিত্বহীন ফাইল এবং ডিরেক্টরি হেরার্চগুলি ভাল - এবং অ্যাবসপাথ কেবল পথের বিটগুলি সমাধান করবে (প্যারেন্ট ডিরেক্টরি ..উপাদান সহ ) এবং একটি স্ট্রিং ফিরিয়ে দেবে। এটি বর্তমান ডিরেক্টরি থেকে গণিত একটি স্ট্রিং; একটি আসল ফাইলের সাথে কোনও সম্পর্কটি দুর্ঘটনাজনক, মনে হয়। ব্যবহার করে দেখুন os.path.abspath("/wow/junk/../blha/hooey")। এটা কাজ করে।
মাইক এস

2
@ মাইকস আমি সত্যই জানি না যে এটি কেন অপ্রত্যাশিত আচরণ হবে। এটি পরম পথ , পরম ফাইল বা ডিরেক্টরি নয়। আপনি যদি একটি অস্তিত্ব চেক চান, কল করুন os.path.exists। বিপরীতে, পাওয়ারশেলের মতো সিস্টেমগুলি যে স্ট্যান্ডার্ড পাথ রেজোলিউশন ফাংশন সহ বিদ্যমান পাথের উপর জোর দেয় তা ব্যবহারের জন্য ব্যথা।
jpmc26

1
@ jpmc26 ধরে নেওয়া যে কোনও পথটি কেবল একটি স্ট্রিং যা পথের নামের মতো দেখায় তা মোটেও পরিষ্কার নয়, এবং আমি কীভাবে বহু বছর ধরে পথের নামগুলি নিয়ে ভাবছি এবং বলছিলাম তার বিপরীতে goes আমি অ্যাবসপাথের জন্য পাইথন 3 ডক্সকে উদ্ধৃত করে দিয়েছি: " পথের নামের একটি সাধারণ ক্রমবর্ধমান সংস্করণটি ফিরিয়ে দিন" " স্ট্রিং পাথের " ... সংস্করণ " নয়। প্যাসিক্স দ্বারা নির্ধারিত একটি পাথের নাম হ'ল "একটি স্ট্রিং যা কোনও ফাইল সনাক্ত করতে ব্যবহৃত হয়।" পাইথন ডকস সম্পর্কে স্পষ্ট relpath: "অস্তিত্ব বা প্রকৃতির বিষয়টি নিশ্চিত করতে ফাইল সিস্টেম অ্যাক্সেস করা হয় না path"। যদি এখানে যুক্তি সুস্পষ্ট হয় তবে কেন স্পষ্ট হবে relpath?
মাইক এস

77

আপনি নতুন পাইথন ৩.৪ লাইব্রেরিটি ব্যবহার করতে পারেন pathlib। (আপনি পাইথন ২.6 বা ২.7 ব্যবহার করে এটিও পেতে পারেন pip install pathlib।) লেখকরা লিখেছেন : "এই লাইব্রেরির লক্ষ্য হ'ল ফাইল-সিস্টেমের পথগুলি পরিচালনা করার জন্য ক্লাসগুলির একটি সাধারণ স্তরক্রম সরবরাহ করা এবং সাধারণ ক্রিয়াকলাপ ব্যবহারকারীরা তাদের উপর যা করেন do"

উইন্ডোজে একটি নিখুঁত পাথ পেতে:

>>> from pathlib import Path
>>> p = Path("pythonw.exe").resolve()
>>> p
WindowsPath('C:/Python27/pythonw.exe')
>>> str(p)
'C:\\Python27\\pythonw.exe'

অথবা ইউনিক্সে:

>>> from pathlib import Path
>>> p = Path("python3.4").resolve()
>>> p
PosixPath('/opt/python3/bin/python3.4')
>>> str(p)
'/opt/python3/bin/python3.4'

দস্তাবেজগুলি এখানে রয়েছে: https://docs.python.org/3/library/pathlib.html


4
খুব উপকারী. ব্যবহার os.path.abspath()আমাকে একটি ত্রুটি দিয়েছেন: AttributeError: 'NoneType' object has no attribute 'startswith'ব্যবহার Path().resolve()একই আপেক্ষিক filepath সঙ্গে নেই। (লিনাক্স এবং পাইথন 3.4)
নিউক্লিয়ার পিওন

23

আরও ভাল, মডিউলটি ইনস্টল করুন (পাওয়া গেছে PyPI), এটি সমস্ত os.pathফাংশন এবং অন্যান্য সম্পর্কিত ফাংশনগুলিকে এমন কোনও অবজেক্টের পদ্ধতিতে মোড়ানো করে যেখানে স্ট্রিং ব্যবহার করা যায় সেখানে ব্যবহার করা যেতে পারে:

>>> from path import path
>>> path('mydir/myfile.txt').abspath()
'C:\\example\\cwd\\mydir\\myfile.txt'
>>>

2
খুব খারাপ তারা stdlib এ কোনও উপযুক্ত ফাইলের নাম বিমূর্তি মডিউল পায় নি।
টর্স্টেন মেরেক

1
@ টার্স্টেন মারেক: এটি একটি কালশিটে এবং দীর্ঘকালীন ভুল।
প্রবাহিত করুন

4
তারা পাইথন 3.4 এখন যা করেছে: pathlib। আমার উত্তরটি এই থ্রেডে দেখুন।
twasbrillig

এই উত্তরে yypos আছে। এটি from path import Pathতখন হতে হবেPath('mydir/myfile.txt').abspath()
ফ্রেমম্যান 1

কোনও টাইপস নেই, আপনি হয়ত অন্য কোনও pathমডিউল ব্যবহার করছেন । সংযুক্ত মডিউল নামের একটি শ্রেণি ব্যবহার করে path
টম

14

আজ আপনি সেই unipathপ্যাকেজটিও ব্যবহার করতে পারেন যা ভিত্তিক ছিল path.py: http://sluggo.scrapping.cc/python/unipath/

>>> from unipath import Path
>>> absolute_path = Path('mydir/myfile.txt').absolute()
Path('C:\\example\\cwd\\mydir\\myfile.txt')
>>> str(absolute_path)
C:\\example\\cwd\\mydir\\myfile.txt
>>>

আমি এই প্যাকেজটি ব্যবহার করার পরামর্শ দেব কারণ এটি সাধারণ os.path ইউটিলিটিগুলিতে একটি পরিষ্কার ইন্টারফেস দেয়


10

পাইথন ৩.৪+ এর জন্য আপডেট pathlibযা আসলে প্রশ্নের উত্তর দেয়:

from pathlib import Path

relative = Path("mydir/myfile.txt")
absolute = relative.absolute()  # absolute is a Path object

আপনার যদি কেবল অস্থায়ী স্ট্রিংয়ের প্রয়োজন হয় তবে মনে রাখবেন যে অবশ্যই আপনি অবশ্যই সম্পর্কিত সহ Pathসমস্ত প্রাসঙ্গিক ফাংশন os.pathসহ অবজেক্টগুলি ব্যবহার করতে পারেন abspath:

from os.path import abspath

absolute = abspath(relative)  # absolute is a str object

9
import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))

নোট expanduser(ফাইলটি (বা ডিরেক্টরি) নাম এবং অবস্থানের জন্য প্রদত্ত এক্সপ্রেশনটিতে একটি শীর্ষস্থানীয় ~/(টিল্ড ব্যবহারকারীর হোম ডিরেক্টরি বোঝায় ) থাকতে পারে এবং expandvarsঅন্য যে কোনও পরিবেশের ভেরিয়েবলের (যেমন $HOME) যত্ন নিবে সে ক্ষেত্রে (ইউনিক্সে) নোটটি অবশ্যই প্রয়োজনীয় Note


6

এটি অন্য স্ক্রিপ্টের মধ্যে থেকে কল করা হলেও এটি সর্বদা বর্তমান স্ক্রিপ্টের সঠিক ফাইলের নাম পায়। এটি ব্যবহার করার সময় বিশেষভাবে কার্যকর subprocess

import sys,os

filename = sys.argv[0]

সেখান থেকে আপনি এখানে স্ক্রিপ্টের পুরো পথটি পেতে পারেন:

>>> os.path.abspath(filename)
'/foo/bar/script.py'

/..ডিরেক্টরিগুলির স্তরক্রমের ক্ষেত্রে আপনি যতবার 'আপ' যেতে চান কেবল ততবার যোগ করে ফোল্ডারগুলি নেভিগেট করা সহজ করে তোলে ।

সিডব্লিউডি পেতে:

>>> os.path.abspath(filename+"/..")
'/foo/bar'

মূল পথের জন্য:

>>> os.path.abspath(filename+"/../..")
'/foo'

"/.."অন্যান্য ফাইলের নামের সাথে একত্রিত হয়ে আপনি সিস্টেমের যে কোনও ফাইল অ্যাক্সেস করতে পারবেন।


এটিই জিজ্ঞাসা করা হচ্ছিল না। তারা বর্তমান ওয়ার্কিং ডিরেক্টরি সম্পর্কিত একটি পথ সম্পর্কে জিজ্ঞাসা করেছিল, যা স্ক্রিপ্ট ডিরেক্টরি হিসাবে একই জিনিস নয়, যদিও তাদের মাঝে মাঝে একই মান থাকতে পারে।
সৃষ্টির

3

মডিউল osঅ্যাবস পাথ সন্ধানের জন্য একটি উপায় সরবরাহ করে।

তবে লিনাক্সের বেশিরভাগ পাথই~ (টিলডে) দিয়ে শুরু হয় , যা সন্তোষজনক ফলাফল দেয় না।

যাতে আপনি এটি srblibজন্য ব্যবহার করতে পারেন ।

>>> import os
>>> os.path.abspath('~/hello/world')
'/home/srb/Desktop/~/hello/world'
>>> from srblib import abs_path
>>> abs_path('~/hello/world')
'/home/srb/hello/world'

এটি ব্যবহার করে ইনস্টল করুন python3 -m pip install srblib

https://pypi.org/project/srblib/


1

আমি গ্লোব ব্যবহার করতে পছন্দ করি

আপনার বর্তমান ফোল্ডারে কীভাবে সমস্ত ফাইল প্রকার তালিকাভুক্ত করা যায় তা এখানে:

import glob
for x in glob.glob():
    print(x)

আপনার বর্তমান ফোল্ডারে কীভাবে সমস্ত (উদাহরণস্বরূপ) .txt ফাইলগুলি তালিকাভুক্ত করবেন তা এখানে রয়েছে:

import glob
for x in glob.glob('*.txt'):
    print(x)

এখানে একটি চয়ন করা ডিরেক্টরিতে সমস্ত ফাইলের ধরন তালিকাভুক্ত করা হয়:

import glob
for x in glob.glob('C:/example/hi/hello/'):
    print(x)

আশা করি এটি আপনাকে সাহায্য করবে


2
আপনি অন্য একটি প্রশ্নের উত্তর দিচ্ছেন বলে মনে হচ্ছে। এটি "আমি কীভাবে কোনও পথ পাব?" নয়, "একটি পরম পথ" ছিল। আপনার প্রথম দুটি ক্ষেত্রে os.path.abspath()যে কোনও আপেক্ষিক পথ globসরবরাহ করতে পারে তার সঠিক উত্তর ( ) প্রয়োগ করতে পারে ...
নিকটজেন্স

1

আপনি যদি একটি ম্যাক হয়

import os
upload_folder = os.path.abspath("static/img/users")

এটি আপনাকে একটি পুরো পথ দেবে:

print(upload_folder)

নিম্নলিখিত পথ প্রদর্শন করবে:

>>>/Users/myUsername/PycharmProjects/OBS/static/img/user

1

যদি কেউ অজগর এবং লিনাক্স ব্যবহার করে এবং ফাইলের পুরো পথ সন্ধান করে:

>>> path=os.popen("readlink -f file").read()
>>> print path
abs/path/to/file
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.