从Python文件读取行有什么更好的方法?

3 投票
4 回答
1790 浏览
提问于 2025-04-17 04:53

这是我的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()和重复的解析逻辑要好得多。

撰写回答