পাইথনে পুরো পাথ ফাইলের নাম তৈরি করুন


181

আমার একটি ফাইলের পাথের নামটি একটি মডিউলে যেতে হবে। ডিরেক্টরি নাম, বেস ফাইল নাম এবং একটি ফাইল ফর্ম্যাট স্ট্রিং থেকে আমি কীভাবে ফাইলের পথটি তৈরি করব?

কল করার সময় ডিরেক্টরিটি থাকতে পারে এবং নাও থাকতে পারে।

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

dir_name='/home/me/dev/my_reports'
base_filename='daily_report'
format = 'pdf'

আমার একটা স্ট্রিং তৈরি করা দরকার '/home/me/dev/my_reports/daily_report.pdf'

টুকরোগুলি নিজে হাতে লড়াই করা ভাল উপায় বলে মনে হয় না। আমি চেষ্টা করেছি os.path.join:

join(dir_name,base_filename,format)

কিন্তু এটা দেয়

/home/me/dev/my_reports/daily_report/pdf

উত্তর:


290

এটি সূক্ষ্মভাবে কাজ করে:

os.path.join(dir_name, base_filename + "." + filename_suffix)

মনে রাখবেন যে os.path.join()কেবল বিদ্যমান কারণ বিভিন্ন অপারেটিং সিস্টেমগুলি পৃথক পাথ বিভাজক অক্ষর ব্যবহার করে। এটি এই পার্থক্যটির উপরে মসৃণ হয় তাই প্রতিটি ওএসের জন্য ক্রস-প্ল্যাটফর্ম কোডকে বিশেষ ক্ষেত্রে বিশৃঙ্খলা করতে হবে না। ফাইলের নাম "এক্সটেনশানগুলি" (পাদটীকা দেখুন) এর জন্য এটি করার দরকার নেই কারণ এগুলি প্রতিটি OS এ সর্বদা বিন্দু অক্ষর সহ বাকী নামের সাথে যুক্ত থাকে।

যদি কোনও ক্রিয়াকলাপ যেকোনো উপায়ে ব্যবহার করা আপনাকে আরও ভাল বোধ করে (এবং আপনি অযথা আপনার কোডটি জটিল করা পছন্দ করেন) তবে আপনি এটি করতে পারেন:

os.path.join(dir_name, '.'.join((base_filename, filename_suffix)))

আপনি যদি নিজের কোডটি পরিষ্কার রাখতে পছন্দ করেন তবে কেবল বিন্দুর সাথে প্রত্যয়টি অন্তর্ভুক্ত করুন:

suffix = '.pdf'
os.path.join(dir_name, base_filename + suffix)

(এই দৃষ্টিভঙ্গিটি পাইথলিবের প্রত্যয় সম্মেলনের সাথে সামঞ্জস্যপূর্ণ বলে মনে হয় , যা পাইথন ৩.৪ এ প্রবর্তিত হয়েছিল।)


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


7
আপনি উল্লেখ করেছেন যে ওএস বিভাজক নাও হতে পারে .। এই জন্য একটি ব্যবহার করতে পারেন os.extsep
sjbx

2
আমি এরকম কোন বিষয় উল্লেখ করিনি।
әɹsәɹoɈ

6
আপনি কিছুটা ব্যাখ্যা করতে গিয়েছিলেন যে 'ফাইলের নাম "এক্সটেনশানগুলি" কেবল একটি বড় অপারেটিং সিস্টেমে (তারাই কেবল নন-উইন্ডোজ সিস্টেমে ফাইল নামের অংশ) এবং এর বিভাজক চরিত্রটি সর্বদা একটি বিন্দু হিসাবে থাকে। ওপিও শেষ পর্যন্ত তারা দেখে / পিডিএফ প্রকাশ করেছে। সুতরাং আপনি করতে পারে os.path.join(dir_name, base_filename, os.extsep, extension)। আপনার উত্তর পুরোপুরি সঠিক।
sjbx

3
হ্যাঁ, আপনি ঠিক বলেছেন, এটি কেবল একটি স্ট্রিং দেয় যাতে os.path.join (dir_name, ''। জোইন ([বেস_ফাইলেমন, os.extsep, এক্সটেনশন])) এটি করা উচিত। আবার এটি আপনার উত্তরের সঠিকতা হ্রাস করে না।
sjbx

