Каков pythonic способ получения дескрипторов файлов из командной строки с относительными или абсолютными путями?

#python #python-3.x

#python #python-3.x

Вопрос:

Когда я пишу скрипт командной строки на python, я предполагаю, что его можно вызвать из любого места. Кажется, это вызывает несоответствие, когда я хочу передать список файлов в скрипт.

Передача файлов с использованием аргументов list или wildcard (независимо от того, расширен ли bash в * nix или glob.glob с Windows) вернет либо относительный путь, либо абсолютный, в зависимости от того, как был описан путь к файлу, но это, похоже, дает два разных поведения, которые необходимо либо проверить, либо согласовать.

Если скрипт находится в том же каталоге, что и импортируемые файлы, на самом деле это не проблема, но если скрипт находится в другом каталоге, кажется, что вам нужно сначала получить абсолютный путь:

 import os,sys,glob

for arg in sys.argv[1:]:
    file_list = glob.glob(arg)
    for fn in file_list:
        print("File Reference: {}".format(os.path.abspath(fn)))
  

 > pwd
/Users/user1/Desktop/script_dir/

> cd ~/Desktop

> script_dir/test.py test_dir/*.csv /Users/user1/Desktop/test_dir/*.txt

File Reference: /Users/user1/Desktop/test_dir/temp1.csv
File Reference: /Users/user1/Desktop/test_dir/temp2.csv
File Reference: /Users/user1/Desktop/test_dir/temp1.txt
File Reference: /Users/user1/Desktop/test_dir/temp2.txt
  

Предполагая, что программа продолжала что-то делать с файлами, она затем будет манипулировать ими по абсолютному пути. Правильно ли это здесь делать? Это кажется странно запутанным, и я, кажется, могу найти любые ссылки, которые описывают это.

Комментарии:

1. Вы можете использовать pathlib.Path.cwd() для получения текущего рабочего каталога, из которого был вызван скрипт, если это полезно. Я бы просто предложил использовать pathlib.Path , и он должен знать, является ли указанный путь абсолютным или относительным для вас, IIRC.

2. Я не уверен, как это устраняет проблему. В некотором смысле, мне все равно, где находится скрипт, меня волнует только то, что он управляет файлами в каталоге, в котором пользователь находится в данный момент. Возможно, мне следует уточнить это в примере кода.

3. Обратите внимание, что я отредактировал свой комментарий. В любом случае, я не понимаю реальной проблемы здесь; если вы укажете абсолютный путь, он использует его, если вы укажете относительный путь, он использует это. Вы все еще можете перемещаться по относительным путям и абсолютным путям, как вам нужно, и вам не нужно использовать особый случай — Python будет работать с обоими. Вы просто хотите иметь возможность каждый раз регистрировать абсолютный путь? Тогда просто abspath это, прежде чем вы это напишете. Я думаю, нам нужен MCVE актуальной проблемы здесь, если она есть.

4. «В некотором смысле, мне все равно, где находится скрипт, меня волнует только то, что он управляет файлами в каталоге, в котором в данный момент находится пользователь». это то, что является текущим рабочим каталогом, это не путь, в котором находится скрипт, это эквивалентно проверке cwd в терминале. Python использует текущий рабочий каталог по умолчанию для относительных путей.

5. Вам не нужно делать ничего особенного. Просто используйте пути, которые указал пользователь. ОС автоматически интерпретирует относительные пути должным образом.