पायथन में पूर्ण पथ फ़ाइल नाम बनाएँ


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.path.join(dir_name, '.'.join((base_filename, filename_suffix)))

यदि आप अपना कोड साफ रखना पसंद करते हैं, तो बस प्रत्यय में डॉट शामिल करें:

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

(यह दृष्टिकोण पैथलिब में प्रत्यय सम्मेलनों के साथ संगत होने के लिए भी होता है , जिसे अजगर 3.4 में पेश किया गया था।)


फुटनोट: नॉन-माइक्रोफोर्स ऑपरेटिंग सिस्टम पर फ़ाइल नाम "एक्सटेंशन" जैसी कोई चीज नहीं है। विंडोज पर इसकी उपस्थिति एमएस-डॉस और एफएटी से आती है, जिसने इसे सीपी / एम से उधार लिया था, जो दशकों से मृत है। वह डॉट-प्लस-थ्री-लेटर्स, जिन्हें हम में से कई लोग देखने के आदी हैं, हर दूसरे आधुनिक ओएस पर फ़ाइल नाम का एक हिस्सा है, जहाँ इसका कोई अंतर्निहित अर्थ नहीं है।


7
आपने उल्लेख किया है कि OS विभाजक नहीं हो सकता है .। इसके लिए कोई भी उपयोग कर सकता है os.extsep
sjbx

2
मैंने ऐसी किसी बात का उल्लेख नहीं किया।
ʇs:oɈ

6
आप यह बताने के लिए कुछ लंबाई में गए कि 'फ़ाइल का नाम "एक्सटेंशन" का केवल एक प्रमुख ऑपरेटिंग सिस्टम पर महत्वपूर्ण अर्थ है (वे गैर-विंडोज सिस्टम पर फ़ाइल नाम का केवल एक हिस्सा हैं), और उनका विभाजक वर्ण हमेशा एक बिंदु होता है'। ओपी ने यह भी व्यक्त किया कि उन्होंने आखिर में देखा / पीडीएफ। तो आप कर सकते थे os.path.join(dir_name, base_filename, os.extsep, extension)। आपका उत्तर पूरी तरह से सही है।
sjbx

3
हाँ, आप सही कह रहे हैं, यह वापस केवल एक स्ट्रिंग देता है ताकि os.path.join (dir_name, '' .join ([base_filename, os.extsep, extension])) को करना चाहिए। फिर, यह आपके उत्तर की शुद्धता को कम नहीं करता है।
sjbx

1
@ एसजेबीएक्स आपको +फ़ाइलनाम भागों के बीच रखना चाहिए । तर्कों के बीच os.path.join()OS- विशिष्ट पथ विभाजक ( /उदाहरण के लिए) जोड़ता है (जैसा कि @ sɈo have ने उन्हें सही ढंग से उनके उत्तर में दिया है। इस प्रकार आपके कोड स्निपेट का सही रूप है:os.path.join(dir_name, base_filename + os.extsep + extension)
Shayan Amani

40

यदि आप भाग्यशाली हैं कि पायथन 3.4+ चल रहा है, तो आप इसका उपयोग कर सकते हैं pathlib:

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

1
मुझे लगता है कि osl.path.join की तुलना में बहुत अधिक सुरुचिपूर्ण होने के लिए पैथलिब लगता है, जो तुलनात्मक रूप से बहुत अच्छा लगता है।
Pioniere

काम नहीं करता है अगर आप फ़ाइल नाम है एक "।" >>> filename2 = 'daily.hourly' >>> Path (dirname, filename2) .with_suffix (प्रत्यय) आउटपुट: WindowsPath ('/ घर / रिपोर्ट / daily.pdf')
wontleave

2
@wontleave: यदि एक फ़ाइल नाम में पहले से ही एक प्रत्यय है, 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
स्प्लिटेक्स फ़ंक्शन 'को बरकरार रखता है। एक्सटेंशन के सामने। यह संभवतः इसे करने का सबसे साफ तरीका है। यदि आप चाहते हैं कि यह आपके कोड में "लुक" क्लीनर हो, तो मैं एक फ़ंक्शन या लैम्बडा फ़ंक्शन का उपयोग करने का सुझाव दूंगा।
vorticity

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.