7

让我们有一个带有行和列标题的 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。

这种自然操作有没有更简洁的方法?

4

5 回答 5

4

看看csv.DictReader

如果省略 fieldnames 参数,则 csvfile 第一行中的值将用作字段名。

然后你就可以做reader.fieldnames。当然,这只会为您提供列标题。您仍然需要手动解析行标题。

但是,我认为您的原始解决方案非常好。

于 2012-11-10T18:38:53.590 回答
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 中,我在问题中编写的方法似乎“足够好”。

于 2013-06-15T12:33:07.257 回答
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))
于 2012-11-10T20:17:41.417 回答
0

没有 3rd 方库(如果您可以接受来自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_header,row_headerdata:

['Bike', 'Boat', 'Plane', 'Shuttle']
('Red', 'Green', 'Blue')
(['1', '7', '3', '0', '0'], ['5', '0', '0', '0', '0'], ['1', '1', '4', '0', '1'])
于 2013-06-15T13:58:42.860 回答
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                              

请注意,我可以用“索引”检查行名,用“列”检查列名。另请注意,我可以根据行名和列名读取“数据框”的特定元素,并且这些值仍然是数字,这就是我在最后一次打印中添加“+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

希望这可以帮助=)

于 2017-07-05T12:07:10.547 回答