1
@ এসজেবিএক্স +ফাইল ফাইলের অংশগুলির মধ্যে থাকা উচিত । যুক্তিগুলির মধ্যে os.path.join()ওএস-নির্দিষ্ট পাথ বিভাজক যুক্ত করুন ( /উদাহরণস্বরূপ) @ উত্তর হিসাবে সঠিকভাবে সেগুলি তার উত্তরটিতে রাখুন her সুতরাং আপনার কোড স্নিপেটের সঠিক ফর্মটি হল:os.path.join(dir_name, base_filename + os.extsep + extension)
শায়ান আমানী

40

আপনি যদি পাইথন ৩.৪++ চালানোর জন্য যথেষ্ট ভাগ্যবান হন তবে আপনি এটি ব্যবহার করতে পারেন pathlib:

>>> from pathlib import Path
>>> dirname = '/home/reports'
>>> filename = 'daily'
>>> suffix = '.pdf'
>>> Path(dirname, filename).with_suffix(suffix)
PosixPath('/home/reports/daily.pdf')

1
আমি পাথলিবকে os.path.join এর চেয়ে অনেক বেশি মার্জিত বলে মনে করি, যা তুলনা করে বেশ ক্লিনকি বলে মনে হয়।
পিয়ানোয়ার

যদি আপনার ফাইলনামে "" থাকে তবে কাজ করে না। >>> filename2 = 'daily.hourly' >>> পথ (dirname, filename2) .with_suffix (প্রত্যয়) আউটপুট: WindowsPath ( '/ হোম / প্রতিবেদন / daily.pdf')
wontleave

2
@ ওন্টলিওভ: যদি কোনও ফাইলের নামটিতে ইতিমধ্যে প্রত্যয় থাকে, with_suffix()তবে এটি সংযোজন করার পরিবর্তে এটিকে প্রতিস্থাপন করবে। আপনি এর মতো কিছু চানPath(dirname, filename2 + suffix)
ইউজিন ইয়ারমশ

21

উম, কেন শুধু নয়:

>>>> import os
>>>> os.path.join(dir_name, base_filename + "." + format)
'/home/me/dev/my_reports/daily_report.pdf'

ধন্যবাদ, তবে আমি আশা করছিলাম যে এই এক্সটেনশনটি সংযোজনের একটি পরিষ্কার উপায় ছিল..পথনটি এমনকি এক্সটেনশনটি কেটে ফেলার জন্য একটি স্প্লিটেক্সট ফাংশন রয়েছে ... সুতরাং বিপরীত কিছু করার দরকার আছে
ড্যামন জুলিয়ান

2
স্প্লিটেক্সট ফাংশনটি '' ধরে রাখে। এক্সটেনশনের সামনের দিকে। এটি সম্ভবত এটি করার সবচেয়ে পরিষ্কার উপায়। আপনি যদি নিজের কোডটিতে এটি "চেহারা" দেখতে চান তবে আমি কোনও ফাংশন বা ল্যাম্বডা ফাংশনটি ব্যবহার করার পরামর্শ দেব
বৈচিত্র্য

0

os.path.joinফাইলের নাম এবং এক্সটেনশান সহ কেবল আপনার পথে যোগ দিতে ব্যবহার করুন । sys.argvএটি সম্পাদন করার সময় স্ক্রিপ্টে দেওয়া আর্গুমেন্ট অ্যাক্সেস করতে ব্যবহার করুন :

#!/usr/bin/env python3
# coding: utf-8

# import netCDF4 as nc
import numpy as np
import numpy.ma as ma
import csv as csv

import os.path
import sys

basedir = '/data/reu_data/soil_moisture/'
suffix = 'nc'


def read_fid(filename):
    fid = nc.MFDataset(filename,'r')
    fid.close()
    return fid

def read_var(file, varname):
    fid = nc.Dataset(file, 'r')
    out = fid.variables[varname][:]
    fid.close()
    return out


if __name__ == '__main__':
    if len(sys.argv) < 2:
        print('Please specify a year')

    else:
        filename = os.path.join(basedir, '.'.join((sys.argv[1], suffix)))
        time = read_var(ncf, 'time')
        lat = read_var(ncf, 'lat')
        lon = read_var(ncf, 'lon')
        soil = read_var(ncf, 'soilw')

সহজভাবে স্ক্রিপ্টটি চালান:

   # on windows-based systems
   python script.py year

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