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

Python 如何在处理CSV数据时忽略第一行数据?,python,csv,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

我要求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非常陌生,希望确保我了解所有内容。

通常使用
next(incsv)
将迭代器向前推进一行,因此跳过标题。另一个(假设您想跳过30行)是:

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

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

您可以使用
csv
模块类的实例来推断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)
由于在您的示例中,
数据类型
都是硬编码的,因此像这样处理
会稍微快一些:

    data = (float(row[1]) for row in reader)
if sniffer.has_header():
    for header_row in reader:
        break
for data_row in reader:
    # do something with the row
注意:上面的代码是针对Python3.x的。对于Python 2.x,使用以下行打开文件,而不是显示的内容:

with open('all16.csv', 'rb') as file:

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

next(inf)

Python中的文件是行上的迭代器。

新的“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是什么,例如“column 1”,您可以这样做:

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

在一个类似的用例中,我不得不在带有实际列名的行之前跳过恼人的行。这个解决方案很有效。首先读取文件,然后将列表传递给
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)))
我会用tail去掉不需要的第一行:

tail -n +2 $INFIL | whatever_script.py 

只需添加[1::

示例如下:

data = pd.read_csv("/Users/xyz/Desktop/xyxData/xyz.csv", sep=',', header=None)**[1:]**
这在iPython中对我很有效

处理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]

对我来说,最简单的方法就是使用range

import csv

with open('files/filename.csv') as I:
    reader = csv.reader(I)
    fulllist = list(reader)

# Starting with data skipping header
for item in range(1, len(fulllist)): 
    # Print each row using "item" as the index value
    print (fulllist[item])  
借用自,
更简洁的模板代码可能如下所示:

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

因为这与我正在做的事情有关,我将在这里分享

如果我们不确定是否有标题,而您也不想导入嗅探器和其他东西,该怎么办

如果您的任务是基本任务,例如打印或附加到列表或数组,则可以使用If语句:

# Let's say there's 4 columns
with open('file.csv') as csvfile:
     csvreader = csv.reader(csvfile)
# read first line
     first_line = next(csvreader)
# My headers were just text. You can use any suitable conditional here
     if len(first_line) == 4:
          array.append(first_line)
# Now we'll just iterate over everything else as usual:
     for row in csvreader:
          array.append(row)
提供了以下示例:

with open('example.csv', newline='') as csvfile:
    dialect = csv.Sniffer().sniff(csvfile.read(1024))
    csvfile.seek(0)
    reader = csv.reader(csvfile, dialect)
    # ... process CSV file contents here ...
嗅探器将尝试自动检测CSV文件的许多内容。您需要显式调用其
has_header()
方法来确定文件是否有头行。如果是,则在迭代CSV行时跳过第一行。您可以这样做:

    data = (float(row[1]) for row in reader)
if sniffer.has_header():
    for header_row in reader:
        break
for data_row in reader:
    # do something with the row

我会将csvreader转换为list,然后弹出第一个元素

import csv        

with open(fileName, 'r') as csvfile:
        csvreader = csv.reader(csvfile)
        data = list(csvreader)               # Convert to list
        data.pop(0)                          # Removes the first row

        for row in data:
            print(row)

python2.x

以列表形式返回读取器的iterable对象的下一行,已解析 按照现在的方言


Python3.x

将读取器的iterable对象的下一行作为列表返回(如果 对象是从读取器()或dict(如果是DictReader)返回的 实例),根据当前方言进行分析。通常你应该 称此为下一个(读卡器)


这可能是一个非常古老的问题,但对于熊猫,我们有一个非常简单的解决方案

import pandas as pd

data=pd.read_csv('all16.csv',skiprows=1)
data['column'].min()

使用skiprows=1,我们可以跳过第一行,然后使用数据['column'].min()找到最小值。

您是否知道,您只是在创建一个生成器,为文件中的每一行返回
1.0
,然后取最小值,从技术上讲是
1.0
?@Wooble,它是
1.0
的一个大生成器:)@Wooble很好的捕获-…
数据类型(行[列]
…是我猜OP试图实现的,虽然我有人为我编写了代码,但没有捕获,所以谢谢哈哈!你也可以在一行中编写:
pd.read\u csv('all16.csv').min()
谢谢Veedrac。很高兴在这里学习,你能建议一些编辑来解决你提到的问题吗?我的解决方案完成了任务,但看起来还可以进一步改进?我给了你一个编辑,用一些应该相同(未经测试)的东西来替换代码。如果与您的意思不一致,请随时回复。我仍然不确定您为什么要制作
数据
字典,也不知道这个答案在已接受的答案上添加了任何内容。谢谢Veedrac!这看起来确实非常有效。我发布了我的答案,因为已接受的答案不适用于我(现在不记得原因)。定义data=dict()然后立即填充(与您的建议相比)会有什么问题?执行
data=dict()
并填充它并没有错,但它效率低且不惯用。此外,应该使用dict文本(
{}
)和
enumerate
即使是then.FWIW,如果你想确保我收到通知,你也应该用
@Veedrac
回复我的帖子,尽管堆栈溢出似乎可以从用户名猜出来。(我不写
@Maarten
,因为默认情况下会通知应答者。)而不是
有_头(file.read(1024))
,写
has_header(file.readline())
有意义吗?我看到了很多,但我不明白
has_reader()
怎么能检测到CSV文件的单行中是否有头…@Anto:我答案中的代码是