【问题标题】:How do I iterate over all lines of files passed on the command line?如何遍历命令行上传递的所有文件行?
【发布时间】:2023-12-15 10:47:01
【问题描述】:

我通常在 Perl 中这样做:

随便.pl

while(<>) {
    #do whatever;
}

然后cat foo.txt | whatever.pl

现在,我想在 Python 中执行此操作。我尝试了sys.stdin,但我不知道该怎么做,就像我在 Perl 中所做的那样。如何读取输入?

【问题讨论】:

    标签: python stdin


    【解决方案1】:

    我讨厌打死马,但我可以建议使用纯函数吗?

    import sys
    
    def main(stdin):
      for line in stdin:
        print("You said: " + line.strip())
    
    if __name__ == "__main__":
      main(sys.stdin)
    

    这种方法很好,因为 main 完全依赖于它的输入,您可以使用任何符合行分隔输入流范例的东西对其进行单元测试。

    【讨论】:

      【解决方案2】:
      import sys
      
      for line in sys.stdin:
          # do stuff w/line
      

      【讨论】:

        【解决方案3】:

        类似这样的:

        import sys
        
        for line in sys.stdin:
            # whatever
        

        【讨论】:

          【解决方案4】:
          import sys
          def main():
              for line in sys.stdin:
                  print line
          if __name__=='__main__':
              sys.exit(main())
          

          【讨论】:

          • -1: main 返回 None -- 不清楚应该向操作系统返回什么值。
          • 这是我通常的做法,但它只迭代标准输入,而 OP 想要迭代命令行上命名的所有文件。对于那个用例,文件输入是要走的路。
          【解决方案5】:

          试试这个:

          import fileinput
          for line in fileinput.input():
              process(line)
          

          【讨论】:

          • +1 这种方式比“for line in sys.stdin”更灵活,因为它适用于文件名作为 cmd 行参数传递。
          最近更新 更多