在Pycharm中使用sys.stdin从文件中读取内容

12

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

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

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

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

5个回答

11

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

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

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

fileinput的优点在于,如果没有提供参数(或者提供了'-'参数),它会默认使用stdin。

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

请在此处阅读有关fileinput的更多信息


7
我一直在尝试找到一种在PyCharm中使用读取文件作为stdin的方法。然而,包括JetBrains在内的大多数人都说没有办法和支持,这是命令行的特性,与PyCharm本身无关。 * https://intellij-support.jetbrains.com/hc/en-us/community/posts/206588305-How-to-redirect-standard-input-output-inside-PyCharm- 实际上,这个功能——从文件读取stdin,对于我来说确实很重要,可以方便地从HackerRank或ACMICPC解决编程问题。
我发现了一个简单的方法。我也可以使用input()来从文件中获取stdin!
import sys
sys.stdin = open('input.in', 'r')
sys.stdout = open('output.out', 'w')

print(input())
print(input())

输入示例:

hello world
This is not the world ever I have known

输出.out示例:

hello world
This is not the world ever I have known

1
你需要创建一个自定义运行配置,然后在“脚本参数”框中添加你的文件作为参数。请参阅Pycharm的在线帮助以获取逐步指南。但是,即使你这样做了(如你所发现的),你的问题也不会解决,因为你没有解析正确的命令行参数。相反,你需要使用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')加载文件时,相同的代码可以正常工作)。 - thecheech
1
你需要阅读如何解析命令行参数 - Burhan Khalid

0

今天我参加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()

0

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

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

为了编写健壮的代码,您可以检查是否提供了正确数量的参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接