drb*_*sen 125 python csv dictionary list-comprehension
我正在尝试从csv文件创建一个字典.csv文件的第一列包含唯一键,第二列包含值.csv文件的每一行代表字典中唯一的键值对.我试图使用csv.DictReader和csv.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)
Run Code Online (Sandbox Code Playgroud)
当我运行上面的代码时,我得到了一个ValueError: too many values to unpack (expected 2).如何从csv文件创建一个字典?谢谢.
Nat*_*ate 137
我相信你要找的语法如下:
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}
Run Code Online (Sandbox Code Playgroud)
或者,对于python <= 2.7.1,您需要:
mydict = dict((rows[0],rows[1]) for rows in reader)
Run Code Online (Sandbox Code Playgroud)
Lax*_*khi 62
通过调用open然后打开文件csv.DictReader.
input_file = csv.DictReader(open("coors.csv"))
Run Code Online (Sandbox Code Playgroud)
您可以通过遍历input_file来迭代csv文件dict reader对象的行.
for row in input_file:
print row
Run Code Online (Sandbox Code Playgroud)
或仅访问第一行
dictobj = csv.DictReader(open('coors.csv')).next()
Run Code Online (Sandbox Code Playgroud)
rob*_*ert 55
import csv
reader = csv.reader(open('filename.csv', 'r'))
d = {}
for row in reader:
k, v = row
d[k] = v
Run Code Online (Sandbox Code Playgroud)
mud*_*n19 24
这不是优雅,而是使用熊猫的一线解决方案.
import pandas as pd
pd.read_csv('coors.csv', header=None, index_col=0, squeeze=True).to_dict()
Run Code Online (Sandbox Code Playgroud)
如果要为索引指定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()
Run Code Online (Sandbox Code Playgroud)
Ale*_*kin 16
你必须将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'}
Run Code Online (Sandbox Code Playgroud)
Thi*_*iru 11
你也可以使用numpy.
from numpy import loadtxt
key_value = loadtxt("filename.csv", delimiter=",")
mydict = { k:v for k,v in key_value }
Run Code Online (Sandbox Code Playgroud)
单线解决方案
import pandas as pd
dict = {row[0] : row[1] for _, row in pd.read_csv("file.csv").iterrows()}
Run Code Online (Sandbox Code Playgroud)
对于简单的 csv 文件,例如以下
id,col1,col2,col3
row1,r1c1,r1c2,r1c3
row2,r2c1,r2c2,r2c3
row3,r3c1,r3c2,r3c3
row4,r4c1,r4c2,r4c3
Run Code Online (Sandbox Code Playgroud)
您可以仅使用内置函数将其转换为 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)}
Run Code Online (Sandbox Code Playgroud)
这应该产生以下字典
{'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'}}
Run Code Online (Sandbox Code Playgroud)
注意: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)})
Run Code Online (Sandbox Code Playgroud)
我建议添加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)
Run Code Online (Sandbox Code Playgroud)
假设您有一个这种结构的 CSV:
"a","b"
1,2
3,4
5,6
Run Code Online (Sandbox Code Playgroud)
并且您希望输出为:
[{'a': '1', ' "b"': '2'}, {'a': '3', ' "b"': '4'}, {'a': '5', ' "b"': '6'}]
Run Code Online (Sandbox Code Playgroud)
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]
Run Code Online (Sandbox Code Playgroud)
如果你更喜欢熊猫,它也可以很好地做到这一点:
import pandas as pd
def read_csv(filename):
return pd.read_csv(filename).to_dict('records')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
322802 次 |
| 最近记录: |