簡體   English   中英

使用行和列標題讀取CSV的Pythonic方法

[英]A Pythonic way to read CSV with row and column headers

讓我們有一個帶有行和列標題的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:]]

......但它看起來不夠Pythonic。

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

看看csv.DictReader

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

然后你可以做reader.fieldnames 當然,這只會為您提供列標題。 您仍然需要手動解析行標題。

不過,我認為你原來的解決方案非常好。

現在我看到我想要的是最簡單(也是最強大)的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中,似乎我在問題中寫的方法“足夠好”。

我知道這個解決方案為您提供了另一種輸出格式,但它非常方便。 這會將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))

沒有第三方庫(如果你可以使用來自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'])

同意,大熊貓也是我發現的最好的。 我有興趣閱讀我的數據幀的特定值。 這是我做的:

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                              

請注意,我可以使用'index'檢查行名,使用'columns'檢查列名。 另請注意,我可以根據行名和列名讀取“數據幀”的特定元素,並且值仍為數字,這就是為什么我在最后一次打印中添加了“+0.333”。

我查了數據文件,刪除了引號字符(“”)和第一行逗號之后的空格。 這里有'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

希望這可以幫助=)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM