Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python构建完整路径文件名_Python_Join_Filenames - Fatal编程技术网

用Python构建完整路径文件名

用Python构建完整路径文件名,python,join,filenames,Python,Join,Filenames,我需要向模块传递一个文件路径名。如何从目录名、基本文件名和文件格式字符串构建文件路径 调用时目录可能存在,也可能不存在 例如: 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_

我需要向模块传递一个文件路径名。如何从目录名、基本文件名和文件格式字符串构建文件路径

调用时目录可能存在,也可能不存在

例如:

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
嗯,为什么不:

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

os.path.join(dir_name, base_filename + "." + filename_suffix)
请记住,
os.path.join()
的存在只是因为不同的操作系统使用不同的路径分隔符。它消除了这种差异,因此跨平台代码不必因每个操作系统的特殊情况而混乱。对于文件名“扩展名”(见脚注),不需要这样做,因为在每个操作系统上,它们总是用点字符连接到名称的其余部分

如果无论如何使用函数都能让您感觉更好(并且您喜欢不必要地使代码复杂化),您可以这样做:

os.path.join(dir_name, '.'.join((base_filename, filename_suffix)))
suffix = '.pdf'
pathlib.PurePath(dir_name, base_filename + suffix)
如果您希望保持代码干净,只需在后缀中添加点:

suffix = '.pdf'
os.path.join(dir_name, base_filename + suffix)
这种方法也恰好与中的后缀约定兼容,在提出这个问题几年后,python 3.4中引入了后缀约定。不需要向后兼容的新代码可以执行以下操作:

os.path.join(dir_name, '.'.join((base_filename, filename_suffix)))
suffix = '.pdf'
pathlib.PurePath(dir_name, base_filename + suffix)
如果您只处理本地操作系统的路径,可能会尝试使用较短的
Path()
而不是
PurePath()
。(不过,考虑到原始问题背后的跨平台问题,我会质疑这一选择。)

警告:请勿将pathlib的
与后缀()一起使用。如果该方法包含一个点,它将损坏
base\u filename


注:在微软操作系统之外,没有文件名“扩展名”。它在Windows上的出现来自MS-DOS和FAT,它们从已经死了几十年的CP/M那里借用了它。我们很多人习惯看到的那个点加上三个字母只是其他现代操作系统上文件名的一部分,它没有内置含义。

只需使用文件名和扩展名连接路径即可。用于在执行脚本时访问传递给脚本的参数:

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

如果您有幸运行Python 3.4+,您可以使用:


谢谢,但我希望有一种更干净的方法来附加扩展。python甚至有一个splitext函数来切断扩展。因此必须做一些相反的事情。splitext函数保留扩展前面的“.”。这可能是最干净的方法。如果您想让它在代码中“看起来”更干净,我建议使用函数或lambda函数。您提到操作系统分隔符可能不是
。为此,我们可以使用
os.extsep
。我没有提到这一点。您花了很大的篇幅解释了“文件名”扩展名“仅在一个主要操作系统上有重要意义(在非Windows系统上它们只是文件名的一部分),并且它们的分隔符总是一个点”。OP最后还表示他们看到了/pdf。所以你可以做
os.path.join(dir\u name,base\u filename,os.extsep,extension)
。你的答案完全正确。是的,你是对的,它只返回了一个字符串,所以os.path.join(dir_name),.join([base_filename,os.extsep,extension])应该可以。同样,它不会影响您答案的正确性。@sjbx您应该在文件名部分之间放置
+
os.path.join()
在参数之间添加特定于操作系统的路径分隔符(
/
)(例如@sәoɈ在其答案中正确地包含它们。因此,代码片段的正确形式是:
os.path.join(dir_name,base_filename+os.extsep+扩展名)
我发现pathlib比os.path.join优雅得多,相比之下,os.path.join看起来相当笨重。如果文件名为“>>>文件名2=”daily.hourly'>>>>路径(dirname,filename2)。带有后缀(后缀)输出:WindowsPath('/home/reports/daily.pdf')@WontLeve:如果文件名已经有后缀,将替换它而不是追加。您需要类似于
Path(dirname,filename2+后缀)
from pathlib import Path

# Build paths inside the project like this: BASE_DIR / 'subdir'.

BASE_DIR = Path(__file__).resolve().parent.parent
TEMPLATE_PATH = Path.joinpath(BASE_DIR,"templates")
print(TEMPLATE_PATH)