从 csv 文件创建字典?

2024-12-23 08:43:00
admin
原创
113
摘要:问题描述:我正在尝试从 csv 文件创建字典。csv 文件的第一列包含唯一键,第二列包含值。csv 文件的每一行代表字典中唯一的键值对。我尝试使用csv.DictReader和csv.DictWriter类,但我只能弄清楚如何为每一行生成一个新字典。我想要一本字典。这是我尝试使用的代码:import csv ...

问题描述:

我正在尝试从 csv 文件创建字典。csv 文件的第一列包含唯一键,第二列包含值。csv 文件的每一行代表字典中唯一的键值对。我尝试使用csv.DictReadercsv.DictWriter类,但我只能弄清楚如何为每一行生成一个新字典。我想要一本字典。这是我尝试使用的代码:

import csv

with open('coors.csv', mode='r') as infile:
    reader = csv.reader(infile)
    with open('coors_new.csv', mode='w') as outfile:
    writer = csv.writer(outfile)
    for rows in reader:
        k = rows[0]
        v = rows[1]
        mydict = {k:v for k, v in rows}
    print(mydict)

当我运行上述代码时,我得到了一个ValueError: too many values to unpack (expected 2)。如何从 csv 文件创建一个字典?谢谢。


解决方案 1:

我相信您正在寻找的语法如下:

import csv

with open('coors.csv', mode='r') as infile:
    reader = csv.reader(infile)
    with open('coors_new.csv', mode='w') as outfile:
        writer = csv.writer(outfile)
        mydict = {rows[0]:rows[1] for rows in reader}

或者,对于 python <= 2.7.1,您需要:

mydict = dict((rows[0],rows[1]) for rows in reader)

解决方案 2:

通过调用 open 然后使用csv.DictReader打开文件。

input_file = csv.DictReader(open("coors.csv"))

您可以通过迭代 input_file 来迭代 csv 文件字典读取器对象的行。

for row in input_file:
    print(row)

或仅访问第一行

dictobj = csv.DictReader(open('coors.csv')).next() 

更新
在 Python 3+ 版本中,此代码会略有改变:

reader = csv.DictReader(open('coors.csv'))
dictobj = next(reader) 

解决方案 3:

import csv
reader = csv.reader(open('filename.csv', 'r'))
d = {}
for row in reader:
   k, v = row
   d[k] = v

解决方案 4:

这并不优雅,但却是使用 pandas 的一行解决方案。

import pandas as pd
pd.read_csv('coors.csv', header=None, index_col=0, squeeze=True).to_dict()

如果您想为索引指定 dtype(如果由于错误而使用 index_col 参数则无法在 read_csv 中指定):

import pandas as pd
pd.read_csv('coors.csv', header=None, dtype={0: str}).set_index(0).squeeze().to_dict()

解决方案 5:

您只需将 csv.reader 转换为 dict:

~ >> cat > 1.csv
key1, value1
key2, value2
key2, value22
key3, value3

~ >> cat > d.py
import csv
with open('1.csv') as f:
    d = dict(filter(None, csv.reader(f)))

print(d)

~ >> python d.py
{'key3': ' value3', 'key2': ' value22', 'key1': ' value1'}

解决方案 6:

假设您有此结构的 CSV:

"a","b"
1,2
3,4
5,6

并且你希望输出如下:

[{'a': '1', ' "b"': '2'}, {'a': '3', ' "b"': '4'}, {'a': '5', ' "b"': '6'}]

zip 函数(尚未提及)很简单并且非常有用。

def read_csv(filename):
    with open(filename) as f:
        file_data=csv.reader(f)
        headers=next(file_data)
        return [dict(zip(headers,i)) for i in file_data]

如果你更喜欢熊猫,它也可以很好地做到这一点:

import pandas as pd
def read_csv(filename):
    return pd.read_csv(filename).to_dict('records')

解决方案 7:

您也可以为此使用 numpy。

from numpy import loadtxt
key_value = loadtxt("filename.csv", delimiter=",")
mydict = { k:v for k,v in key_value }

解决方案 8:

单线解决方案

import pandas as pd

dict = {row[0] : row[1] for _, row in pd.read_csv("file.csv").iterrows()}

解决方案 9:

对于简单的 csv 文件,例如以下

id,col1,col2,col3
row1,r1c1,r1c2,r1c3
row2,r2c1,r2c2,r2c3
row3,r3c1,r3c2,r3c3
row4,r4c1,r4c2,r4c3

你可以使用内置函数将其转换为 Python 字典

