2012-11-10 111 views
7

讓我們有一個CSV錶行和列標題,例如:一個Python的方式與行和列標題閱讀CSV

, "Car", "Bike", "Boat", "Plane", "Shuttle" 
"Red", 1, 7, 3, 0, 0 
"Green", 5, 0, 0, 0, 0 
"Blue", 1, 1, 4, 0, 1 

我想行和列標題,即:

col_headers = ["Car", "Bike", "Boat", "Plane", "Shuttle"] 
row_headers = ["Red", "Green", "Blue"] 
data = [[1, 7, 3, 0, 0], 
     [5, 0, 0, 0, 0], 
     [1, 1, 4, 0, 1]] 

我當然可以這樣做

import csv 
with open("path/to/file.csv", "r") as f: 
    csvraw = list(csv.reader(f)) 
col_headers = csvraw[1][1:] 
row_headers = [row[0] for row in csvraw[1:]] 
data = [row[1:] for row in csvraw[1:]] 

...但它並不符合Python不夠。

這種自然操作有更好的方法嗎?

+0

什麼'csvraw'? – martineau

+0

@martineau我的代碼有錯誤。 'csvraw = list(csv.reader(f))'。 –

回答

2

看看csv.DictReader

如果省略了fieldnames參數,則csvfile的第一行中的值將用作字段名稱。

然後你可以做reader.fieldnames。這當然只會給你列標題。您仍然需要手動解析行標題。

然而,我認爲你的原始解決方案是相當不錯的。

0

我知道這個解決方案給你另一種輸出格式比請求,但 這是非常方便。這讀取CSV行成一本字典:

reader = csv.reader(open(parameters_file), dialect) 

keys = [key.lower() for key in reader.next()] 
for line in reader: 
    parameter = dict(zip(keys, cells)) 
+0

爲什麼當我發佈了關於''DictReader''的文章時,可以這樣做,而不需要手動執行? –

+0

@Lattyware,因爲它可以讓你改變領域。例如,讓他們更低調,甚至過濾它們。 –

2

現在我看到,我想要的是最簡單的(也是最穩健的)來完成與Pandas

import pandas as pd 
df = pd.read_csv('foo.csv', index_col=0) 

如果我想,很容易提取:

col_headers = list(df.columns) 
row_headers = list(df.index) 

否則,在「原始」的Python,似乎我在這個問題寫的方法是「足夠好」。

0

沒有第三方庫(如果你可以用結果是從zip運算元組住):

import csv 

with open('your_csv_file') as fin: 
    csvin = csv.reader(fin, skipinitialspace=True) 
    col_header = next(csvin, [])[1:] 
    row_header, data = zip(*((row[0], row[1:]) for row in csvin)) 

爲您提供col_headerrow_headerdata

['Bike', 'Boat', 'Plane', 'Shuttle'] 
('Red', 'Green', 'Blue') 
(['1', '7', '3', '0', '0'], ['5', '0', '0', '0', '0'], ['1', '1', '4', '0', '1']) 
0

同意,熊貓是我發現的最好的。我有興趣閱讀我的數據框的特定值。下面是我做的:

import pandas as pd 
d=pd.read_csv(pathToFile+"easyEx.csv") 
print(d) 
print(d.index.values) 
print(d.index.values[2]) 
print(d.columns.values) 
print(d.columns.values[2]) 
print(pd.DataFrame(d,index=['Blue'],columns=['Boat'])+0.333) 

而這正是它返回:

  Car Bike Boat Plane Shuttle                            
Red  1  7  3  0  0                            
Green 5  0  0  0  0                            
Blue  1  1  4  0  1                            
['Red' 'Green' 'Blue']                                
Blue                                    
['Car' 'Bike' 'Boat' 'Plane' 'Shuttle']                           
Boat                                    
     Boat                                   
Blue  4.333        

注意,我可以用「指數」和列名與「列」檢查行的名稱。另外請注意,我可以根據行和列的名稱讀取'dataframe'的特定元素,並且這些值仍然是數字,因此我在最後一次打印中添加了'+0.333'。

我chaged數據文件,我刪除了引號字符(」「)和空格第一行中的逗號後。在這裏,你有 'easyEx.csv' 文件:

Car,Bike,Boat,Plane,Shuttle 
Red, 1, 7, 3, 0, 0 
Green, 5, 0, 0, 0, 0 
Blue, 1, 1, 4, 0, 1 

希望這可以幫助=)