2011-08-20 24 views
97

Bir dosya yolunu pdf, html vb. Gibi bir rapor belgesi oluşturan bir modüle iletmem gerekir. Bir dizin adından, yol dosya adından ve dosya adından dosya yolu adı nasıl oluşturulur? dosya biçimi dizesi?python'da tam yol dosya adı oluşturma,

dizin veya el olmak görünmüyordu parçaları birleştirerek bir dize '/home/me/dev/my_reports/daily_report.pdf'

oluşturmak için gereken örneğin çağrı

sırasında

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

mevcut olmayabilir iyi bir yol. Ben

join(dir_name,base_filename,format) 

os.path.join çalıştı ama, neden sadece

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

cevap

144

:

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

Keep aklında os.path.join(), farklı işletim sistemleri tarafından kullanılan farklı yol ayırıcı karakterlerini düzeltmek için vardır, bu nedenle kodunuz her biri için özel durum gerektirmez. Dosya adı "uzantıları" sadece bir ana işletim sisteminde önemli bir anlam ifade eder (bunlar Windows olmayan sistemlerde sadece dosya isimlerinin bir parçasıdır) ve onların ayırıcıları her zaman bir noktadır. Eğer gerçekten temiz kodunuzu tutmak istiyorsanız, basitçe soneki noktayı dahil,

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

Veya: Orada bir işlev onlara katılmak için gerek, ama birini kullanarak daha iyi hissettiren, sen bunu yapabilirsiniz :

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

OS ayırıcısının '.' olmayabilir. Bunun için 'os.extsep' kullanabilir. – sjbx

+1

Böyle bir şeyden bahsetmedim. –

+3

'Dosya adı' uzantılarının yalnızca bir ana işletim sisteminde (Windows olmayan sistemlerde sadece dosya adının bir parçası olduklarında) anlamlı bir anlamı olduğunu ve onların ayırıcı karakterlerinin her zaman bir nokta olduğunu açıklamak için bazı uzunluklara gittiniz. . OP de sonunda/pdf gördüklerini ifade etti. Yani os.path.join (dir_name, base_filename, os.extsep, extension) 'yi yapmış olabilirsiniz. Cevabınız kesinlikle doğru. – sjbx

19

Um verir: Bu iyi çalışır

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

teşekkürler ama o extension..python ekleme daha temiz bir yolu olduğunu umuyordum bile bir şey için olmalı extension..so kesmek için bir splitext işlevi vardır tersine –

+1

yapın. splitext işlevi '.' uzantının önünde. Bu muhtemelen bunu yapmanın en temiz yolu. Kodunuzda "temiz" görünmesini istiyorsanız, bir işlev veya bir lambda işlevi kullanmanızı öneriyorum. – Vorticity

0

Sadece dosya adı ve uzantısı ile yolunu katılmak için os.path.join kullanın. bunu yürütürken dosyasına aktarılan değişkenleri erişmek için sys.argv kullanın: Python 3.4+ çalıştıran olacak kadar şanslı iseniz

# on windows-based systems 
    python script.py year 

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

kullanabileceğiniz pathlib:

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

Basitçe gibi komut dosyasını çalıştırın:

>>> from pathlib import Path 
>>> dirname = "/home/reports" 
>>> filename = "daily" 
>>> suffix = ".pdf" 
>>> Path(dirname).joinpath(filename).with_suffix(suffix) 
PosixPath('/home/reports/daily.pdf') 
İlgili konular