2011-11-28 8 views
1

CSV의 특정 열에서 데이터를 추출하기 위해 Python의 기본 제공 필터 함수를 사용하려고합니다. 필터 기능을 잘 사용하고 있습니까? 먼저이 열의 데이터를 정의해야합니까, 아니면 파이썬이 어떤 열에 어떤 데이터가 들어 있는지 알 수 있습니까?Python의 필터 함수 사용

+0

입력 데이터와 요청 된 출력 데이터의 예를 제공 할 수 있습니까? – six8

+0

당신이하고 싶은 것을 더 자세하게 설명 할 수 있습니까? 어쩌면 예를 보여줄 수 있습니까? 나에게 명확하지 않다 ... –

+0

물론. CSV에 열 1,2 및 3이 있다고 가정 해 봅시다. 열 2의 모든 데이터를 무시하고 열 1 및 3의 데이터 만 추출하려고합니다. 필터 함수를 사용하여이를 수행 할 수 있습니까? – mantissa45

답변

2

(또는 일반적으로 어떤 반복자) 특정 조건을 만족하는 요소. 그것은 인덱스 기반 선택을위한 것이 아닙니다. 따라서 을 사용하여 CSV 파일의 지정된 열을 찾아 낼 수 있지만 권장하지는 않습니다. 관심의 열 반복자를 생성하는 것이 더있을 수 있습니다, 당신은 레코드하고 정확히에

with open(filename, 'rb') as f: 
    for record in csv.reader(f): 
     do_something_with(record[0], record[2]) 

따라 : 대신 당신은 아마이 같은 것을 사용한다

with open(filename, 'rb') as f: 
    the_iterator = ((record[0], record[2]) for record in csv.reader(f)) 
    # do something with the iterator 

또는, 비 순차적 처리가 필요한 경우 아마도 목록 일 수 있습니다.

with open(filename, 'rb') as f: 
    the_list = [(record[0], record[2]) for record in csv.reader(f)] 
    # do something with the list 

데이터를 열에 정의하면 무엇을 의미하는지 모르겠습니다. 데이터는 CSV 파일로 정의됩니다. 이에 비해


, 여기 당신이 filter을 사용할 것하는 경우입니다 : CSV 파일이 숫자 데이터를 포함한다고 가정하면 숫자가 엄격 내에서 증가하는 순서로되는 기록의 목록을 구축해야 행. 당신은 번호 목록이 엄격하게 증가하는 순서에 있는지 여부를 결정하는 함수를 작성할 수

def strictly_increasing(fields): 
    return all(int(i) < int(j) for i,j in pairwise(fields)) 

이 ( pairwise의 정의에 대한 itertools documentation 참조). 물론

with open(filename, 'rb') as f: 
    the_list = filter(strictly_increasing, csv.reader(f)) 
    # do something with the list 

, 같은 일이 수, 보통, 지능형리스트로 구현 될 것이다 : 그럼 당신은 filter의 상태로 사용할 수 있습니다

with open(filename, 'rb') as f: 
    the_list = [record for record in csv.reader(f) if strictly_increasing(record)] 
    # do something with the list 

그래서 사용하는 작은 이유가 실제로는 filter입니다.

7

파이썬은 "배터리 포함"을 자랑했기 때문에 대부분의 일상적인 상황에서 누군가가 이미 해결책을 제공했을 것입니다. CSV가 그 중 하나입니다. built-in csv module

또한 제 3 자 모듈 특히 비 ASCII 데이터를 처리합니다.

당신이 코멘트에 기술 된 행동이 할 것 다음 filter 기능 목록에서 선택하기위한 것입니다

import csv 
with open('some.csv', 'rb') as f: 
    reader = csv.reader(f) 
    for row in reader: 
     row.pop(1) 
     print ", ".join(row)