词典和CSV导入

2024-04-26 06:37:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我看到的是公认的答案:

Creating a dictionary from a CSV file

我想创建一个字典,其中第一行的不同列是键,下一行的相应列是值。这似乎很管用,但我不理解代码的某些部分。就是这样:

import csv reader = csv.DictReader(open('values.csv'))

result = {} for row in reader:
    for column, value in row.items():  # consider .iteritems() for Python 2
        result.setdefault(column, []).append(value)
        print(f"Column: {column}")
        print(f"Value: {value}") print(result)

当我运行此代码时,我得到:

Column: Date
Value: 123
Column: Foo
Value: 456
Column: Bar
Value: 789
Column: Date
Value: abc
Column: Foo
Value: def
Column: Bar
Value: ghi
{'Date': ['123', 'abc'], 'Foo': ['456', 'def'], 'Bar': ['789', 'ghi']}

对于文件:

Date,Foo,Bar
123,456,789
abc,def,ghi

它正确地完成了任务,所以Date是键,其下的值在同一列行中,但我不明白这在代码中是如何工作的

{}到底是做什么的?这是否意味着行中的每一列(用逗号分隔),考虑一个值吗?{}是做什么的(我看了文档,但没有得到{})

还有result.setdefault(column, []).append(value)做什么?我知道append添加了一个值,但是语法.setdefault(column, [])是什么意思(在文档中,它的意思是Returns the value of the specified key. If the key does not exist: insert the key, with the specified value,我也不知道)

此外,程序如何理解第一行是我要存储密钥的行

我以前从未做过Python,所以如果这是一个愚蠢的问题,我很抱歉!我只是想为数据库制作一本字典,所以这似乎很理想,但我想知道每一行的作用。提前谢谢你


1条回答
网友
1楼 · 发布于 2024-04-26 06:37:55

1。row.items()中的列和值具体做什么

要回答这个问题,我们必须看一下reader = csv.DictReader(open('values.csv'))行。ADictReader将CSV行作为字典返回,其中键(默认情况下)与CSV文件中的第一行相同(例如列名)。当在读取器上迭代时,(for row in reader:row是一个字典。要从字典中获取键/值对,必须调用它的.items()方法,该方法返回分别包含键和值的元组迭代器。在您的情况下,如果我们读取示例CSV的第二行,则该行与以下内容相同:

row = {
   "Date": 123, 
   "Foo": 456, 
   "Bar": 789
}

因此,在for column, value in row.items():的第一次迭代中,我们将值"Date"分配给column,将123分配给value。我们可以使用这些值做一些事情,在这个for循环的下一次迭代中(因此由row.items()生成的下一个元组),值"Foo"被分配给column,而456被分配给value

2。另外,result.setdefault(列,[]).append(值)做什么

请注意,变量result是一个空字典。此字典将保存值列表,我们希望result变量如下所示:

result = {
   "Date": [123, "abc"],
   "Foo": [456, "def"],
   "Bar": [789, "ghi"]
}

在我们所处的for循环中(在row字典上循环),我们现在将值123分配给result字典中的键"Date"。但是,如果我们在第一次迭代中,result字典仍然是空的!这里发生的基本情况如下: result.setdefault(column, [])->;这是从名为result的字典中获取键column(注意,这是for循环中的变量!)的值,如果该键不存在,则使用空列表创建它并返回该值(空列表)。在本例中,[]是空列表。在第一次迭代中(没有键/值存储在result字典中),给column变量赋值为“Date”,因为它在result字典中还不存在,所以它是用值[](空列表)创建的

然后,chained调用.append(value),它获取值(在第一次迭代中,这是123),并将其附加到列表中

3。此外,程序如何理解第一行是我要存储密钥的行

这是DictReader的技巧,默认情况下,它会查看CSV的第一行,并将其视为列名

相关问题 更多 >