#python
#python
Вопрос:
не могли бы вы помочь, как собирать данные с помощью sys.stdin
Например, я хотел бы сохранить входящие строки в список l .
Входящие данные являются кортежем: ('sometext', 1, 0), ('sometext', 0, 5)
import sys
l = list()
for line in sys.stdin.readlines():
l=sys.stdin.read()
print(l)
Комментарии:
1. Почему вы читаете дважды? Просто сделайте
l.append(line)
внутри цикла… Но это на самом деле не обязательно, потомуl
что это просто то же самое, чтоsys.stdin.readlines()
Ответ №1:
Чтение из sys.stdin
(или путем input()
, если на то пошло) просто возвращает строку; если эта строка должна быть преобразована во что-то другое, вам нужно проанализировать ее или иным образом обработать.
Если вы ожидаете выражения Python, вы можете использовать ast.literal_eval()
для синтаксического анализа каждой строки, но для такого простого формата, как этот, вы можете просто split
и вызвать int()
или какую-либо другую функцию преобразования для полей, которые нуждаются в преобразовании.
l = list()
for line in sys.stdin:
if not line.startswith("(") or not line.endswith(")n"):
raise ValueError("Not valid input: %s" % line)
# properly speaking we should only trim one each of left and right paren
fields = [x.strip() for x in line.lstrip("(").rstrip(")n").split(",")]
if len(fields) != 3:
raise ValueError("Wrong number of fields: %s" % line)
l.append(tuple([fields[0].strip('"')] list(map(int, fields[1:]))))
Это грубо и неэлегантно, поэтому, по крайней мере, должно убедить вас в том, что может быть лучшее решение вашей проблемы (может быть, просто прочитайте CSV или JSON вместо этого, чтобы вам не приходилось выполнять весь этот синтаксический анализ самостоятельно?)
Комментарии:
1. Большое спасибо, это именно то, что я искал! Вы абсолютно правы в том, что должно быть лучшее решение того, что я пытаюсь сделать. Но я только в начале изучения Python, и многие очевидные вещи для меня не так просты 🙂 Теперь я понял, что с самого начала выбрал не лучший способ решения своей задачи. Но сейчас я пытаюсь как-то закончить это, а затем я попытаюсь выполнить эту задачу каким-то лучшим способом. Спасибо за подробный ответ!
Ответ №2:
Вы можете напрямую использовать input()
встроенную функцию с небольшой настройкой, как показано ниже. Поступая таким образом, вы остаетесь без импорта и чистого кода.
l = list()
while True:
_in = input()
if _in.lower() in ('q', 'quit'):
break
l.append(_in)
t = tuple(l)
print(t)
Результат
$ python run.py
a
b
c
q
('a', 'b', 'c')
Однако всегда предписывается добавлять журналы или print
инструкции, чтобы пролить свет на то, что происходит внутри программы.
Комментарии:
1. Вопрос касается чтения
sys.stdin
, почему бы вамinput()
вместо этого вернуться к нему?
Ответ №3:
Если вы хотите использовать sys.stdin, вы можете использовать это:
import sys
l = []
for line in sys.stdin:
if len(line) == 1:
break
l.append(line[:-1].split())
print(l)
Последний символ в строке — » n», поэтому, если вам не нужно сохранять это, вырежьте его с помощью
line[:-1]
как и я.
Если строка пуста (содержит только символ новой строки) if len(line) == 1 :
, программа прекращает чтение stdin.
Если в конце вводятся кортежи, вы можете использовать:
new_l = []
for _ in l:
new_l.append(tuple(_))
print(new_l)
для создания нового списка кортежей.