我正在尝试测试一个使用Pycharm逐行读取文件的简单代码。
for line in sys.stdin:
name, _ = line.strip().split("\t")
print name
我想在同一目录中输入我要输入的文件:lib.txt
如何使用输入文件在Pycharm中调试我的代码?
答案 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()