2013-05-27 1 views
0

회사의 모든 데이터가 목록이있는 CSV 폴더로 들어있는 파일을 만들었습니다.목록의 번호와 일치하는 값만 선택합니다.

폴더는 이름, 나이, 열로 해, 종료 년도 가입 읽고 다음과 같습니다

내가 2000 년에 시작 모든 사람을 분리하기 위해 노력하고있어
Name, Age, Join Year, Exit Year 
Mark , 19 , 2001  na 
Mike, 30 , 2000  na 

지금까지 내 코드

를 읽고
import csv 

with open('Confidential.csv', 'rU') as input: 
    dL= list(csv.reader(input)) 
    sL = dL 
    print sL[2] 

그리고 이것은 이것이 dL의 줄 번호라는 것을 알고 있기 때문에 모든 마이크 데이터를 인쇄합니다.

내가 알고 싶은 것은 2000 년부터 모든 사람들을 표시하는 더 간단한 방법입니다. 2000 년에 시작한 사람을 검색하기 위해 작성할 수있는 코드가 있으며, 그렇다면 그 코드를 다음 행에 표시 할 수 있습니다. 저 사람들.

if raw_input = 2000 
find all 2000 
print line data for any line that contains 2000? 
Like mike, 30, 2000, na because that matches 2000 :) 

이 불가능하거나인가 내가 원래 코드와 개별적으로 각 사람의 줄 번호를 입력 고수하는 것이 더 나은 무엇입니까?

+1

추가하십시오 [파이썬] 태그 당신의 문제에 대한 10 Minutes to pandas

에서 매우 짧은 소개를 찾을 수 있습니다. – diegoperini

답변

1

filter 기능을 사용하여 파이썬에서 매우 쉽게 목록을 필터링 할 수 있습니다. 귀하의 경우,이 시도 : 목록 및 목록에서 항목을 통과 할 때 참 또는 거짓 반환하는 함수 :

import csv 

def started_in_2000(person): 
    return person[2] == '2000' 

with open('Confidential.csv', 'rU') as input: 

    all_people= list(csv.reader(input)) 

    people_who_started_in_2000 = filter(started_in_2000, all_people) 

    for person in people_who_started_in_2000: 
     print person 

filter는 두 개의 인수를 취합니다. 이 경우 2000 년에 사람이 시작했을 때 true를 반환하고 그 함수를 사용하는 사람들의 목록을 필터링하는 함수를 만들었습니다.

필터에 대한 자세한 내용은 파이썬 문서를 체크 아웃 : http://docs.python.org/2/library/functions.html#filter

2

print filter(lambda xs:xs[2]==raw_input(), sL);

이 내가 가정을 위해 당신이 찾고있는 것입니다.

나머지 : map(), filter() 및 함수 프로그래밍 패러다임을 사용하는 다른 모든 메서드에는 부작용이 없습니다. 즉, 항상 반환 값을 잡습니다.

1

데이터에 대해 더 많은 쿼리를 수행하려는 경우 데이터베이스로 변환하는 것이 좋습니다.

파이썬은 서버가 필요없고 간단한 파일에서 실행되는 데이터베이스 인 sqlite과 호환됩니다. 고급 기능이있는 CSV처럼 생각할 수 있습니다.

그래서, 여기에 SQLite는 방법입니다

import csv 
import sqlite3 # This imports the drivers for sqlite that come with Python 

database_file = 'employees.db' 
conn = sqlite3.connect(database_file) # Creates a new database, or 
             # opens a connection to the file 
             # if it already exists 

cur = conn.cursor() # A cursor, that we use to execute queries 

q = "CREATE TABLE IF NOT EXISTS Employees (Name, Age, JoinYear, ExitYear);" 
cur.execute(q) # Creates a new Employees table if it doesn't exist 

with open('Confidential.csv', 'rb') as f: 
    reader = csv.DictReader(f) 
    for row in reader: 
     q = """INSERT INTO Employees 
        (Name, Age, JoinYear, ExitYear) 
       VALUES (?,?,?,?);""" 
     cur.execute(q,row) 
     conn.commit() 

# Now we can do stuff like this 

q = "SELECT * FROM Employees WHERE JoinYear = 2000;" 
for result in cur.execute(q): 
    print("{} {} {} {}".format(*result) 

뿐만 아니라, 당신은 모든 직원들에게보다 30 살을 찾으려는 생각?

q = "SELECT * FROM Employees WHERE Age < 30;" 

모든 '짐'S : 매년 합류 얼마나 많은 직원

q = "SELECT * FROM Employees WHERE Name = 'Jim';" 

?

q = "SELECT COUNT(*) AS 'Total', Year FROM Employees GROUP BY Year;" 
1

이러한 종류의 조작을 수행하는 가장 좋은 모듈은 pandas입니다. 당신은 해결책이 질문에 간단

In [1]: import pandas 
In [2]: data = pandas.read_csv('Confidential.csv', delimiter=',', na_values=['na'], skipinitialspace=True) 
In [3]: data  # printing the read data 
Out[3]: 
      Name Age Join Year Exit Year 
     0 Mark 19  2001  NaN 
     1 Mike 30  2000  NaN 

In [3]: data[data['Join Year'] > 2000] # slicing the required data 
Out[3]: 
      Name Age Join Year Exit Year 
     0 Mark 19  2001  NaN