【问题标题】:How to process input data from a text file如何处理来自文本文件的输入数据
【发布时间】:2019-09-12 15:56:42
【问题描述】:

我是 Python 的初学者。为了练习它,我从 Code Abbey 做练习。他们经常将输入数据显示为数字列。在下面的示例中,我应该计算算术序列的第一个成员的总和。输入数据分为三列:

25 12 77

27 14 95

8 0 30

其中第一列中的数字是序列的起点,第二列中的数字是增量值,最后一列中的数字表示应该相加的值的数量。

由于这些包含输入数据的列表通常很长,我不想将它们硬编码在脚本中。所以我将它们复制、粘贴并保存在纯文本文件中。 在开始练习之前,我必须经过四个“for”循环来将初始文本文件转换为可行的格式(从字符串转换为整数)。此外,我必须创建几个列表,并在其中添加后续结果。

在第一个“for”循环之后,我得到了一个字符串列表:['25 12 77', '27 14 95',...]

在第二个“for”循环之后,我得到了一个字符串列表 [['25', '12', '77'], ['27', '14', '95']...]

在第三个和第四个(嵌套的)“for”循环之后,我终于收到了一个整数列表 [25, 12, 77, 27, 14, 95...]

with open("input_progression.txt") as file:

    for line in file:
        line = line.strip()
        lines.append(line)

    for strings in lines:
        strings = strings.split(' ')
        g.append(strings)

    for sublist in g:
       for item in sublist:
           flat_list.append(item)
        flat_list = list(map(int, flat_list))

    for numbers in range(int(len(flat_list) / 3)):
        for integer in range(0, flat_list[counter + 2]):
            result += (flat_list[counter] + flat_list[counter + 1] * integer)
        outcome.append(result)
        counter += 3
        result = 0
print (outcome)

这是一项相当乏味的工作(所有这些对我来说都是新事物)。你知道任何更简单(或者可能是 Pythonian)的方法吗?是否有教程如何使用文本文件作为输入?

【问题讨论】:

    标签: python file input text


    【解决方案1】:

    试试:

    with open("input_progression.txt") as f:
        outcome = [int(item) for sublist in [l.split() for l in f] for item in sublist]
    print(outcome)
    

    【讨论】:

    • 谢谢。但是,我使用您的代码收到的结果是字符串列表,而不是整数。类似于:['14', '9', '50', '30', ....]
    • 哇,它现在按预期工作了。一行代码而不是十行。有点高级,但即使我不完全理解它,我也会使用你的代码(还)。谢谢!
    【解决方案2】:

    您可以使用更少的循环。

    with open("input_progression.txt") as file:
        for line in file:
            line = line.strip()
            line = line.split(" ")
            start = int(line[0])
            incr_val = int(line[1])
            num_loops = int(line[2])
            for n in range(num_loops):
                start += incr_val #Increment
            print(start) #answer for each row
    

    【讨论】:

    • 您好,结果出乎意料。以我给出的数字为例(25 12 77 等),我收到输出:949、1357、8。
    • 也许我读错了你的问题。我理解每一行第 1 列 = 起始值,第 2 列 = 增量值,第 3 列是增量的次数。这不正确吗?
    • 是的,没错。但是对于输入 [25, 12, 77, 27, 14, 95, 8, 0, 30],预期结果是 [37037, 65075, 240]。但不知何故,当使用您的代码时,我收到 [949, 1357, 8]。然而,这不是重点。问题是如何将三列字符串的txt文件转换成整数列表。
    【解决方案3】:

    这样更短更精确

    flat_list = []
    outcome = []
    counter = 0
    result = 0
    with open("input_progression.txt") as file:
    for line in file:
        line = line.strip().split(' ')
        if len(line) >= 1: flat_list.append(line) 
    flat_list = [int(item) for sublist in flat_list for item in sublist]
    
    
    for numbers in range(int(len(flat_list) / 3)):
        for integer in range(0, flat_list[counter + 2]):
            result += (flat_list[counter] + flat_list[counter + 1] * integer)
        outcome.append(result)
        counter += 3
        result = 0
    print (outcome)
    

    【讨论】:

    • 嗨,当我打印你的 flat_list 时,我只收到最后三位数字 [8, 0, 30]。我希望有整个列表 [25, 12, 77, 27, 14, 95, 8, 0, 30]
    【解决方案4】:

    您可以使用正则表达式更轻松地解析文本文件。

    import re
    file = open("input_progression.txt", "r")
    text = ""
    for line in file:
      text = text + line
    outcome = [int(num) for num in re.findall("[0-9]+", text)]
    print(outcome)
    

    【讨论】:

      猜你喜欢
      • 2014-02-23
      • 2021-02-17
      • 1970-01-01
      • 2014-01-07
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多