python
2013-05-10 95 views 2 likes 
2

我在兩個小時前提出了一個關於從網站讀取和寫入數據的問題。自那時起,我花了最近兩個小時試圖找到一種方法來讀取輸出列「A」中的最大日期值,將該值與刷新的網站數據進行比較,並將任何新數據附加到csv文件而不會覆蓋舊的或創建重複。CSV在列中找到最大值並追加新數據

即代碼目前100%的工作是這樣的:

import requests 
symbol = "mtgoxUSD" 
url = 'http://api.bitcoincharts.com/v1/trades.csv?symbol={}'.format(symbol) 
data = requests.get(url) 
with open("trades_{}.csv".format(symbol), "r+") as f: 
    f.write(data.text) 

我試圖找到列「A」的最大值的各種方式。我嘗試了一系列使用「Dict」和其他排序/查找最大值的方法,甚至使用熊貓和numpy庫。這似乎沒有任何工作。有人能以一種體面的方式指出我從.csv文件中找到列的最大值嗎?謝謝!

+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

回答

1

我給你兩個答案,一個只返回最大值,一個從包含最大值的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。根據需要更換列號。
+0

我喜歡這些解決方案。感謝您的解釋。 – erewok 2013-05-10 03:11:06

+0

@erewok,不客氣! :-) – steveha 2013-05-10 03:20:00

+0

同意。感謝步驟的詳細解釋! – user2368124 2013-05-10 03:29:26

2

,如果你在一個熊貓數據幀擁有它,你可以得到任何一列這樣的最大值:

>>> max(data['time']) 
'2012-01-18 15:52:26' 

其中data是變量名的數據幀和time是列名

1

好像這樣的事情應該工作:

import requests 
import csv 
symbol = "mtgoxUSD" 
url = 'http://api.bitcoincharts.com/v1/trades.csv?symbol={}'.format(symbol) 
data = requests.get(url) 
with open("trades_{}.csv".format(symbol), "r+") as f: 
    all_values = list(csv.reader(f)) 
    max_value = max([int(row[2]) for row in all_values[1:]]) 
(write-out-the-value?) 

EDITS:我用「行[2]」,因爲這是樣品列我是塔基ng csv中的最大值。此外,我不得不刪除列標題,這是所有文本,這就是爲什麼我從第二行到文件結尾查看「all_values [1:]」。

+0

你應該閱讀「發電機表達式」......你會喜歡他們的!它們的工作方式與列表解析非常相似,但它們可以更快,因爲它們的工作量較少(它們不構建列表,它們只是一次產生一個值)。另外,你並不需要調用list()。看到我的答案有幾種方法來拋棄迭代器中的一個或多個值。 – steveha 2013-05-10 03:01:43

+0

感謝您的回覆! – erewok 2013-05-10 03:07:32

相關問題