Python에서 전체 경로 파일 이름 작성


181

파일 경로 이름을 모듈에 전달해야합니다. 디렉토리 이름, 기본 파일 이름 및 파일 형식 문자열에서 파일 경로를 어떻게 작성합니까?

호출시 디렉토리가 존재하거나 존재하지 않을 수 있습니다.

예를 들면 다음과 같습니다.

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

답변:


290

이것은 잘 작동합니다 :

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

os.path.join()운영 체제마다 경로 구분 문자를 다르게 사용하기 때문에 존재 한다는 점을 명심하십시오 . 이 차이를 극복하여 플랫폼 간 코드가 각 OS에 대해 특별한 경우로 어수선해질 필요가 없습니다. 파일 이름 "확장명"(각주 참조)에 대해서는 항상 모든 OS에서 점 문자로 나머지 이름에 연결되므로이 작업을 수행 할 필요가 없습니다.

어쨌든 함수를 사용하면 기분이 좋아지고 코드를 불필요하게 복잡하게 만드는 것을 좋아한다면 다음과 같이하십시오.

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

코드를 깨끗하게 유지하려면 접미사에 점을 넣으십시오.

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

(이 접근법은 또한 python 3.4에서 소개 된 pathlib 의 접미사 규칙과 호환됩니다 .)


각주 : Micorsoft 이외의 운영 체제에는 "확장자"와 같은 파일 이름이 없습니다. Windows에서의 존재는 MS-DOS와 FAT에서 나 왔으며, 수십 년 동안 죽은 CP / M에서 빌 렸습니다. 우리 중 많은 사람들이보기에 익숙한 도트 플러스 3 글자는 내장 된 의미가없는 다른 모든 최신 OS에서 파일 이름의 일부일뿐입니다.


7
OS 구분 기호가 아닐 수도 있습니다 .. 이를 위해 사용할 수 있습니다 os.extsep.
sjbx

2
나는 그런 말을하지 않았다.
ʇsәɹoɈ 2016 년

6
'파일 이름 "확장자"는 하나의 주요 운영 체제에서만 중요한 의미를 가지며 (Windows 이외의 시스템에서는 파일 이름의 일부 임) 구분 기호 문자는 항상 점입니다. 또한 OP는 마지막에 / pdf를 보았습니다. 그래서 당신은 할 수있었습니다 os.path.join(dir_name, base_filename, os.extsep, extension). 당신의 대답은 완벽하게 맞습니다.
sjbx 2016 년

3
네, 맞습니다, 그것은 단지 문자열을 돌려주기 때문에 os.path.join (dir_name, ''.join ([base_filename, os.extsep, extension])) 그렇게해야합니다. 다시 말하지만, 그것은 당신의 대답의 정확성을 훼손하지 않습니다.
sjbx

1
@ sjbx +파일 이름 부분 사이에 놓아야합니다 . os.path.join()를 추가 OS 별 (경로 구분 /인자 사이의 예를 들어) (sәɹoɈ가 제대로 그 / 그녀의 대답을 가지고 @로 따라서 귀하의 코드의 올바른 양식은 다음과 같습니다.os.path.join(dir_name, base_filename + os.extsep + extension)
Shayan 아마니

41

운 좋게도 파이썬 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')

2
나는 pathlib가 os.path.join보다 훨씬 우아하다는 것을 알았습니다.
pioniere

파일 이름에 "."가 있으면 작동하지 않습니다. >>> filename2 = 'daily.hourly'>>> 경로 (dirname, filename2) .with_suffix (suffix) 출력 : WindowsPath ( '/ home / reports / daily.pdf')
wontleave

2
@wontleave : 파일 이름에 이미 접미사가있는 경우 with_suffix()추가하는 대신 파일 이름 을 대체합니다. 당신은 같은 것을 원하는Path(dirname, filename2 + suffix)
유진 Yarmash

22

음, 왜 :

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

고맙지 만, 나는 그 확장을 추가하는 더 깨끗한 방법이 있기를 바랐다. 파이썬은 확장을 잘라내는 splitext 함수를 가지고있다. 그래서 역전을 할 무언가가 있어야한다
Damon Julian

2
splitext 함수는 '.'를 유지합니다. 확장의 전면에. 이것은 가장 깨끗한 방법 일 것입니다. 코드에서 더 깔끔하게 보이게하려면 함수 나 람다 함수를 사용하는 것이 좋습니다.
Vorticity

0

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.