我正在尝试使用Pycharm测试一段简单的代码,该代码逐行读取文件。
for line in sys.stdin:
name, _ = line.strip().split("\t")
print name
我有一个要输入的文件,它在同一个目录下:lib.txt
如何在Pycharm中使用输入文件调试我的代码?
如果您使用fileinput模块而不是直接读取stdin,就可以解决此问题。
使用fileinput时,如果脚本在参数中收到文件名,则按顺序从参数中读取。在您的情况下,请使用以下代码替换上面的代码:
import fileinput
for line in fileinput.input():
name, _ = line.strip().split("\t")
print name
fileinput的优点在于,如果没有提供参数(或者提供了'-'参数),它会默认使用stdin。
现在,您可以创建一个运行配置,并将要用作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
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)
今天我参加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脚本始终从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)
为了编写健壮的代码,您可以检查是否提供了正确数量的参数。