我看到的是公认的答案:
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。row.items()中的列和值具体做什么
要回答这个问题,我们必须看一下
reader = csv.DictReader(open('values.csv'))
行。ADictReader
将CSV行作为字典返回,其中键(默认情况下)与CSV文件中的第一行相同(例如列名)。当在读取器上迭代时,(for row in reader:
,row
是一个字典。要从字典中获取键/值对,必须调用它的.items()
方法,该方法返回分别包含键和值的元组迭代器。在您的情况下,如果我们读取示例CSV的第二行,则该行与以下内容相同:因此,在
for column, value in row.items():
的第一次迭代中,我们将值"Date"
分配给column
,将123
分配给value
。我们可以使用这些值做一些事情,在这个for循环的下一次迭代中(因此由row.items()生成的下一个元组),值"Foo"
被分配给column
,而456
被分配给value
2。另外,result.setdefault(列,[]).append(值)做什么
请注意,变量
result
是一个空字典。此字典将保存值列表,我们希望result
变量如下所示:在我们所处的for循环中(在
row
字典上循环),我们现在将值123
分配给result
字典中的键"Date"
。但是,如果我们在第一次迭代中,result
字典仍然是空的!这里发生的基本情况如下:result.setdefault(column, [])
->;这是从名为result
的字典中获取键column
(注意,这是for循环中的变量!)的值,如果该键不存在,则使用空列表创建它并返回该值(空列表)。在本例中,[]是空列表。在第一次迭代中(没有键/值存储在result
字典中),给column
变量赋值为“Date”,因为它在result
字典中还不存在,所以它是用值[](空列表)创建的然后,chained调用
.append(value)
,它获取值(在第一次迭代中,这是123
),并将其附加到列表中3。此外,程序如何理解第一行是我要存储密钥的行
这是
DictReader
的技巧,默认情况下,它会查看CSV的第一行,并将其视为列名相关问题 更多 >
编程相关推荐