Чтение из файла с sys.stdin в Pycharm

Я пытаюсь проверить простой код, который читает файл по строкам с помощью Pycharm.

for line in sys.stdin:
    name, _ = line.strip().split("\t")
    print name

У меня есть файл, который я хочу ввести в тот же каталог: lib.txt

Как я могу отлаживать свой код в Pycharm с помощью входного файла?

Ответ 1

Вам нужно создать настраиваемую конфигурацию запуска, а затем добавить файл в качестве аргумента в поле "Script Parameters". См. Pycharm интерактивную справку для пошагового руководства.

Однако, даже если вы это сделаете (как вы обнаружили), ваша проблема не будет работать, поскольку вы не разбираете правильные аргументы командной строки.

Вместо этого вам нужно использовать argparse:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("filename", help="The filename to be processed")
args = parser.parse_args()
if args.filename:
    with open(filename) as f:    
        for line in f:
            name, _ = line.strip().split('\t')
            print(name)

Ответ 2

Вы можете обойти эту проблему, если используете модуль fileinput, а не пытаетесь напрямую прочитать stdin.

С fileinput, если script получает имя файла в аргументах, он будет читать из аргументов по порядку. В вашем случае замените свой код выше:

import fileinput
for line in fileinput.input():
    name, _ = line.strip().split("\t")
    print name

Самое замечательное в fileinput заключается в том, что оно по умолчанию используется для stdin, если не указаны аргументы (или если указан аргумент "-" ).

Теперь вы можете создать конфигурацию запуска и указать имя файла, который хотите использовать как stdin, в качестве единственного аргумента для вашего script.

Подробнее о fileinput здесь

Ответ 3

Я пытался найти способ использовать чтение файла в качестве стандартного ввода в PyCharm. Тем не менее, большинство парней, включая реактивные мозги, сказали, что нет никакого способа и никакой поддержки, это особенность командной строки, которая не связана с самим PyCharm. * https://intellij-support.jetbrains.com/hc/en-us/community/posts/206588305-How-to-redirect-standard-input-output-inside-PyCharm-

На самом деле, эта функция, считывающая файл как stdin, так или иначе важна для меня, чтобы упростить ввод данных для решения проблемы программирования из hackerank или acmicpc.

Я нашел простой способ. Я также могу использовать input() для выдачи стандартного ввода из файла!

import sys
sys.stdin = open('input.in', 'r')
sys.stdout = open('output.out', 'w')

print(input())
print(input())

input.in пример:

hello world
This is not the world ever I have known

пример output.out:

hello world
This is not the world ever I have known

Ответ 4

Для гибкости вы можете написать свой python script, чтобы всегда читать из stdin, а затем использовать перенаправление команд для чтения из файла:

$ python myscript.py < file.txt

Однако, насколько я могу судить, вы не можете использовать перенаправление от PyCharm, поскольку Run Configuration не позволяет его.

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

$ python myscript.py file.txt

Есть несколько способов справиться с этим. Я думаю, что argparse является излишним для этой ситуации. Кроме того, вы можете напрямую обращаться к аргументам командной строки с помощью sys.argv:

import sys

filename = sys.argv[1]
with open(filename) as f:    
    for line in f:
        name, _ = line.strip().split('\t')
        print(name)

Для надежного кода вы можете проверить правильность количества аргументов.

Ответ 5

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

def monkey():
    print('Warning, monkey patching')
    global input
    input = iter(open('in.txt')).next

monkey()

T = int(input())

for caseNum in range(1, T + 1):
    N, L = list(map(int, input().split()))
    nums = list(map(int, input().split()))

редактировать для python3:

def monkey():
    print('Warning, monkey patching')
    global input
    it = iter(open('in.txt'))
    input = lambda : next(it)

monkey()