如何格式化 CSV 中的字典列表? - Python
How to format a list of dictionaries from CSV? - Python
我有一个股票价格数据的 CSV 文件,我想将其放入包含日期和收盘价的字典中。
CSV 文件如下所示:
date close volume open high low
2017/09/22 151.89 46575410 152.02 152.27 150.56
2017/09/21 153.39 37350060 155.8 155.8 152.75
2017/09/20 156.07 52126240 157.9 158.26 153.83
2017/09/19 158.73 20565620 159.51 159.77 158.44
我希望结尾字典这样排列:
perfect_dict = [
{'Date': '2017/09/22', 'Close': '151.89'},
{'Date': '2017/09/21', 'Close': '153.39'},
...]
我当前的代码获取 CSV 数据并为日期和收盘价创建两个单独的列表。我试过使用 dict(zip(dates, close_prices)
但这并没有像我上面提到的那样格式化新字典。这是我的代码:
import csv
from collections import defaultdict
# --->
columns = defaultdict(list)
with open('mydata.csv') as f:
reader = csv.DictReader(f)
for row in reader: value2,...}
for (k,v) in row.items():
columns[k].append(v)
dates = columns['date']
close_prices = columns['close']
# This is what doesn't format it right
#stock_dict = dict(zip(dates, close_prices))
#pprint.pprint(stock_dict)
如果有人能指出正确的方向,那就太好了,谢谢!
您可以使用字典理解:
import csv
data = list(csv.reader(open('filename.csv')))
final_data = [{a:b for a, b in zip(["Date", "Close"], i[:2])} for i in data[1:]]
请注意,您不能将字典存储在一个集合中,因为字典本身是不可散列的。
我不认为你想要的格式是可能的 - 你的意思是说你想要一个字典列表吗?如所写,这是字典的字典,但外部字典没有任何键。
此外,如果您想为给定的字典键设置值,您可能需要执行如下操作:
columns[k] = v
编辑:
这是否更接近您要查找的内容?将列实例化为空列表,然后将 csv 的每一行格式化为字典并附加到该列表。
columns = []
with open('mydata.csv') as f:
reader = csv.DictReader(f)
for row in reader:
row_as_dict = {k: v for k, v in row.items()}
columns.append(row_as_dict)
通过使用pandas
阅读csv file
- 首先读取
date
和 close
列并存储为列表
- 然后列出我们需要的格式的字典。
代码
import pandas as pd
df = pd.read_csv("file_name.csv")
# read the date and close column and store as a list.
time_list = list(df['date'])
close_list = list(df['close'])
perfect_dict = []
# here take the minimum length
# because avoiding index error
take_length = min(len(time_list),len(close_list))
for i in range(take_length):
temp_dict={}
temp_dict["Date"]=time_list[i]
temp_dict["Close"] = close_list[i]
perfect_dict.append(temp_dict)
print(perfect_dict)
另一种可能的方式。
import csv
perfect_dict=[]
with open('file.csv') as f:
reader = list(csv.reader(f))
for row in reader[1:]:
temp_dict = {}
temp_dict["Date"] = row[0]
temp_dict["Close"] = row[1]
perfect_dict.append(temp_dict)
print(perfect_dict)
可能有点晚了,但您可以使用 "normal" csv reader 尝试以下解决方案,稍后再转换数据:
columns = list()
with open('mydata.csv') as f:
reader = list(csv.reader(f))
header = reader[0]
for row in reader[1:]:
temp_dict = dict()
for idx, item in enumerate(row):
if idx < 2:
temp_dict[header[idx]] = item
columns.append(new_dict)
假设您的 csv 结构与您提供的一样(header 作为第一行和列的顺序),代码将原始 csv 输入转换为字典列表。
此外,idx < 2
确保只有 "date" 和 "close" 映射到新输出。
如果您喜欢大写的列 headers,只需在第 4 行之后添加 header = list(map(lambda x: x.capitalize(), header))
。
我有一个股票价格数据的 CSV 文件,我想将其放入包含日期和收盘价的字典中。
CSV 文件如下所示:
date close volume open high low
2017/09/22 151.89 46575410 152.02 152.27 150.56
2017/09/21 153.39 37350060 155.8 155.8 152.75
2017/09/20 156.07 52126240 157.9 158.26 153.83
2017/09/19 158.73 20565620 159.51 159.77 158.44
我希望结尾字典这样排列:
perfect_dict = [
{'Date': '2017/09/22', 'Close': '151.89'},
{'Date': '2017/09/21', 'Close': '153.39'},
...]
我当前的代码获取 CSV 数据并为日期和收盘价创建两个单独的列表。我试过使用 dict(zip(dates, close_prices)
但这并没有像我上面提到的那样格式化新字典。这是我的代码:
import csv
from collections import defaultdict
# --->
columns = defaultdict(list)
with open('mydata.csv') as f:
reader = csv.DictReader(f)
for row in reader: value2,...}
for (k,v) in row.items():
columns[k].append(v)
dates = columns['date']
close_prices = columns['close']
# This is what doesn't format it right
#stock_dict = dict(zip(dates, close_prices))
#pprint.pprint(stock_dict)
如果有人能指出正确的方向,那就太好了,谢谢!
您可以使用字典理解:
import csv
data = list(csv.reader(open('filename.csv')))
final_data = [{a:b for a, b in zip(["Date", "Close"], i[:2])} for i in data[1:]]
请注意,您不能将字典存储在一个集合中,因为字典本身是不可散列的。
我不认为你想要的格式是可能的 - 你的意思是说你想要一个字典列表吗?如所写,这是字典的字典,但外部字典没有任何键。
此外,如果您想为给定的字典键设置值,您可能需要执行如下操作:
columns[k] = v
编辑:
这是否更接近您要查找的内容?将列实例化为空列表,然后将 csv 的每一行格式化为字典并附加到该列表。
columns = []
with open('mydata.csv') as f:
reader = csv.DictReader(f)
for row in reader:
row_as_dict = {k: v for k, v in row.items()}
columns.append(row_as_dict)
通过使用pandas
阅读csv file
- 首先读取
date
和close
列并存储为列表 - 然后列出我们需要的格式的字典。
代码
import pandas as pd
df = pd.read_csv("file_name.csv")
# read the date and close column and store as a list.
time_list = list(df['date'])
close_list = list(df['close'])
perfect_dict = []
# here take the minimum length
# because avoiding index error
take_length = min(len(time_list),len(close_list))
for i in range(take_length):
temp_dict={}
temp_dict["Date"]=time_list[i]
temp_dict["Close"] = close_list[i]
perfect_dict.append(temp_dict)
print(perfect_dict)
另一种可能的方式。
import csv
perfect_dict=[]
with open('file.csv') as f:
reader = list(csv.reader(f))
for row in reader[1:]:
temp_dict = {}
temp_dict["Date"] = row[0]
temp_dict["Close"] = row[1]
perfect_dict.append(temp_dict)
print(perfect_dict)
可能有点晚了,但您可以使用 "normal" csv reader 尝试以下解决方案,稍后再转换数据:
columns = list()
with open('mydata.csv') as f:
reader = list(csv.reader(f))
header = reader[0]
for row in reader[1:]:
temp_dict = dict()
for idx, item in enumerate(row):
if idx < 2:
temp_dict[header[idx]] = item
columns.append(new_dict)
假设您的 csv 结构与您提供的一样(header 作为第一行和列的顺序),代码将原始 csv 输入转换为字典列表。
此外,idx < 2
确保只有 "date" 和 "close" 映射到新输出。
如果您喜欢大写的列 headers,只需在第 4 行之后添加 header = list(map(lambda x: x.capitalize(), header))
。