이 예제를 시도하고 귀하의 요구 사항
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))
고마워요! 나는 그것을 도와 주셔서 감사합니다 – Andre
한 가지 더 생각해도 괜찮다면, 2 개 이상의 Excel/CSV 파일을 비교해야한다면 그 코드가 작동할까요? 다시 한 번 감사드립니다! – Andre