Python 如何在处理CSV数据时忽略第一行数据?
我要求Python打印CSV数据列中的最小数字,但最上面一行是列号,我不希望Python考虑最上面一行。如何确保Python忽略第一行 这是迄今为止的代码: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
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:我答案中的代码是