Вопрос по stdin, python, filenames – Python стандартный ввод имени файла

6

Я пытаюсь получить имя файла, указанное в командной строке. Например:

python3 ritwc.py < DarkAndStormyNight.txtI»

пытаюсь получить DarkAndStormyNight.txt

Когда я пытаюсь выполнить fileinput.filename (), я получаю то же самое с sys.stdin. Это возможно? Я'Я не ищу sys.argv [0], который возвращает текущее имя скрипта.

Спасибо!

Ваш Ответ

4   ответа
1

поскольку он показывает, что 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)

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

2

Ты можешь использовать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

4

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

В Linux и некоторых связанных системах вы можете получить имя файла с помощью следующего трюка:

import os
print(os.readlink('/proc/self/fd/0'))

/proc/ - это специальная файловая система в Linux, которая предоставляет информацию о процессах на машине.self означает текущий запущенный процесс (тот, который открывает файл).fd каталог, содержащий символические ссылки для каждого открытого дескриптора файла в процессе. 0 - номер дескриптора файла для.stdin

Привет nneonneo, вы знаете, почему мой Ubuntu действительно имеет путь/proc/self/fd/0  но, когда я делаю./test.py < test.txt, есть ошибкаNo such file or directory: '/proc/self/fd/0' ? Спасибо Pei
0

что этовозможно. Что касается вашего скрипта на python,пишет в стандартный вывод. Тот факт, что вы записываете то, что записано на стандартный вывод, и записываете это в файл в своей оболочке, не имеет ничего общего со сценарием python.

Похожие вопросы