2014-01-22 39 views
0

中的字典元素創建一個csv文件,因此我有一個裏面有6個字符的列表,我想將它寫入一個csv文件。 我已經嘗試了很多方法來做到這一點,但迄今爲止我一直沒有成功。當我嘗試將它作爲列表寫入時,它會給我一個錯誤,當我嘗試將它寫爲字典時,它也會給我一個錯誤。任何人都可以指出我的寫作方向。從列表中使用python

 r_vals= 
    [{'distance':2.35, 'mpg': 3.215, 'power': 45.0},{'distance':214.3, 'mpg': 29.3,'power': 124.0},{'distance':2.35, 'mpg': 3.215, 'power': 45.0},...{'distance':0.35, 'mpg': 45.5, 'power': 156.0}] 

或是否有更簡單的方法把它作爲一個數據幀我想它看起來像這樣

distance mpg  power 
    2.35  3.215  45.0 
    214.3  29.3  124.0 
    . 
    . 
    0.35  45.5  156 

謝謝!

+0

你想進入一個CSV這一點,數據框部分只是一些你認爲可能有助於這一目標,或者是你想進入一個數據幀這一點,和CSV的部分是你認爲可能的東西幫助_that_目標? – abarnert

+0

@roippi:對於一個固定結構的字典列表,我認爲CSV比JSON更有意義。 (它使得這個固定結構是明確的,避免了重複,爲您提供了一個更易於理解的/可編輯的文件,並且可以將它導入到Excel中)。但絕對值得提出選項來顯示CSV不是唯一的文件世界格式;你可能不應該刪除評論... – abarnert

回答

5

你看過熊貓嗎? http://pandas.pydata.org/

在熊貓,你可以這樣做:

>>> r_vals 
[{'distance': 2.35, 'power': 45.0, 'mpg': 3.215}, {'distance': 214.3, 'power': 124.0, 'mpg': 29.3}, {'distance': 2.35, 'power': 45.0, 'mpg': 3.215}, {'distance': 0.35, 'power': 156.0,'mpg': 45.5}] 
>>> df = pandas.DataFrame(r_vals) 
>>> df 
    distance  mpg power 
0  2.35 3.215  45 
1 214.30 29.300 124 
2  2.35 3.215  45 
3  0.35 45.500 156 

,然後你可以做:

df.to_csv("path.csv",index=False) 

,並保存在您的字典中都在內存中的數據幀和CSV。

如果你想只使用原生的Python,那麼你可以做這樣的事情:

import csv 
outfile = open("path.csv","w") 
csv_writer = csv.write(outfile) 
csv_writer.writerow(header) 
header = r_vals[0].keys() 
for row in r_vals: 
    csv_writer.writerow(str([row[col_name]) for col_name in header]) 
outfile.close() 
+0

如果他的主要目標是創建和使用數據框,這個答案的前半部分明顯比創建一個CSV文件並試圖處理它。 – abarnert

+1

但是對於下半年......你經歷了很多額外的工作才能將每個字典變成一個序列,所以你可以使用'writer'而不是'DictWriter' ...而且,你不需要調用'str'無論是'writer'還是'DictWriter'。 – abarnert

+0

@abarnert非常好的一點! –

0

使用製表

r_vals=[[2.35,3.215,45.0],[214.3,29.3,124.0],[2.35, 3.215,45.0],[0.35,45.5,156.0]] 

print tabulate.tabulate(r_vals, headers=["distance","mpg", "power"]) 

    distance  mpg power 
---------- ------ ------- 
     2.35 3.215  45 
    214.3 29.3  124 
     2.35 3.215  45 
     0.35 45.5  156 
+0

如果您打算推薦一個第三方庫,您可能應該包含一個鏈接,描述它的功能(包括什麼使它比stdlib解決方案更好)等。 – abarnert

0

您可以使用字符串格式化做你想做什麼:

with open(target, 'w') as f: 
    f.write("distance\tmpg\tpower\n") # header 
    for d in r_vals: 
     f.write"{0[distance]:.2f}\t{0[mpg]:.3f}\t{0[power]:.1f}\n".format(d)) 

這裏格式規範是0格式的第一個參數[key]選擇合適的值,然後.nf給小數點n

3

「創建與Python字典的元素列表的csv文件」到底是什麼呢csv.DictWriter

with open('output.csv', 'w') as f: 
    csv.DictWriter(f, fieldnames=rvals[0].keys()).writerows(rvals) 

(如果你的最終目的是爲了獲得某種數據幀的對象,而你只是創造一個CSV文件,因爲你認爲它是做到這一點的最好辦法......那麼,你不必;看到瑞安G公司,便於pandas如何讓這個答案)

此之後:

$ cat output.csv 
3.215,45.0,2.35 
29.3,124.0,214.3 
3.215,45.0,2.35 
45.5,156.0,0.35 

當然,您可能希望它包含標題和/或以某種特定順序放置列,而不是dict恰巧具有的任何順序。 (你不需要做這兩個,但如果你不這樣做,那麼CSV不是很有用,因爲你不知道哪一列意味着什麼...)這裏是兩個:

with open('output.csv', 'w') as f: 
    w = csv.DictWriter(f, fieldnames='distance mpg power'.split()) 
    w.writeheader() 
    w.writerows(rvals) 

輸出:

distance,mpg,power 
2.35,3.215,45.0 
214.3,29.3,124.0 
2.35,3.215,45.0 
0.35,45.5,156.0 

如果你想在默認的CSV方言的變化,看到Dialects and Formatting Parameters。爲了得到您想要的輸出,只需將, delimiter='\t'添加到DictWriter構造函數中即可。

+0

我試過,我以前沒有工作,但謝謝。 – user3225439

+0

@ user3225439:_你試過什麼? _什麼不起作用?我的例子中的輸出全部來自運行這個確切的代碼對你的確切'rvals',但刪除'...'使其成爲一個有效的列表。 – abarnert

0

http://docs.python.org/2/library/csv.html#csv.DictWriter應該這樣做,它也會根據您提供的列順序編寫標題行。

with open('/home/dnfehren/windesk/test.csv','wb') as fl: 
    fc = csv.DictWriter(fl, ['distance','mpg','power']) 

    for rvalnum, rval in enumerate(rvals): 
     if rvalnum == 0: 
      fc.writeheader() 
      fc.writerow(rval) 
     else: 
      fc.writerow(rval) 
+0

爲什麼要將'writeheader'移動到循環中(然後要求您添加'enumerate'和對'0'的檢查),當您可以在循環之前調用它時(它允許您消除循環並使用''writer '而不是)? – abarnert

+0

謝謝!好點 - 我通常添加一個循環計數器出於習慣,因爲可能有其他事情我想追蹤它們出現在列表或文件中的位置 – dnfehren