如何从多个部分创建文件的完整路径(例如文件夹路径、名称和扩展名)?

问题描述 投票:0回答:7

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

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

例如:

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
python filenames
7个回答
416
投票

这很好用:

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)

这种方法也恰好与 pathlib 中的后缀约定兼容,这是在提出这个问题几年后在 python 3.4 中引入的。不需要向后兼容的新代码可以做到这一点:

suffix = '.pdf'
pathlib.PurePath(dir_name, base_filename + suffix)

如果您只处理本地操作系统的路径,您可能会想使用较短的

Path()
而不是
PurePath()
。考虑到原始问题背后的跨平台问题,我会质疑这个选择。

警告:不要为此目的使用路径库的

with_suffix()
。如果它包含一个点,该方法将破坏
base_filename


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


68
投票

在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')

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

1
投票

为什么不在基本文件名中包含扩展名?

dir_name='/home/me/dev/my_reports/'
base_filename='daily_report.pdf'
os.path.join(dir_name, base_filename)

-1
投票

只需使用

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

-1
投票
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)

-1
投票
import os
def createfile(name, location, extension):
    print(name, extension, location)
    #starting creating a file with some dummy contents
    path = os.path.join(location, name + '.' + extension)
    f = open(path, "a")
    f.write("Your contents!! or whatever you want to put inside this file.")
    f.close()
    print("File creation is successful!!")

def readfile(name, location, extension):
    #open and read the file after the appending:
    path = os.path.join(location, name + '.' + extension)
    f = open(path, "r")
    print(f.read())

#pass the parameters here
createfile('test','./','txt')
readfile('test','./','txt')
© www.soinside.com 2019 - 2024. All rights reserved.