【问题标题】:Reading from a file with sys.stdin in Pycharm在 Pycharm 中使用 sys.stdin 从文件中读取
【发布时间】:2014-03-05 00:31:03
【问题描述】:

我正在尝试测试一个使用 Pycharm 逐行读取文件的简单代码。

for line in sys.stdin:
    name, _ = line.strip().split("\t")
    print name

我在同一个目录下有我要输入的文件:lib.txt

如何使用输入文件在 Pycharm 中调试我的代码?

【问题讨论】:

    标签: python stdin pycharm


    【解决方案1】:

    这是我今天的 google code jam 破解,祝我好运。想法是在提交之前注释掉monkey():

    def monkey():
        print('Warning, monkey patching')
        global input
        input = iter(open('in.txt')).next
    
    monkey()
    
    T = int(input())
    
    for caseNum in range(1, T + 1):
        N, L = list(map(int, input().split()))
        nums = list(map(int, input().split()))
    

    为 python3 编辑:

    def monkey():
        print('Warning, monkey patching')
        global input
        it = iter(open('in.txt'))
        input = lambda : next(it)
    
    monkey()
    

    【讨论】:

      【解决方案2】:

      为了灵活性,您可以编写 Python 脚本以始终从标准输入读取,然后使用命令重定向从文件中读取:

      $ python myscript.py < file.txt
      

      但是,据我所知,您不能使用 PyCharm 的重定向,因为运行配置不允许这样做。

      或者,您可以接受文件名作为命令行参数:

      $ python myscript.py file.txt
      

      有几种方法可以解决这个问题。我认为argparse 在这种情况下是矫枉过正的。或者,您可以使用sys.argv 直接访问命令行参数:

      import sys
      
      filename = sys.argv[1]
      with open(filename) as f:    
          for line in f:
              name, _ = line.strip().split('\t')
              print(name)
      

      对于健壮的代码,您可以检查是否给出了正确数量的参数。

      【讨论】:

        【解决方案3】:

        我一直在尝试找到一种在 PyCharm 中使用读取文件作为标准输入的方法。 但是,包括jet brains在内的大多数人都表示没有办法也没有支持,这是命令行的特性,与PyCharm本身无关。 * https://intellij-support.jetbrains.com/hc/en-us/community/posts/206588305-How-to-redirect-standard-input-output-inside-PyCharm-

        实际上,这个功能,将文件作为标准输入读取,在某种程度上对我来说是必不可少的,它可以简化输入以解决来自hackerank 或 acmicpc 的编程问题。

        我找到了一个简单的方法。我也可以使用 input() 从文件中提供标准输入!

        import sys
        sys.stdin = open('input.in', 'r')
        sys.stdout = open('output.out', 'w')
        
        print(input())
        print(input())
        

        input.in 示例:

        hello world
        This is not the world ever I have known
        

        output.out 示例:

        hello world
        This is not the world ever I have known
        

        【讨论】:

          【解决方案4】:

          如果您使用 fileinput 模块而不是尝试直接读取标准输入,则可以解决此问题。

          使用文件输入,如果脚本在参数中接收到文件名,它将按顺序从参数中读取。在您的情况下,将上面的代码替换为:

          import fileinput
          for line in fileinput.input():
              name, _ = line.strip().split("\t")
              print name
          

          fileinput 的好处在于,如果没有提供参数(或者如果提供了参数“-”),它默认为标准输入。

          现在您可以创建运行配置并提供您想用作标准输入的文件的文件名作为脚本的唯一参数。

          阅读更多关于fileinput here

          【讨论】:

            【解决方案5】:

            您需要创建自定义运行配置,然后将文件作为参数添加到“脚本参数”框中。有关分步指南,请参阅 Pycharm 的 online help

            但是,即使您这样做(正如您所发现的那样),您的问题也不会解决,因为您没有解析正确的命令行参数。

            你需要改用argparse:

            import argparse
            
            parser = argparse.ArgumentParser()
            parser.add_argument("filename", help="The filename to be processed")
            args = parser.parse_args()
            if args.filename:
                with open(filename) as f:    
                    for line in f:
                        name, _ = line.strip().split('\t')
                        print(name)
            

            【讨论】:

            • 当我运行我的代码时,我进入输出窗口:/usr/bin/python /home/training/PycharmProjects/pp12/main.py purch.txt 但是什么也没发生(当我运行相同的代码时使用 f1=open('purch.txt') 加载文件
            • 你需要阅读如何parse command line arguments
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-06-23
            • 2017-05-28
            • 1970-01-01
            • 2020-09-14
            • 2017-08-16
            • 1970-01-01
            相关资源
            最近更新 更多