【问题标题】:Convert text file to list of tuples将文本文件转换为元组列表
【发布时间】:2023-03-10 20:59:01
【问题描述】:

我在将文本文件转换为元组列表时遇到问题。文本文件将采用以下格式,文件名为 data.txt

Evans Lee 喜剧演员 25,000
史密斯威尔 演员 50,000
麦克李喜剧演员 30,000

我已经通过使用以下代码部分实现了我的目标

load_file = open("data.txt", "r")
data = infile.read()
load_file.close()
data = tuple(item for item in data.split(' ') if item.strip())
print (data)

但是这并没有达到我想要的效果,它会产生以下输出

('Evans', 'Lee', 'Comedian', '25,000\nSmith', 'Will', 'Actor', '50,000\nMack', 'Lee', 'Comedian', '30,000')

这只是一个包含换行符的大长元组,有没有办法可以让 data.txt 文件中的每一行都是它自己的元组,给我一个元组列表并摆脱换行符?

【问题讨论】:

  • 只需将 data.split() 中的 ' ' 更改为 \n

标签: python string file tuples


【解决方案1】:

这里的问题是如何解析你的文件。 一般来说,文件是逗号分隔的值,我们有一个字符来分割字段https://pt.wikipedia.org/wiki/Comma-separated_values 或者我们有一个文件,其中列具有固定长度https://en.wikipedia.org/wiki/Flat-file_database

在你的情况下,我会使用正则表达式来解析你的行。

试试这个:

import re

with open("data.txt", "r") as infile:
    for line in infile:
        groups = re.search("^(.+) (\d.*)", line)
        name = groups.group(1)
        value = groups.group(2)
        print("Name: %s Value:%s" % (name, value))

【讨论】:

    【解决方案2】:

    您想要readlines(),它将输入文件中的每一行读取到列表中的单独项目中:

    load_file = open("data.txt", "r")
    raw = infile.readlines()
    data = [line.strip() for line in raw]
    load_file.close()
    print (data)
    

    请注意,这将删除每行末尾的所有空格,而不仅仅是换行符。应该没问题吧,我猜。

    【讨论】:

      【解决方案3】:

      你很亲密。 infile.read() 将整个文件作为字符串提供给您,其中包括换行符 (\n)。你可以改用.readlines()

      with open('data.txt') as f:
          lines = f.readlines()
          return tuple(tuple(line.split()) for line in lines)
      

      这应该给

      (
        ("Evans", "Lee", "Comedian", "25,000"),
        ("Smith", "Will", "Actor", "50,000"),
        ...
      )
      

      【讨论】:

        【解决方案4】:

        如果你把read()整个文件变成一个大字符串,你必须先splitlines()

        data = [tuple(line.split()) for line in data.splitlines()]
        

        更好:不要将文件读取为一个大字符串,而是直接迭代文件中的行:

        with open("data.txt") as load_file:
            data = [tuple(line.split()) for line in load_file]
        

        更好:使用csv读取数据;这也将允许您例如将包含空格的姓名或职位放在引号中:

        import csv
        with open("data.txt") as load_file:
            reader = csv.reader(load_file, delimiter=" ")
            data = [tuple(row) for row in reader]
        

        【讨论】: