![](/img/trans.png)
[英]python read csv file with row and column headers into dictionary with two keys
[英]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_header
, row_header
和data
:
['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.