【问题标题】:Problem with getting data from csv using pythonand writing them to a dictionary使用python从csv获取数据并将它们写入字典的问题
【发布时间】:2019-12-13 01:34:52
【问题描述】:

我有一个格式如下的 CSV:

预期的: 我想把它转换成这样的字典:

{'Masterfolder': ['Training'], 'Childfolder': ['Training videos', 'Training documents', 'Training workouts', 'Training practicals']}

到目前为止,我已经完成了以下代码,

import csv

with open('features.csv', mode='r') as f:
reader = csv.reader(f)
checker = lambda i: bool(i and i.strip()) 
mydict = {rows[0]: list(filter(checker, rows[0:])) for rows in reader}

print(mydict)

我的输出是这样的:

{'Master folder': ['Child - 1', 'Child - 2', 'Child - 3', 'Child - 4'], 'Training': ['Training videos', 'Training documents', 'Training workouts', 'Training practicals']}

如何改进此代码以获得预期的结果?

【问题讨论】:

  • 你能用别的包吗?
  • 是的,当然! @DemontZhang
  • 使用了正确的列分隔符? (我的意思是像 ';' 而不是 ',' - 通过在文本编辑器中打开文件来检查文件,比如 notepad++)
  • 是的,我猜 :( @MrFuppes
  • 我认为您需要将标题分开。检查器是否也确保您只将单元格 1 向前移动并且只有非空数据?

标签: python


【解决方案1】:

这就是我所说的分隔标题的意思。第一个元素是您的标题,因此最好使用next 将其取出。然后你就可以处理其他行了。

with open(r'./data/temp.csv', 'r') as f:
    checker = lambda i: bool(i and i.strip())
    reader = csv.reader(f)
    header = next(reader)
    row = next(reader)
    mydict = {
        header[0]: [row[0]],
        'Childfolder': list(filter(checker, row[1:]))
    }

如果您根本不想存储该行,也可以这样

with open(r'./data/temp.csv', 'r') as f:
    checker = lambda i: bool(i and i.strip())
    reader = csv.reader(f)
    header = next(reader)
    mydict = next({
                      header[0]: [row[0]],
                      'Childfolder': list(filter(checker, row[1:]))
                  } for row in reader
                  )

【讨论】:

  • 那么,如何分离“A2”中的主文件夹
  • 我不明白你所说的单独的主文件夹是什么意思。这给出了你想要的输出。 A2有'培训;不是主文件夹。我返回字典列表的唯一原因是因为我假设您有一个包含很多行的 csv 文件。
  • 我的意思是当我添加这样的变量时:masterfolder = mydict['Master folder'] 出现错误:TypeError: list indices must be integers or slices, not str
  • 我应该从哪里获取该关键字的项目列表?
  • 是的,你应该从列表中取出第一个元素。我的意思是你的代码在一个单行或多行的文件上?我添加到答案中。 masterfolder = mydicts[0].get('Master folder') 请使用最新代码。我将mydict 更改为mydicts。如果您有超过 1 行并且您想要第二行的主文件夹,您可以执行 masterfolder_row2 = mydicts[1].get('Master folder') 等。
【解决方案2】:

你可以使用Pandas

使用 pd.read_csv 读取您的 CSV 文件并更改索引

import pandas as pd 

df = pd.read_csv('Classeur1.csv', sep=';', index_col='Master folder')

输出:

                   Child - 1          Child - 2          Child - 3           Child - 4
Master folder               
Training           Training videos    Training document Training workouts   Training praticals

然后制作你的字典

mydict = {'Master folder' : list(df.index),
          'Childfolder' : list(df.iloc[0])}

输出:

{'Master folder': ['Training'],
 'Childfolder': ['Training videos','Training document','Training workouts','Training praticals']}

【讨论】:

    猜你喜欢
    • 2018-03-19
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多