Чтение из файла с 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()