-1

请原谅初学者的问题;我已经搜索了该站点,但类似的问题似乎涉及 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 文件,其中包含两个单独班级中学生的姓名和年龄,代码将找到最大值并返回其中包含最老学生的班级(文件名)。

有人可以帮忙吗?谢谢!

安德烈

4

1 回答 1

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() 消耗迭代,我们得到最大值。

max() 可以在指定“键函数”的地方使用 key= 参数。它将使用 key 函数获取一个值并使用该值来计算最大值......但 max() 返回的值将是未修改的原始值(在这种情况下,是来自 CSV 的行值)。在这种情况下,键函数是由 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))
于 2013-10-09T04:07:11.333 回答