我給你兩個答案,一個只返回最大值,一個從包含最大值的CSV返回行。
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=
參數。它將使用鍵功能來獲取值並使用該值來計算最大值...但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))
- 我不知道你想要的列...列「A」可能是列0,所以我在上面使用0。根據需要更換列號。
這是一個比解決方案更多的問題,但是你不能這樣做:'import csv',然後做你的'open'行然後做'whole_thing = list(csv.reader(f ))''之後你有哪些列表。一旦你有了一個列表清單,你不能只分割你想要的列(即'whole_thing [some_line] [column-with-data-we-want]'),並取得最大值? 這個評論真的很醜。我會在下面發佈它以更好地格式化它。 – erewok 2013-05-10 02:08:50