从Pycharm中的sys.stdin读取文件

时间:2014-02-07 14:36:46

标签: python stdin pycharm

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

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

我想在同一目录中输入我要输入的文件:lib.txt

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

5 个答案:

答案 0 :(得分:11)

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

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

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

关于fileinput的好处是,如果没有提供参数(或者提供参数' - '),它默认为stdin。

现在,您可以创建运行配置并提供要用作stdin的文件的文件名作为脚本的唯一参数。

详细了解fileinput here

答案 1 :(得分:7)

我一直试图找到一种方法在PyCharm中将读取文件用作stdin。 然而,包括喷气机大脑在内的大多数人都表示没有办法也没有支持,这是命令行的特征,与PyCharm本身无关。 * https://intellij-support.jetbrains.com/hc/en-us/community/posts/206588305-How-to-redirect-standard-input-output-inside-PyCharm-

实际上,这个以stdin方式读取文件的功能对我来说非常重要,可以轻松提供输入来解决hackerank或acmicpc的编程问题。

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

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

答案 2 :(得分:1)

您需要创建自定义运行配置,然后在“脚本参数”框中将您的文件添加为参数。请参阅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)

答案 3 :(得分:0)

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

$ python myscript.py < file.txt

但是,据我所知,你不能使用PyCharm的重定向,因为Run Configuration不允许它。

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

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

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

答案 4 :(得分:0)

这是我今天的Google代码堵塞黑客,祝我好运。想法是在提交之前先注释掉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()