with open(csv_file) as f:
    csv_list = [[val.strip() for val in r.split(",")] for r in f.readlines()]

(_, *header), *data = csv_list
csv_dict = {}
for row in data:
    key, *values = row   
    csv_dict[key] = {key: value for key, value in zip(header, values)}

这应该产生以下词典

{'row1': {'col1': 'r1c1', 'col2': 'r1c2', 'col3': 'r1c3'},
 'row2': {'col1': 'r2c1', 'col2': 'r2c2', 'col3': 'r2c3'},
 'row3': {'col1': 'r3c1', 'col2': 'r3c2', 'col3': 'r3c3'},
 'row4': {'col1': 'r4c1', 'col2': 'r4c2', 'col3': 'r4c3'}}

注意:Python 字典有唯一的键,所以如果你的 csv 文件有重复,ids你应该将每一行附加到列表中。

for row in data:
    key, *values = row

    if key not in csv_dict:
            csv_dict[key] = []

    csv_dict[key].append({key: value for key, value in zip(header, values)})

解决方案 10:

我建议添加if rows以防文件末尾有空行

import csv
with open('coors.csv', mode='r') as infile:
    reader = csv.reader(infile)
    with open('coors_new.csv', mode='w') as outfile:
        writer = csv.writer(outfile)
        mydict = dict(row[:2] for row in reader if row)

解决方案 11:

例如,使用 pandas 就容易得多。假设您有以下 CSV 数据,我们称之为test.txt/ test.csv(您知道 CSV 是一种文本文件)

a,b,c,d
1,2,3,4
5,6,7,8

现在使用 pandas

import pandas as pd
df = pd.read_csv("./text.txt")
df_to_doct = df.to_dict()

对于每一行,它将是

df.to_dict(orient='records')

就是这样。

解决方案 12:

如果您可以使用 numpy 包,那么您可以执行以下操作:

import numpy as np

lines = np.genfromtxt("coors.csv", delimiter=",", dtype=None)
my_dict = dict()
for i in range(len(lines)):
   my_dict[lines[i][0]] = lines[i][1]

解决方案 13:

你可以使用它,它非常酷:

import dataconverters.commas as commas
filename = 'test.csv'
with open(filename) as f:
      records, metadata = commas.parse(f)
      for row in records:
            print 'this is row in dictionary:'+rowenter code here

解决方案 14:

已经发布了许多解决方案,我想贡献自己的解决方案,它适用于 CSV 文件中不同数量的列。它创建一个字典,每列一个键,每个键的值都是包含该列中元素的列表。

    input_file = csv.DictReader(open(path_to_csv_file))
    csv_dict = {elem: [] for elem in input_file.fieldnames}
    for row in input_file:
        for key in csv_dict.keys():
            csv_dict[key].append(row[key])

解决方案 15:

尝试使用defaultdictDictReader

import csv
from collections import defaultdict
my_dict = defaultdict(list)

with open('filename.csv', 'r') as csv_file:
    csv_reader = csv.DictReader(csv_file)
    for line in csv_reader:
        for key, value in line.items():
            my_dict[key].append(value)

它返回:

{'key1':[value_1, value_2, value_3], 'key2': [value_a, value_b, value_c], 'Key3':[value_x, Value_y, Value_z]}

解决方案 16:

一个简单的函数,以文件名为准并返回一个OrderedDict:

def csv_to_dict(filename):
    import csv
    with open(filename, mode='r') as infile:
        reader = csv.DictReader(infile)
        data = [row for row in reader]
    return data

解决方案 17:

如果您有:

  1. 您的 csv 中只有 1 个键和 1 个值作为键、值

  2. 不想导入其他包

  3. 想要一次性创建一个字典

这样做:

mydict = {y[0]: y[1] for y in [x.split(",") for x in open('file.csv').read().split('
') if x]}

它起什么作用?

它使用列表理解来分割行,最后一个“if x”用于忽略空行(通常在末尾),然后使用字典理解将其解包为字典。

解决方案 18:

以下是 CSV 到 Dict 的方法:

import pandas

data = pandas.read_csv('coors.csv')

the_dictionary_name = {row.k: row.v for (index, row) in data.iterrows()}

解决方案 19:

可能不是最有效的方法,但这是我喜欢的方法,因为它非常灵活,因为您可以选择哪一列数据作为键以及哪一列数据作为值。

import pandas as pd

df = pd.read_csv('coors.csv')

mydict = dict(zip(df['col1'],df['col2']))

将 'col1' 和 'col2' 替换为您想要的键所在的列,将 col2 替换为您想要的值所在的列

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用