从Python文件读取行有什么更好的方法?
这是我的Python文件:
TestCases-2
Input-5
Output-1,1,2,3,5
Input-7
Ouput-1,1,2,3,5,8,13
我想要的是这个:
- 一个变量
test_no = 2
(测试用例的数量) - 一个列表
testCaseInput = [5,7]
- 一个列表
testCaseOutput = [[1,1,2,3,5],[1,1,2,3,5,8,13]]
我尝试过这样做:
testInput = testCase.readline(-10)
for i in range(0,int(testInput)):
testCaseInput = testCase.readline(-6)
testCaseOutput = testCase.readline(-7)
下一步是根据 (',')
来分割数字,然后把它们放进一个列表里。
奇怪的是,readline(-6)
并没有给出我想要的结果。
有没有更好的方法呢?我明显漏掉了什么。
我不介意在这里使用序列化,但我想让它变得非常简单,让别人可以像我展示的那样写一个文本文件,然后从中提取数据。该怎么做呢?
4 个回答
1
你可以用正则表达式来解决这个问题,这样会简单很多。可以看看这个问题:python: 多行正则表达式
对于你的情况,可以试试这个:
import re
s = open("input.txt","r").read()
(inputs,outputs) = zip(*re.findall(r"Input-(?P<input>.*)\nOutput-(?P<output>.*)\n",s))
然后根据需要对每个输出元素使用 split(",")
来分割
这样做的好处是,你不需要在输入文件中包含第一行,也就是说你不需要提前指定有多少条数据。
你还可以去掉上面代码中的解压部分(就是 zip(*...)
),这样你就可以一次处理一对输入和输出。我猜这正是你想要做的。
编辑 想给你一个完整的例子,说明我刚才的意思。我假设这是为了一个测试脚本,所以我建议利用模式匹配的迭代器来帮助你让代码更简洁:
for (input,output) in re.findall(r"Input-(?P<input>.*)\nOutput-(?P<output>.*)\n",s):
expectedResults = output.split(",")
testResults = runTest(input)
// compare testResults and expectedResults ...
2
我不太确定你想要做什么,但我想我会尝试这样的做法:
testCaseIn = [];
testCaseOut = [];
for line in testInput:
if (line.startsWith("Input")):
testCaseIn.append(giveMeAList(line.split("-")[1]));
elif (line.startsWith("Output")):
testCaseOut.append(giveMeAList(line.split("-")[1]));
这里的 giveMeAList()
是一个函数,它接收一个用逗号分隔的数字列表,然后从中生成一个列表数据。
我没有测试过这段代码,但我以前写过类似结构的代码,用来制作配置文件。
2
给readline方法传一个负数参数,表示要读取的字节数。我觉得这样做可能不是你想要的。
其实,更简单的方法是用readlines()一次性把所有内容都读进一个列表里:
with open('data.txt') as f:
full_lines = f.readlines()
# parse full lines to get the text to right of "-"
lines = [line.partition('-')[2].rstrip() for line in full_lines]
numcases = int(lines[0])
for i in range(1, len(lines), 2):
caseinput = lines[i]
caseoutput = lines[i+1]
...
这里的想法是把不同的任务分开处理(数据来源、解析'-'的部分,以及后续的业务逻辑)。这样比在每一步都用readline()和重复的解析逻辑要好得多。