在Python程序中阅读管道输入文件的内容

lokaqttq  于 2023-01-08  发布在  Python
关注(0)|答案(2)|浏览(203)

我必须读取通过管道传输到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的新文件。
更新编号2
我试过这样

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

像这样的一条线

Add Tom 4111111111111111 $1000

每个字符都显示在新行中,如下所示

A
d
d

T
o
m

. . .

我希望所有字符都打印在一行上。

iezvtpos

iezvtpos1#

sys.argv是一个列表,其中包含调用程序时使用的参数(如果有)。
如果它只有一个元素长,那么调用程序时没有任何参数(脚本名本身是第一个参数,所以实际上不算),因此应该从sys.stdin读取。
否则,如果它有两个或多个元素,则调用程序时将文件名作为参数,因此应该打开该文件并将其用作输入。

c7rzv4ha

c7rzv4ha2#

这对我来说效果最好。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.

相关问题