处理CSV数据时,如何忽略第一行数据?

我要求Python从一列CSV数据中打印最小数字,但是最上面一行是列号,我不希望Python把最上面一行考虑在内。 我如何确保Python忽略第一行?

这是迄今为止的代码:

import csv with open('all16.csv', 'rb') as inf: incsv = csv.reader(inf) column = 1 datatype = float data = (datatype(column) for row in incsv) least_value = min(data) print least_value 

你也可以解释你在做什么,而不是只给代码? 我对Python非常陌生,希望确保我能理解所有的东西。

您可以使用csv模块的Sniffer类来检测是否存在标题行,并在必要时使用内置的next()函数跳过它:

 import csv with open('all16.csv', 'rb') as inf: has_header = csv.Sniffer().has_header(inf.read(1024)) inf.seek(0) # rewind incsv = csv.reader(inf) if has_header: next(incsv) # skip header row column = 1 datatype = float data = (datatype(row[column]) for row in incsv) least_value = min(data) print least_value 

如果您使用的是Python 2.x,您也可以跳过带有incsv.next()调用的行(但上面的代码同时适用于2和3)。

由于datatypecolumn在您的示例中进行了硬编码,因此以这种方式读取data会稍微快一些:

  data = (float(row[1]) for row in incsv) 

注意:Python 2与Python 3

由于这是一个非常受欢迎的答案,而且是很久以前写的,所以需要做一些小小的修改,使其能够在Python 3中工作:

 with open('all16.csv', 'r', newline='') as inf: 

并将最后一行更改为:

 print(least_value) 

要跳过第一行,只需调用:

 next(inf) 

Python中的文件是遍历行的迭代器。

你通常会使用next(incsv) ,它将迭代器推进一行,所以你可以跳过标题。 另一个(比如说你想跳过30行)是:

 from itertools import islice for row in islice(incsv, 30, None): # process 

在类似的用例中,我不得不跳过行之前的恼人的行与我的实际列名称。 这个解决scheme很好地工作。 先读取文件,然后将列表传递给csv.DictReader

 with open('all16.csv') as tmp: # Skip first line (if any) next(tmp, None) # {line_num: row} data = dict(enumerate(csv.DictReader(tmp))) 

使用csv.DictReader而不是csv.Reader。 如果省略了fieldnames参数,则csvfile的第一行中的值将用作字段名称。 那么你将能够使用行[“1”]等访问字段值

新的'pandas'套餐可能比'csv'更有意义。 下面的代码将读取一个CSV文件,默认情况下将第一行解释为列标题,并查找跨列的最小值。

 import pandas as pd data = pd.read_csv('all16.csv') data.min() 

那么,我的迷你包装图书馆也会做这个工作。

 >>> import pyexcel as pe >>> data = pe.load('all16.csv', name_columns_by_row=0) >>> min(data.column[1]) 

同时,如果您知道某个标题列索引(例如“列1”),则可以这样做:

 >>> min(data.column["Column 1"]) 

我会用尾巴摆脱不必要的第一行:

 tail -n +2 $INFIL | whatever_script.py 

只需添加[1:]

示例如下:

 data = pd.read_csv("/Users/xyz/Desktop/xyxData/xyz.csv", sep=',', header=None)**[1:]** 

这在iPython中适用于我

Python 3.X

处理UTF8 BOM +标题

csv模块无法轻松获取头文件是非常令人沮丧的,UTF-8 BOM(文件中的第一个字符)也存在一个错误。 这适用于我只使用csv模块:

 import csv def read_csv(self, csv_path, delimiter): with open(csv_path, newline='', encoding='utf-8') as f: # https://bugs.python.org/issue7185 # Remove UTF8 BOM. txt = f.read()[1:] # Remove header line. header = txt.splitlines()[:1] lines = txt.splitlines()[1:] # Convert to list. csv_rows = list(csv.reader(lines, delimiter=delimiter)) for row in csv_rows: value = row[INDEX_HERE]