2013-10-09 65 views
-2

請原諒初學者的問題;我有搜索網站,但類似的問題似乎涉及SQL,我想學習如何單獨使用Python。在多個csv文件中搜索最大值

好了,我已經找到了如何與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文件,並且學生的姓名和年齡分成兩個單獨的班級,則代碼將查找最大值並返回包含其中最老的學生(文件名)的班級。

任何人都可以請幫忙嗎?謝謝!

安德烈

回答

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 = argument指定一個「key function」。它將使用鍵函數來獲取值並使用該值來計算最大值...但由max()返回的值將是未修改的原始值(在此情況下是CSV中的行值)。在這種情況下,關鍵函數是由operator.itemgetter()爲您製作的,您將傳遞到您想要的列,然後operator.itemgetter()爲您獲取該列的函數。

產生的作用是等價的:

def get_col_0(row): 
    return row[0] 
max_row = max(csv.reader(f), key=get_col_0) 

或者,人們會用拉姆達此:

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)) 
+0

非常感謝!我感謝它的幫助 – Andre

+0

如果您不介意,還有一件事情,如果我需要比較超過2個excels/csv文件,該代碼是否也可以工作?再次感謝! – Andre