Мой скрипт должен работать в Linux и Windows. И сценарий получает 2 строки шаблона в качестве аргументов.

A:"C:\test" or "/usr/local/test" (with no suffix)
B:"C:\test\" or "/usr/local/test/" (with suffix "\","/")

Следующий код работает без проблем. Но я хочу не использовать конкретный символ "/". Потому что это близко к ошибке, я думаю. У тебя есть идея?

# -*- coding: utf-8 -*-

import argparse

def parse_args():
    parser = argparse.ArgumentParser(description='This script is ...')
    parser.add_argument('--confdir', type=str, required=True)
    parser.add_argument('--outdir', type=str, required=True)
    return parser.parse_args()

if __name__ == '__main__':
    args = parse_args()
    # "C:/test" or "C:/test/" in Windows
    # "/usr/local/test" or "/usr/local/test/" in Linux
    print(args.confdir)

    f = open(args.confdir + "/" + 'sample.txt')
    print(f.read())
1
Maiko Ohkawa 16 Дек 2015 в 07:50

3 ответа

Лучший ответ

Использование os.path.join является лучшим подход, заменив:

open(args.confdir + "/" + 'sample.txt') 

С участием:

open(os.path.join(args.confdir, 'sample.txt'))

os.path.join будет правильно предотвращать двойные разделители, поэтому не имеет значения, заканчивается ли confdir косой чертой или нет, будет выводиться только одна косая черта.

В редких случаях вы можете поработать с os.sep и { {X1}} вместо этого, но это редко. Основная причина, по которой вы можете их использовать, заключается в явном lstrip удалении неправильных начальных слешей в компоненте пути; конечные косые черты не имеют значения (os.path.join для вас), но начальные косые черты рассматриваются как начало абсолютного пути и отбрасывают предыдущие компоненты.

5
ShadowRanger 16 Дек 2015 в 16:02

Вы можете использовать такой объект, как pathlib.Path, который заботится о разделитель конечного пути автоматически, например:

#!/usr/bin/env python3
import argparse
import pathlib

parser = argparse.ArgumentParser()
parser.add_argument('--confdir', type=pathlib.Path, default='.')
args = parser.parse_args()
print(args.confdir)
path = args.confdir / 'sample.txt'
print(path)
print(path.read_text())
6
jfs 16 Июл 2017 в 17:51

Изменить:

open(args.confdir + "/" + 'sample.txt') 

К

open(args.confdir + os.sep + "sample.txt')
1
Sting Jia 16 Дек 2015 в 05:00