我有一个包含以下列的csv文件:
ID,姓名,年龄,性别
后面是上面列的很多值。 我试图单独阅读列名并将它们放在列表中。
我正在使用Dictreader,这会给出正确的详细信息:
with open('details.csv') as csvfile:
i=["name","age","sex"]
re=csv.DictReader(csvfile)
for row in re:
for x in i:
print row[x]
但我想要做的是,我需要列表列表(在上面的例子中为“i”)用输入csv自动解析,而不是在列表中硬编码。
with open('details.csv') as csvfile:
rows=iter(csv.reader(csvfile)).next()
header=rows[1:]
re=csv.DictReader(csvfile)
for row in re:
print row
for x in header:
print row[x]
这会发出错误
Keyerrror:'name'
在行打印行[x]中。我哪里错了?是否可以使用Dictreader获取列名?请帮助。谢谢和问候。
答案 0 :(得分:55)
虽然您已经接受了答案,但我认为我会为其他对其他解决方案感兴趣的人添加此答案 -
实施可以如下:
import csv
with open('C:/mypath/to/csvfile.csv', 'r') as f:
d_reader = csv.DictReader(f)
#get fieldnames from DictReader object and store in list
headers = d_reader.fieldnames
for line in d_reader:
#print value in MyCol1 for each row
print(line['MyCol1'])
在上面, d_reader.fieldnames 返回标题列表(假设标题位于顶行)。 哪个允许...
>>> print(headers)
['MyCol1', 'MyCol2', 'MyCol3']
如果您的标题位于第2行(最上一行是第1行),您可以执行以下操作:
import csv
with open('C:/mypath/to/csvfile.csv', 'r') as f:
#you can eat the first line before creating DictReader.
#if no "fieldnames" param is passed into
#DictReader object upon creation, DictReader
#will read the upper-most line as the headers
f.readline()
d_reader = csv.DictReader(f)
headers = d_reader.fieldnames
for line in d_reader:
#print value in MyCol1 for each row
print(line['MyCol1'])
答案 1 :(得分:34)
您可以使用next()
函数读取标题,该函数将读者的可迭代对象的下一行作为列表返回。然后你可以将文件的内容添加到列表中。
import csv
with open("C:/path/to/.filecsv", "rb") as f:
reader = csv.reader(f)
i = reader.next()
rest = [row for row in reader]
现在我将列的名称作为列表。
print i
>>>['id', 'name', 'age', 'sex']
另请注意reader.next()
在python 3中不起作用。而是使用内置的next()
在读完之后立即获取csv的第一行:
import csv
with open("C:/path/to/.filecsv", "rb") as f:
reader = csv.reader(f)
i = next(reader)
print(i)
>>>['id', 'name', 'age', 'sex']
答案 2 :(得分:10)
csv.DictReader
对象公开了一个名为fieldnames
的属性,这就是您要使用的属性。这是示例代码,后跟输入和相应的输出:
import csv
file = "/path/to/file.csv"
with open(file, mode='r', encoding='utf-8') as f:
reader = csv.DictReader(f, delimiter=',')
for row in reader:
print([col + '=' + row[col] for col in reader.fieldnames])
输入文件内容:
col0,col1,col2,col3,col4,col5,col6,col7,col8,col9
00,01,02,03,04,05,06,07,08,09
10,11,12,13,14,15,16,17,18,19
20,21,22,23,24,25,26,27,28,29
30,31,32,33,34,35,36,37,38,39
40,41,42,43,44,45,46,47,48,49
50,51,52,53,54,55,56,57,58,59
60,61,62,63,64,65,66,67,68,69
70,71,72,73,74,75,76,77,78,79
80,81,82,83,84,85,86,87,88,89
90,91,92,93,94,95,96,97,98,99
输出印刷报表:
['col0=00', 'col1=01', 'col2=02', 'col3=03', 'col4=04', 'col5=05', 'col6=06', 'col7=07', 'col8=08', 'col9=09']
['col0=10', 'col1=11', 'col2=12', 'col3=13', 'col4=14', 'col5=15', 'col6=16', 'col7=17', 'col8=18', 'col9=19']
['col0=20', 'col1=21', 'col2=22', 'col3=23', 'col4=24', 'col5=25', 'col6=26', 'col7=27', 'col8=28', 'col9=29']
['col0=30', 'col1=31', 'col2=32', 'col3=33', 'col4=34', 'col5=35', 'col6=36', 'col7=37', 'col8=38', 'col9=39']
['col0=40', 'col1=41', 'col2=42', 'col3=43', 'col4=44', 'col5=45', 'col6=46', 'col7=47', 'col8=48', 'col9=49']
['col0=50', 'col1=51', 'col2=52', 'col3=53', 'col4=54', 'col5=55', 'col6=56', 'col7=57', 'col8=58', 'col9=59']
['col0=60', 'col1=61', 'col2=62', 'col3=63', 'col4=64', 'col5=65', 'col6=66', 'col7=67', 'col8=68', 'col9=69']
['col0=70', 'col1=71', 'col2=72', 'col3=73', 'col4=74', 'col5=75', 'col6=76', 'col7=77', 'col8=78', 'col9=79']
['col0=80', 'col1=81', 'col2=82', 'col3=83', 'col4=84', 'col5=85', 'col6=86', 'col7=87', 'col8=88', 'col9=89']
['col0=90', 'col1=91', 'col2=92', 'col3=93', 'col4=94', 'col5=95', 'col6=96', 'col7=97', 'col8=98', 'col9=99']
答案 3 :(得分:2)
感谢Daniel Jimenez从我的csv中单独获取列名的完美解决方案,我扩展他的解决方案以使用DictReader,因此我们可以使用列名作为索引迭代行。谢谢Jimenez。
with open('myfile.csv') as csvfile:
rest = []
with open("myfile.csv", "rb") as f:
reader = csv.reader(f)
i = reader.next()
i=i[1:]
re=csv.DictReader(csvfile)
for row in re:
for x in i:
print row[x]
答案 4 :(得分:0)
我只是提到如何从csv文件中获取所有列名。 我正在使用熊猫库。
首先我们读取文件。
[[[0.8 0.2]
[0.1 0.9]
[0.8 0.2]]
[[0.1 0.9]
[0.8 0.2]
[0.8 0.2]]]
然后,为了从输入文件中获取所有列名作为列表,请使用:-
import pandas as pd
file = pd.read_csv('details.csv')
答案 5 :(得分:0)
这是仅打印csv文件标题或列的代码。
import csv
HEADERS = next(csv.reader(open('filepath.csv')))
print (HEADERS)
另一种使用熊猫的方法
import pandas as pd
HEADERS = list(pd.read_csv('filepath.csv').head(0))
print (HEADERS)
答案 6 :(得分:0)
怎么样
with open(csv_input_path + file, 'r') as ft:
header = ft.readline() # read only first line; returns string
header_list = header.split(',')
#返回列表;
我假设您的输入文件为CSV格式。 如果使用熊猫,则文件较大时会花费更多时间,因为它将整个数据加载为数据集。
答案 7 :(得分:0)
import pandas as pd
data = pd.read_csv("data.csv")
cols = data.columns
答案 8 :(得分:0)
我实际上只是想要数据的第一行,即我需要的标题,并且不想遍历我的所有数据来获取它们,所以我就这样做了:
with open(data, 'r', newline='') as csvfile:
t = 0
for i in csv.reader(csvfile, delimiter=',', quotechar='|'):
if t > 0:
break
else:
dbh = i
t += 1