2013-10-09 3 views
-2

초급자의 질문에 사과하십시오. 사이트를 검색했지만 비슷한 질문에 SQL이 포함되어있는 것 같아서 파이썬 만 사용하여이 작업을 수행하는 방법을 배우고 싶습니다.복수의 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 파일을 비교하고 모든 파일에서 최대 값을 찾은 다음 파일의 행이 아니라 파일의 이름을 반환하는 것입니다. 예를 들어 두 개의 개별 클래스에있는 학생의 이름과 나이와 함께 2 개의 CSV 파일이있는 경우 코드는 최대 값을 찾아서 가장 오래된 학생이 속한 클래스 (파일 이름)를 반환합니다.

아무도 도와 줄 수 있습니까? 감사! 우리에게 반복자를 제공합니다() 반복자 및 csv.reader을 소비하는 직접 수) (

최대 :

앙드레

답변

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

참고로 설명 그래서 우리는 그것을 전달할 수 있습니다. 당신이 헤더 라인을 버려야 할 필요가 있다고 가정하기 때문에 그렇게하는 방법을 보여주었습니다. 버릴 헤더 행이 여러 개있는 경우 itertools 모듈에서 islice()를 사용하는 것이 좋습니다.

첫 번째 경우 "생성자 표현식"을 사용하여 각 행에서 단일 값을 선택하고 최대 값을 찾습니다. 이것은 "list comprehension"과 매우 유사하지만 전체 목록을 작성하지는 않습니다. 결과 값을 반복 할 수 있습니다. max()는 iterable을 소비하고 max 값을 얻는다.

max()는 "키 기능"을 지정할 때 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) 

또는 사람들이 이것에 대한 람다를 사용합니다 :

결과 기능에 해당합니다

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 개 이상의 Excel/CSV 파일을 비교해야한다면 그 코드가 작동할까요? 다시 한 번 감사드립니다! – Andre

관련 문제