2011-08-20 18 views
97

मुझे एक मॉड्यूल में फ़ाइल पथ नाम पास करने की आवश्यकता है जो रिपोर्ट दस्तावेज़ को पीडीएफ, एचटीएमएल आदि के रूप में बनाता है। मैं निर्देशिका नाम, बेस फ़ाइल नाम और फ़ाइल से फ़ाइल पथ नाम कैसे बना सकता हूं फाइलफॉर्मेट स्ट्रिंग?पायथन में पूर्ण पथ फ़ाइल नाम का निर्माण,

निर्देशिका या उदाहरण के लिए कॉल

के समय मौजूद नहीं हो सकता है

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' 

उत्तर

144

यह ठीक काम करता है:

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) 
+4

आपने बताया कि ओएस विभाजक '.' नहीं हो सकता है। इसके लिए 'os.extsep' का उपयोग कर सकते हैं। – sjbx

+1

मैंने ऐसी कोई बात नहीं दी। –

+3

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

19

उम देता है, क्यों नहीं बस:

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

धन्यवाद, लेकिन मुझे उम्मीद थी कि extension..python जोड़कर की एक क्लीनर तरीका नहीं था यहां तक ​​कि एक splitext समारोह extension..so वहाँ के लिए कुछ हो गया है काट के लिए है रिवर्स –

+1

करें स्प्लिटेक्स्ट फ़ंक्शन '।' को बरकरार रखता है विस्तार के सामने। यह संभवतः इसे करने का सबसे साफ तरीका है। यदि आप इसे अपने कोड में क्लीनर "लुक" करना चाहते हैं, तो मैं एक फ़ंक्शन या लैम्ब्डा फ़ंक्शन का उपयोग करने का सुझाव दूंगा। – Vorticity

0

बस os.path.join का उपयोग फ़ाइल नाम और एक्सटेंशन के साथ अपने पथ शामिल होने के लिए। जब यह क्रियान्वित sys.argv स्क्रिप्ट के लिए पारित तर्क का उपयोग करने के का उपयोग करें: pathlib

# on windows-based systems 
    python script.py year 

    # on unix-based systems 
    ./script.py year 
9

आप बहुत भाग्यशाली अजगर 3.4+ चल रहा हो रहे हैं, तो आप उपयोग कर सकते हैं:

#!/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') 

आप की तरह स्क्रिप्ट चलाने:

>>> from pathlib import Path 
>>> dirname = "/home/reports" 
>>> filename = "daily" 
>>> suffix = ".pdf" 
>>> Path(dirname).joinpath(filename).with_suffix(suffix) 
PosixPath('/home/reports/daily.pdf') 
संबंधित मुद्दे