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

103 python 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
Run Code Online (Sandbox Code Playgroud)

你能解释一下你在做什么,而不只是给出代码吗?我对Python非常陌生,并希望确保我理解一切.

mar*_*eau 101

您可以使用csv模块Sniffer类的实例推导出CSV文件的格式,并检测是否存在标题行以及内置next()函数,以便仅在必要时跳过第一行:

import csv

with open('all16.csv', 'r', newline='') as file:
    has_header = csv.Sniffer().has_header(file.read(1024))
    file.seek(0)  # Rewind.
    reader = csv.reader(file)
    if has_header:
        next(reader)  # Skip header row.
    column = 1
    datatype = float
    data = (datatype(row[column]) for row in reader)
    least_value = min(data)

print(least_value)
Run Code Online (Sandbox Code Playgroud)

由于datatypecolumn在你的榜样硬编码,这将是稍快处理row是这样的:

    data = (float(row[1]) for row in reader)
Run Code Online (Sandbox Code Playgroud)

注意:上面的代码适用于Python 3.x. 对于Python 2.x,使用以下行打开文件而不是显示的内容:

with open('all16.csv', 'rb') as file:
Run Code Online (Sandbox Code Playgroud)

  • 代替`has_header(file.read(1024))`,写`has_header(file.readline())`有意义吗?我看到了很多,但是我不明白“ has_reader()”如何从CSV文件的单行中检测是否有标题... (2认同)

jfs*_*jfs 66

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

next(inf)
Run Code Online (Sandbox Code Playgroud)

Python中的文件是线上的迭代器.


Jon*_*nts 20

您通常会使用next(incsv)将迭代器推进一行的方法,因此您跳过标题.另一个(比如你想跳过30行)将是:

from itertools import islice
for row in islice(incsv, 30, None):
    # process
Run Code Online (Sandbox Code Playgroud)


小智 20

在类似的用例中,我必须在使用实际列名称之前跳过恼人的行.这个解决方案效果很好.首先读取文件,然后将列表传递给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)))
Run Code Online (Sandbox Code Playgroud)


shi*_*hin 18

借用python cookbook,
更简洁的模板代码可能如下所示:

import csv
with open('stocks.csv') as f:
    f_csv = csv.reader(f) 
    headers = next(f_csv) 
    for row in f_csv:
        # Process row ...
Run Code Online (Sandbox Code Playgroud)


iru*_*var 6

使用csv.DictReader而不是csv.Reader.如果省略fieldnames参数,则csvfile的第一行中的值将用作字段名称.然后,您可以使用行["1"]等访问字段值


Pat*_*mil 5

Python 2.x

\n

csvreader.next()

\n
\n

将 reader\xe2\x80\x99s 可迭代对象的下一行作为列表返回,并根据当前方言进行解析。

\n
\n
csv_data = csv.reader(open(\'sample.csv\'))\ncsv_data.next() # skip first row\nfor row in csv_data:\n    print(row) # should print second row\n
Run Code Online (Sandbox Code Playgroud)\n
\n

Python 3.x

\n

csvreader.__next__()

\n
\n

返回 reader\xe2\x80\x99s 可迭代对象的下一行作为列表(如果\n对象是从 reader() 返回的)或字典(如果它是 DictReader\实例),根据当前方言进行解析。通常你应该\n将其称为下一个(阅读器)。

\n
\n
csv_data = csv.reader(open(\'sample.csv\'))\ncsv_data.__next__() # skip first row\nfor row in csv_data:\n    print(row) # should print second row\n
Run Code Online (Sandbox Code Playgroud)\n