【问题标题】:How to read a txt file containing about 2000 lines of tuples如何读取包含大约 2000 行元组的 txt 文件
【发布时间】:2020-08-25 16:22:54
【问题描述】:

我正在尝试读取一个包含大约 2000 行 Tuples 的 txt 文件,每行包含一个 Tuple

这是“data.txt”的前 10 行。

(16, 21, 24, 42, 49)
(2, 12, 40, 42, 45)
(6, 19, 22, 36, 48)
(2, 5, 20, 24, 33)
(8, 12, 24, 28, 44)
(3, 15, 29, 30, 37)
(6, 17, 30, 33, 43)
(3, 15, 16, 29, 42)
(17, 18, 20, 35, 39)
(20, 21, 23, 43, 48)

我已成功将Tuple 的整行复制到List 中,但Python 默认将其存储为StringList

这是输出:

['(16, 21, 24, 42, 49)', '(2, 12, 40, 42, 45)', '(6, 19, 22, 36, 48)', '(2, 5, 20, 24, 33)', '(8, 12, 24, 28, 44)', '(3, 15, 29, 30, 37)', '(6, 17, 30, 33, 43)', '(3, 15, 16, 29, 42)', '(17, 18, 20, 35, 39)', '(20, 21, 23, 43, 48)']

如何将ListString 转换为ListTuples。因为我想将元组的每个索引与元组的整个List 进行比较,所以如果索引的值匹配,我想要Tuples 的索引匹配的行号作为输出。因此,如果我从 "data.txt" 中获取第二个元组,即 (2, 12, 40, 42, 45) ,我需要从列表中的下一个 Tuple 开始比较它 [即 (6, 19, 22, 36, 48)] 到整个ListTuples

例如:

如果我采用第二个元组(2、12、40、42、45),我需要找到数字“2”出现在List 其余Tuples 的同一索引中的哪一行。数字“2”出现在第 1 行的下一个。 4,对于数字“12”,它在第 4 行。 5.

我将“data.txt”的内容复制到列表的代码。我还没有进入比较部分。如果您建议一些方法来比较上面提到的Tuples,这将非常有帮助。

with open('Data.txt', 'r+') as file:
    lines = file.readlines()
data = []
for line in lines:
    data.append(line.strip())
print(data[:11])  # Printing only first 10  lines from 1999 lines
print(f"Number of tuples = {len(data)}")

【问题讨论】:

  • 你可以在每个元组上使用ast.literal_eval
  • 在你的循环中而不是 data.append(line.strip()) 只是做 data.append(ast.literal_eval(line)) - 你甚至不应该需要 .strip()
  • 顺便说一句,请正确缩进您的代码。
  • 对不起,我粘贴代码时忘记了。
  • @alani 我将 data.append(line.strip()) 替换为 data.append(ast.literal_eval(line)),你的权利,我将 txt 文件中的内容准确复制到列表中。非常感谢

标签: python python-3.x list tuples


【解决方案1】:

您可以使用 ast 的 literal_eval 解析元组:

from ast import literal_eval

lines = []
with open('Data.txt', 'r+') as file:
    for line in file:
        data_tuple = literal_eval(line)
        lines.append(data_tuple)

【讨论】:

  • 它叫literal_eval,而不是eval_literal
  • 而且您只从文件中读取一行 - 仍然需要 OP 的 for 循环。
  • @PedroRodrigues 它与eval 不同——它专门避免了危险的东西。
  • @PedroRodrigues 不是任何字符串,只有文字。
  • 你附加了一个字符串,所以"(1, 2, 3)",但你想要一个元组,即(1, 2, 3)(注意没有引号)。 literal_eval 解析字符串并返回 python 对象,只要它们是文字(在我在答案中链接到的文档中列出)。所以它将字符串转换为你的元组。
猜你喜欢
  • 2019-02-19
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多