【发布时间】:2014-03-05 00:31:03
【问题描述】:
我正在尝试测试一个使用 Pycharm 逐行读取文件的简单代码。
for line in sys.stdin:
name, _ = line.strip().split("\t")
print name
我在同一个目录下有我要输入的文件:lib.txt
如何使用输入文件在 Pycharm 中调试我的代码?
【问题讨论】:
我正在尝试测试一个使用 Pycharm 逐行读取文件的简单代码。
for line in sys.stdin:
name, _ = line.strip().split("\t")
print name
我在同一个目录下有我要输入的文件:lib.txt
如何使用输入文件在 Pycharm 中调试我的代码?
【问题讨论】:
这是我今天的 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()
【讨论】:
为了灵活性,您可以编写 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)
对于健壮的代码,您可以检查是否给出了正确数量的参数。
【讨论】:
我一直在尝试找到一种在 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
【讨论】:
如果您使用 fileinput 模块而不是尝试直接读取标准输入,则可以解决此问题。
使用文件输入,如果脚本在参数中接收到文件名,它将按顺序从参数中读取。在您的情况下,将上面的代码替换为:
import fileinput
for line in fileinput.input():
name, _ = line.strip().split("\t")
print name
fileinput 的好处在于,如果没有提供参数(或者如果提供了参数“-”),它默认为标准输入。
现在您可以创建运行配置并提供您想用作标准输入的文件的文件名作为脚本的唯一参数。
阅读更多关于fileinput here
【讨论】:
您需要创建自定义运行配置,然后将文件作为参数添加到“脚本参数”框中。有关分步指南,请参阅 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)
【讨论】: