2015-12-16 7 views
2

Мой скрипт должен работать в 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()) 
+0

'os.path.join' будет использовать OS специфического разделитель пути и' os.path.sep 'будет содержать специальный разделитель пути к ОС. В Linux/Unix 'os.path.sep == '/'' и в Windows 'os.path.sep == '\'' –

ответ

6

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

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

с:

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

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

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

+0

Спасибо. Используя 'os.path.join()', я получил идеальные строки в любом случае. Я счастлив. Большое вам спасибо за подробную информацию. –

0

Изменение:

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

в

open(args.confdir + os.sep + "sample.txt') 
+0

Благодарим вас за советы. Я не знал 'os.sep'. Тогда я буду использовать его в следующий раз. Большое спасибо. –

2

Вы можете использовать объект такой, как 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()) 
+0

спасибо @ J.F. Себастьян, я буду использовать 'pathlib.Path' в следующий раз. –

Смежные вопросы