Вопрос по stdin, python, filenames – Python стандартный ввод имени файла
Я пытаюсь получить имя файла, указанное в командной строке. Например:
python3 ritwc.py < DarkAndStormyNight.txtI»
пытаюсь получить DarkAndStormyNight.txt
Когда я пытаюсь выполнить fileinput.filename (), я получаю то же самое с sys.stdin. Это возможно? Я'Я не ищу sys.argv [0], который возвращает текущее имя скрипта.
Спасибо!
поскольку он показывает, что python не может видеть это имя файла, когда stdin перенаправляется из консоли, у вас есть альтернатива:
Назовите вашу программу так:
python3 ritwc.py -i your_file.txt
а затем добавьте следующий код для перенаправления stdin изнутри python, чтобы у вас был доступ к имени файла через переменную "filename_in ":
import sys
flag=0
for arg in sys.argv:
if flag:
filename_in = arg
break
if arg=="-i":
flag=1
sys.stdin = open(filename_in, 'r')
#the rest of your code...
Если сейчас вы используете команду:
print(sys.stdin.name)
вы получите свое имя файла; однако, если вы выполните ту же команду печати после перенаправления стандартного ввода с консоли, вы получите результат:, который должен быть доказательством того, что питон можеттаким образом не вижу имя файла.
Ты можешь использоватьArgumentParser
, который автоматически дает вам интерфейс с аргументами командной строки, и даже предоставляет помощь и т. д.
from argparse import ArgumentParser
parser = ArgumentParser()
parser.add_argument('fname', metavar='FILE', help='file to process')
args = parser.parse_args()
with open(args.fname) as f:
#do stuff with f
Теперь звонитеpython2 ritwc.py DarkAndStormyNight.txt
, Если вы позвонитеpython3 ritwc.py
без аргументоввыдам ошибку, сказав, что ожидаемый аргументFILE
, Вы также можете позвонитьpython3 ritwc.py -h
и это объяснит, чтоfile to process
необходимо.
PS здесь вышлоОтличное введение в то, как его использовать:http://docs.python.org/3.3/howto/argparse.html
В общем невозможно получить имя файла в зависимости от платформы. Другие ответы охватывают разумные альтернативы, такие как передача имени в командной строке.
В Linux и некоторых связанных системах вы можете получить имя файла с помощью следующего трюка:
import os
print(os.readlink('/proc/self/fd/0'))
/proc
/ - это специальная файловая система в Linux, которая предоставляет информацию о процессах на машине.self
означает текущий запущенный процесс (тот, который открывает файл).fd
каталог, содержащий символические ссылки для каждого открытого дескриптора файла в процессе. 0 - номер дескриптора файла для.stdin
/proc/self/fd/0
но, когда я делаю./test.py < test.txt
, есть ошибкаNo such file or directory: '/proc/self/fd/0'
? Спасибо
Pei