2011-08-20 58 views
97

Tôi cần chuyển tên đường dẫn tệp tới mô-đun tạo tài liệu báo cáo dưới dạng pdf, html, v.v. Làm cách nào để tạo tên đường dẫn tệp từ tên thư mục, tên tệp cơ sở và chuỗi fileformat?xây dựng tên đường dẫn đầy đủ trong python,

Thư mục có thể hoặc không thể tồn tại tại thời điểm gọi

ví dụ

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

tôi cần phải tạo ra một chuỗi '/home/me/dev/my_reports/daily_report.pdf'

concatenating các mảnh bằng tay dường như không được một cách tốt. tôi đã cố gắng os.path.join

join(dir_name,base_filename,format) 

nhưng nó mang lại

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

Trả lời

144

này hoạt động tốt:

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

Giữ nhớ rằng os.path.join() tồn tại để làm mịn các ký tự phân cách đường dẫn khác nhau được sử dụng bởi các hệ điều hành khác nhau, vì vậy mã của bạn không phải đặc biệt trong mỗi trường hợp. Tên tệp "tiện ích mở rộng" chỉ có ý nghĩa quan trọng đối với một hệ điều hành chính (chúng chỉ đơn giản là một phần của tên tệp trên hệ thống không phải Windows) và dấu phân cách của chúng luôn là dấu chấm. Không cần cho một chức năng để tham gia cùng họ, nhưng nếu sử dụng một làm cho bạn cảm thấy tốt hơn, bạn có thể làm điều này:

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

Hoặc, nếu bạn muốn giữ lại code của bạn thực sự trong sạch, đơn giản bao gồm các dấu chấm trong suffix :

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

Bạn đã đề cập rằng dấu phân cách hệ điều hành có thể không phải là '.'. Đối với điều này có thể sử dụng 'os.extsep'. – sjbx

+1

Tôi đã đề cập không có điều như vậy. –

+3

Bạn đã giải thích rằng phần mở rộng "Tên tệp" chỉ có ý nghĩa quan trọng đối với một hệ điều hành chính (chúng chỉ là một phần của tên tệp trên hệ thống không phải Windows) và ký tự phân cách của chúng luôn là dấu chấm ' . OP cũng cho biết họ đã thấy/pdf ở cuối. Vì vậy, bạn có thể đã thực hiện 'os.path.join (dir_name, base_filename, os.extsep, extension)'. Câu trả lời của bạn là hoàn toàn chính xác. – sjbx

19

Um, tại sao không chỉ:

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

cảm ơn, nhưng tôi đã hy vọng có cách dọn dẹp tiện ích mở rộng đó..python thậm chí còn có chức năng splitext để cắt phần mở rộng..có điều gì đó phải làm ngược lại –

+1

Hàm splitext giữ lại '.' ở phía trước của phần mở rộng. Đây có thể là cách sạch nhất để làm điều đó. Nếu bạn muốn nó "nhìn" sạch hơn trong mã của bạn, tôi muốn đề nghị sử dụng một hàm hoặc một hàm lambda. – Vorticity

0

Chỉ cần sử dụng os.path.join để tham gia đường dẫn của bạn với tên tệp và tiện ích. Sử dụng sys.argv để truy cập đối số truyền cho các kịch bản khi thực hiện nó:

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

Đơn giản chỉ cần chạy các kịch bản như:

# on windows-based systems 
    python script.py year 

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

Nếu bạn đủ may mắn để được chạy Python 3.4 trở lên, bạn có thể sử dụng pathlib:

>>> from pathlib import Path 
>>> dirname = "/home/reports" 
>>> filename = "daily" 
>>> suffix = ".pdf" 
>>> Path(dirname).joinpath(filename).with_suffix(suffix) 
PosixPath('/home/reports/daily.pdf') 
Các vấn đề liên quan