在处理 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 非常陌生,我想确保自己能够理解所有的东西。

261826 次浏览

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

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

使用 csv.DictReader 代替 csv.Reader。 如果字段名参数被省略,那么 csvfile 第一行中的值将被用作字段名。然后您就可以使用 row [“1”]等来访问字段值

您可以使用 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)

由于在您的示例中 datatypecolumn是硬编码的,所以像下面这样处理 row会稍微快一些:

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

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

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

要跳过第一行,只需拨打:

next(inf)

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

新的“熊猫”套餐可能比“ 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 -n +2 $INFIL | whatever_script.py

加上 [1: ]

例子如下:

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

在 iPython 中对我很有用

巨蟒3 X

处理 UTF8 BOM + HEADER

令人沮丧的是,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]

对我来说,最简单的方法是使用范围。

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)

Python 3 CSV 模块的文档提供了这样一个例子:

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 ...

Sniffer将尝试自动检测关于 CSV 文件的许多内容。您需要显式调用它的 has_header()方法来确定文件是否有标题行。如果是这样,那么在迭代 CSV 行时跳过第一行。你可以这样做:

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)

Python 2. x

csvreader.next()

将读取器的可迭代对象的下一行作为列表返回,并进行解析 根据现在的方言。

csv_data = csv.reader(open('sample.csv'))
csv_data.next() # skip first row
for row in csv_data:
print(row) # should print second row

Python 3. x

csvreader.__next__()

将读取器的可迭代对象的下一行作为列表返回(如果 对象从 reader ()或 dict (如果它是 DictReader)返回 例) ,并根据当前方言进行解析 称之为下一个(读者)。

csv_data = csv.reader(open('sample.csv'))
csv_data.__next__() # skip first row
for row in csv_data:
print(row) # should print second row

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

import pandas as pd


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

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

简单的解决方案是使用 csv.DictReader ()

import csv


def read_csv(file): with open(file, 'r') as file:
reader = csv.DictReader(file)
for row in reader:
print(row["column_name"])  # Replace the name of column header.