我要求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)
由于datatype和column在你的榜样硬编码,这将是稍快处理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)
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)
使用csv.DictReader而不是csv.Reader.如果省略fieldnames参数,则csvfile的第一行中的值将用作字段名称.然后,您可以使用行["1"]等访问字段值
Python 2.x
\n\n\n\n将 reader\xe2\x80\x99s 可迭代对象的下一行作为列表返回,并根据当前方言进行解析。
\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\nRun Code Online (Sandbox Code Playgroud)\nPython 3.x
\n\n\n\n返回 reader\xe2\x80\x99s 可迭代对象的下一行作为列表(如果\n对象是从 reader() 返回的)或字典(如果它是 DictReader\实例),根据当前方言进行解析。通常你应该\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\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
195367 次 |
| 最近记录: |