Чтение содержимого входного файла по каналу в программе Python - PullRequest
0 голосов
/ 05 июля 2019

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

  1. Ваша программа должна принимать входные данные из двух источников: имя файла, переданное в аргументах командной строки, и STDIN.Например, в Linux или OSX ./myprogram input.txt и ./myprogram < input.txt должны работать.

Я не знаю, как это сделать.

if __name__ == '__main__': 
  # I don't know what to do here.

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

Add Tom 4111111111111111 $1000
Add Lisa 5454545454545454 $3000
Add Quincy 1234567890123456 $2000
Charge Tom $500
Charge Tom $800
Charge Lisa $7
Credit Lisa $100
Credit Quincy $200

Всякий раз, когда я пытаюсь python myprogram.py > input.txt, программа зависает.Я использую Python 3.6.5, если это помогает.

Обновление:

Я пробовал что-то вроде этого:

(env) myproject (master) $ python main.py > test.txt
testing testing testing
1 2 3
1 2 3

Файл создает новый файл, если он это делаетне существует или перезаписывает существующий файл с введенным содержимым.В этом случае новый файл с именем test.txt был создан с указанным выше содержимым.

Update # 2

Я пробовал что-то вроде этого

if __name__ == '__main__':
  for line in sys.stdin.readline():
      print (line)

Для одногострока, подобная этой

Add Tom 4111111111111111 $1000

Каждый символ отображается в новой строке, как в

A
d
d

T
o
m

. . .

Я хочу, чтобы все символы печатались в одной строке.

Ответы [ 2 ]

0 голосов
/ 05 июля 2019

Это сработало лучше для меня. https://docs.python.org/3/library/fileinput.html

Это перебирает строки всех файлов, перечисленных в sys.argv [1:], по умолчанию sys.stdin, если список пуст

После небольшого количества проб и ошибок вот что я придумал

def handle_command_line_inputs():
    """Read the contents of the file piped through the command line.

    Once the operations are executed, then the balance is ready to be displayed
    """
    logging.info('Reading from the file')
    for line in fileinput.input():
        print(line)
        # My custom logic

Это печатает каждую строку.

В моем модульном тесте

from unittest import mock


def get_test_file():
    current_path = os.path.dirname(os.path.realpath(__file__))
    return os.path.normpath(os.path.join(current_path, 'input.txt'))


def read_input_file():
    """Simulates the generators that read file contents."""
    input_file = get_test_file()
    with open(input_file, 'r') as f:
        for line in f:
            yield line


@mock.patch('fileinput.input', side_effect=read_input_file)
def test_handle_command_line_inputs(mocked_fileinput):

    myprogram.handle_command_line_inputs()
    # Run your assertions.
0 голосов
/ 05 июля 2019

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

Если длина одного элемента, то ваша программа была вызвана без каких-либо аргументов (само имя скрипта является первым аргументом, поэтому он не считается), и поэтому вам следует читать из sys.stdin.

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

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