Как сохранить кортеж в некоторой переменной из sys.stdin

#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)
 

для создания нового списка кортежей.