【问题标题】:Reading in .txt and using header string as list name读取 .txt 并使用标题字符串作为列表名称
【发布时间】:2019-07-01 17:03:04
【问题描述】:

我已读入一个 .txt 文件并将这些行拆分为一个列表。此列表包含标题信息和数据。我想使用标题信息来命名后续列表。因为原始列表(下面称为My_list)中包含的数据都是字符串,所以它是一个不支持项目分配的对象。我正在尝试创建新的列表对象,其名称由现有列表中的字符串定义。

我希望 Name1 和 Name2 成为我可以附加数据的列表对象的名称。

错误包括“str”对象不支持项目分配和“str”对象没有属性“append”。

这些错误并不意外,但我不确定如何将此字符串转换为我的新列表的名称。

    My_list = [line.split() for line in open("file.txt", "r") ]

    ListNames = My_list[0]

    #My_List[0] = ['Name1','Name2']

    for i in range(1,len(My_list)):
        ListNames[0].append(My_list[i][0])
        ListNames[1].append(My_list[i][1])

【问题讨论】:

  • 您的文件是 CSV 文件吗?如果是这样,请使用docs.python.org/3/library/csv.html#csv.reader
  • 列表并不完全有名称...也许您需要的是一个字典,其中键是名称,值是实际列表。或者为此目的创建一个类。

标签: python


【解决方案1】:

由于列表不完全有“名称”(您可能会与参考混淆),也许您可​​以使用字典:

my_list = [line.split() for line in open("file.txt", "r") ]

lists = {name: [] for name in my_List[0]}  # my_List[0] = ['Name1','Name2']

for i in range(1,len(my_list)):
    lists['Name1'].append(my_list[i][0])
    lists['Name2'].append(my_list[i][1])

但通常尽量避免将整个文件读取到列表(或字符串)中。在可能的情况下,使用迭代器效率更高。您的情况最明确地允许它:

with open("file.txt") as in_f:
    first_line = in_f.readline().strip().split()

    lists = {name: [] for name in first_line}

    for line in in_f:
        line_as_list = line.split()
        lists['Name1'].append(line_as_list[0])
        lists['Name2'].append(line_as_list[1])

如果您的名称是指对列表的引用,例如创建一个具有该名称的变量,该变量指向您可能使用的列表exec

with open("file.txt") as in_f:
    first_line = in_f.readline().strip().split()  # first_line = ['Name1','Name2']

    for name in first_line:
        exec(f"{name} = []")

    for line in in_f:
        line_as_list = line.split()
        Name1.append(line_as_list[0])
        Name2.append(line_as_list[1])

阅读docs 了解exec

【讨论】:

    【解决方案2】:

    如果您将文件作为一个大字符串读取,您可以这样做

    lines = []
    tempstr = ""
    
    for i in filestring:
    
        if i == "\n":
            lines.append(tempstr)
            tempstr = ""
    
        else:
            tempstr+=i
    

    这允许您的程序检测和忽略换行符

    希望对你有帮助

    【讨论】:

    • 我对堆栈溢出有点陌生,我会修复它
    • 这现在可能工作得很好,但只是实现了一种从文件中读取行的方法,幸运的是已经有很多内置的方法可以做到这一点。您的回答仍然没有以任何方式解决手头的实际问题......
    【解决方案3】:

    如果你得到一个列表:

    my_list = ['Name1','Name2']
    

    您可以使用此列表键创建一个字典并附加它:

    my_list = ['Name1','Name2']
    my_dict = {}
    
    for items in my_list:
        #generate keys
        my_dict.setdefault(items,{})
    #put new data in key
    my_idct["Name1"].update({"Nev_key": "New_value"})
    

    所以你的新列表会是这样的:

    {'Name1': {'Nev_key': 'New_value'}, 'Name2': {}}
    

    【讨论】:

      猜你喜欢
      • 2019-04-25
      • 2011-12-17
      • 2017-09-20
      • 2012-01-17
      • 1970-01-01
      • 2011-07-13
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多