如何格式化CSV列表? - Python

时间:2017-09-26 01:44:31

标签: python python-3.x csv dictionary stockquotes

我有一个股票价格数据的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)

如果有人能指出我的方向很棒,那就太棒了,谢谢!

4 个答案:

答案 0 :(得分:3)

您可以使用词典理解:

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:]]

请注意,由于字典本身不可删除,因此无法将字典存储在集合中。

答案 1 :(得分: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) 

答案 2 :(得分:1)

使用pandas阅读csv file

  • 首先阅读dateclose列并将其存储为列表
  • 而不是列出我们需要的格式字典。

代码

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)

答案 3 :(得分:1)

也许晚了一点,但是您可以使用“普通”的csv阅读器尝试以下解决方案,并在以后转换数据:

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的结构如您所展示的(标题为第一行,列的顺序),则代码会将原始csv输入转换为字典列表。 此外,idx < 2确保仅将“日期”和“关闭”映射到新输出。
如果您希望使用大写的列标题,只需在第4行之后添加header = list(map(lambda x: x.capitalize(), header))