2016-12-06 72 views
0

我已經創建了一個Python腳本,它從以'text/csv'格式返回的API獲取數據。我想要做的就是使用CSV文件中的頭文件來創建字典的字典,或者根據哪些字典更有效來創建列表字典。如何在Python 2.7中將CSV字符串分解爲字典(或列表)的字典?

的輸出是一個很長的字符串,我已經分裂成一個列表,然後用下面的代碼字典(我已經消毒這一點):

# Makes API call 
resultsreturn = requests.get(url,headers=head) 

# Grabs text from API call 
# Data is returned in one long string: 
# '"Header1,Header2,Header3,Header4\\nR1C1,R1C2,R1C3,R1C4\\nR2C1,R2C2,R2C3,R2C4"' 
results_json_data = json.dumps(resultsreturn.text) 

# Splits results into list: 
# ['"Header1,Header2,Header3,Header4', 'R1C1,R1C2,R1C3,R1C4', 'R2C1,R2C2,R2C3,R2C4"'] 
list_results_split = results_json_data.split('\\n') 

#Splits list into dictionary. 
dict_results = dict(zip(range(len(list_results_split)), list_results_split)) 

印刷dict_results看起來是這樣的:

{0: '"Header1,Header2,Header3,Header4', 
1: 'R1C1,R1C2,R1C3,R1C4' 
2: 'R2C1,R2C2,R2C3,R2C4"'} 

所以我想要做的是什麼莫名其妙得到的東西看起來是這樣的:

{0: {"Header1":"R1C1", "Header2":"R1C2", "Header3":"R1C3", "Header4":"R1C4"} 
1: {"Header1":"R2C1", "Header2":"R2C2", "Header3":"R2C3", "Header4":"R2C4"} 
2: {"Header1":"R3C1", "Header2":"R3C2", "Header3":"R3C3", "Header4":"R3C4"}} 

我也剛剛注意到,從results_json_data創建的第一個字符串有一個「開頭和一個」結尾,我可能需要去掉所有看起來像我想要的東西。希望有人能指引我正確的方向;我對編程/ Python相當陌生。

+0

你可以發佈api的原始響應嗎? – jspurim

+0

@jspurim我不能,因爲這些數據包含的信息會讓我在因特網上發佈信息。我已經完全格式化了它,除了我已經更改了值和行數/列數。列數將始終保持不變,但行數會有所不同。 – Keefer

回答

2

請看csv模塊和DictReader類。如果可能的話,你應該用規定的庫,而不是自己做這件事的處理CSV數據:

> import csv 

# first param must be an iterable producing strings (the lines of your csv data) 
# this tyically is a file-like object, but can be a plain list 
> reader = csv.DictReader(list_results_split, delimiter=',') 
> reader.fieldnames 
["Header1", "Header2", "Header3"] 

> lst = list(reader) 
[{"Header1":"R1C1", "Header2":"R1C2", "Header3":"R1C3", "Header4":"R1C4"}, 
{"Header1":"R2C1", "Header2":"R2C2", "Header3":"R2C3", "Header4":"R2C4"}, 
{"Header1":"R3C1", "Header2":"R3C2", "Header3":"R3C3", "Header4":"R3C4"}] 

# And 
> dict(enumerate(lst)) 
{0: {"Header1":"R1C1", "Header2":"R1C2", "Header3":"R1C3", "Header4":"R1C4"} 
1: {"Header1":"R2C1", "Header2":"R2C2", "Header3":"R2C3", "Header4":"R2C4"} 
2: {"Header1":"R3C1", "Header2":"R3C2", "Header3":"R3C3", "Header4":"R3C4"}} 

看你的原始字符串和您的輸出,你應該考慮剝離"前處理:

results_json_data = results_json_data.strip('"') 
+0

謝謝!我很親密,但仍然陷入困境。當我列出(讀者)我得到的結果。但是,當我使用dict(枚舉(讀者))時,我只是將{}作爲輸出。 – Keefer

+0

是的,list()調用耗盡了基礎迭代器。你可以忽略它或存儲結果:'l = list(reader)',然後'dict(enumerate(l))''。更新我的答案... – schwobaseggl

1

因爲(半)的單行的樂趣:

string = """Header1,Header2,Header3,Header4 
R1C1,R1C2,R1C3,R1C4 
R2C1,R2C2,R2C3,R2C4""" 

string = string.split() 
headers, data = string[0].split(","), string[1:] 

d = {j:{headers[i]:data[j].split(",")[i] for i in range(len(headers))} for j in range(len(data))} 

輸出

{0: {'Header2': 'R1C2', 'Header3': 'R1C3', 'Header1': 'R1C1', 'Header4': 'R1C4'}, 
1: {'Header2': 'R2C2', 'Header3': 'R2C3', 'Header1': 'R2C1', 'Header4': 'R2C4'}} 
相關問題