请原谅初学者的问题;我搜索了网站,但类似的问题似乎涉及SQL,我想学习如何单独使用Python。
好的,所以我想出了如何用cvs.reader打印最大值
到目前为止,这是我的代码:
with open('/users/user/Documents/test.csv', 'rU') as f:
f_csv = csv.reader(f, delimiter=',')
for row in f_csv:
max_row = max(csv.reader(f), key=op.itemgetter(0))
print max_row
这将返回我的csv文件中具有最高值的行 但我真正需要的是比较多个csv文件并找到所有这些文件的最大值(或者更好的是前5个),并且不返回行而是返回文件的名称。 例如,如果我有2个csv文件,并且学生的姓名和年龄分别在两个不同的类中,则代码将找到最大值并返回包含最早学生的类(文件名)。
有人可以帮忙吗?谢谢!
安德烈
答案 0 :(得分:1)
试试这个例子并说明你的要求
import csv
import operator as op
import requests
symbol = "mtgoxUSD"
url = 'http://api.bitcoincharts.com/v1/trades.csv?symbol={}'.format(symbol)
csv_file = "trades_{}.csv".format(symbol)
data = requests.get(url)
with open(csv_file, "w") as f:
f.write(data.text)
with open(csv_file) as f:
next(f) # discard first row from file -- see notes
max_value = max(row[0] for row in csv.reader(f))
with open(csv_file) as f:
next(f) # discard first row from file -- see notes
max_row = max(csv.reader(f), key=op.itemgetter(0))
注意:
max()可以直接使用迭代器,而csv.reader()给我们一个迭代器,所以我们可以传入它。我假设你可能需要丢弃一个标题行,所以我展示了如何做那。如果要丢弃多个标题行,则可能需要使用itertools模块中的islice()。
在第一个中,我们使用“生成器表达式”从每一行中选择一个值,并找到最大值。这非常类似于“列表理解”,但它不构建整个列表,它只是让我们迭代结果值。然后max()使用iterable,我们得到最大值。
max()可以使用key =参数指定“键函数”。它将使用key函数获取值并使用该值来计算max ...但max()返回的值将是未修改的原始值(在本例中,是CSV中的行值)。在这种情况下,key函数是由operator.itemgetter()生成的......你传递了你想要的列,operator.itemgetter()为你建立了一个获取该列的函数。
结果函数相当于:
def get_col_0(row):
return row[0]
max_row = max(csv.reader(f), key=get_col_0)
或者,人们将使用lambda:
max_row = max(csv.reader(f), key=lambda row: row[0])
但我认为operator.itemgetter()方便且易于阅读。它很快。
我展示了将数据保存在文件中,然后再次从文件中提取。如果您想在不将数据保存到任何地方的情况下浏览数据,您只需要按行迭代即可。 也许是这样的事情:
text = data.text
rows = [line.split(',') for line in text.split("\n") if line]
rows.pop(0) # get rid of first row from data
max_value = max(row[0] for row in rows)
max_row = max(rows, key=op.itemgetter(0))