2014-12-02 4 views
1

CSV 파일을 읽고 거기에서 필요한 데이터를 추출하려고합니다. 내 코드는 다음과 같습니다. sample.csv 내가 출력에서 ​​첫 번째 열을 제외하려면 csv 파일을 읽을 때 첫 번째 열 건너 뛰기 Python

h1,h2,h3 
a data,data: abc,tr 
b data,vf data, gh 
k data,grt data, ph 

sample.csv

아래 같이 보입니다

import csv 
file = "sample.csv" 
def get_values_flexibly(file, keyword): 
    def process(func): 
     return set([func(cell)] + [func(row[index]) for row in reader]) 

    with open(file, 'r') as f: 
     reader = csv.reader(f) 
     first_row = reader.next() 
     if keyword in first_row: 
      return str(list(set([row[first_row.index(keyword)] for row in reader]))) 
     for index, cell in enumerate(reader.next()): 
      if cell.endswith(' ' + keyword): 
       return str(list(set(process(lambda cell: cell[:-len(keyword) - 1])))) 
      elif cell.split(':')[0].strip() == keyword: 
       return str(list(set(process(lambda cell: cell.split(':')[1].strip())))) 
print get_values_flexibly(file, 'data') 

. 현재 출력은 ['a','k','b']입니다. 그러나 ['abc', 'vf', 'grt']이되고 싶습니다. csv reader를 사용하여 어떻게 이것을 할 수 있습니까?

EDIT- 여러 파일이 있습니다. 각 파일은 다른 헤더를 가질 수 있으며 열의 수가 너무 다양합니다. 모든 파일에서 작동하는 스크립트를 갖고 싶습니다. 또한 첫 번째 열의 머리글은 항상 동일하며 예를 들어 "sample_column"입니다. 머리글 "sample_column"이있는 열의 데이터를 건너 뛰고 싶습니다.

+0

키워드는 항상'data' 될 것인가? – BorrajaX

+0

@BorrajaX 아니오. 내용은 다양합니다. – abn

+0

정규 표현식을 사용하여 셀의'keyword' 청크를 제거 할 수 있습니까? – BorrajaX

답변

0

확인을 data (또는 키워드 중) 질문 만 MEH의 범위는 정말하지 않은 (정규 표현식와 함께 할 수 ...) 정규 표현식에 대해

:

가의 키워드는 바로, data 상상하자? 당신은 사용할 수 있습니다이 : 키워드 뭔가 다른라면, 당신은 ... keyword에 포함 된 다른 어떤 값에 그 정규 표현식에 두 data 문자열을 변경할 수 있습니다

당신은 www.pythonregex.com 또는 www.debuggex.com

온라인 정규 표현식을 테스트 할 수 있습니다 (?:data)*\W*(?P<juicy_data>\w+)\W*(?:data)*

정규 표현식은 기본적으로 다음과 같이 말합니다. data 문자열을 찾으십시오.하지만 찾을 수 있으면 아무 것도하지 마십시오. 일치하는 그룹 목록에 추가하지 말고 표시하지 말고 아무 것도하지 말고 일치 시키되 버립니다. 그 후 문자가 아닌 문자가 0 개 이상 있는지 확인하십시오. data : 또는 공백이있는 경우 또는 data--> ... \W은 모든 비 문자 문자를 제거합니다. 영숫자가 data 이후에 오는 경우) juicy_data "일반"단어 (영숫자)로 볼 수있는 하나 이상의 문자입니다. 그런 다음 data이있는 경우 첫 번째 data 그룹과 동일한 작업을 수행합니다. 일치시키고 제거하십시오.

이제 첫 번째 열을 제거하려면 csv.reader 그 자체가 반복자라는 사실을 사용할 수 있습니다. 이 코드를 반복 할 때 (아래 코드와 같이) 한 행에있는 모든 열을 포함하는 목록을 제공합니다.모든 행 중 list을 제공한다는 사실은 매우 유용합니다. 먼저의 첫 번째 항목을 수집해야합니다. 관심있는 항목이므로 row[0]도 아니고 row[1:]도 필요하지 않습니다.

그래서 여기 간다 :

import csv 
import re 

def get_values_flexibly(csv_path, keyword): 
    def process(func): 
     return set([func(cell)] + [func(row[index]) for row in reader]) 
    # Start fo real! 
    kwd_remover = re.compile(
     r'(?:{kw})*\W*(?P<juicy_data>\w+)\W*(?:{kw})*'.format(kw=keyword) 
    ) 
    result = [] 
    with open(csv_path, 'r') as f: 
     reader = csv.reader(f) 
     first_row = [kwd_remover.findall(cell)[0] for cell in reader.next()] 
     print "Cleaned first_row: %s" % first_row 
     for index, row in enumerate(reader): 
      print "Before cleaning: %s" % row 
      cleaned_row = [kwd_remover.findall(cell)[0] for cell in row] 
      result.append(cleaned_row[1]) 
      print "After cleaning: %s" % cleaned_row 
    return result 

print "Result: %s" % get_values_flexibly("sample.csv", 'data') 

출력을 :

Cleaned first_row: ['h1', 'h2', 'h3'] 
Before cleaning: ['a data', 'data: abc', 'tr'] 
After cleaning: ['a', 'abc', 'tr'] 
Before cleaning: ['b data', 'vf data', ' gh'] 
After cleaning: ['b', 'vf', 'gh'] 
Before cleaning: ['k data', 'grt data', ' ph'] 
After cleaning: ['k', 'grt', 'ph'] 
Result: ['abc', 'vf', 'grt'] 
+0

코드와 설명 모두에 감사드립니다. – abn

+0

예! * 선택된 답변 *을 고려해 주셔서 감사합니다. 코드에 대해 궁금한 점이 있으면 알려주십시오. 몇 가지 설명을 추가하기 위해 답을 편집 할 수 있습니다. 그러면 미래에이 답변을 찾는 다른 사람에게 도움이 될 수 있습니다 (질문이있는 경우 다른 사람도 해당 답변을받을 수 있습니다) – BorrajaX

1

당신은 DICT 리더 사용할 수 있습니다 그래서 제거,

data = {'h1':[], 'h2':[], 'h3':[]} 

h = ['h1', 'h2', 'h3'] 
csvfile = open(dir) 
reader = DictReader(csvfile) 
for line in reader: 
    data['h1'].append(line[h[0]][2:]) 
    data['h2'].append(line[h[1]][2:]) # Use indexing to get the bits you want 
    data['h3'].append(line[h[2]]) 
+0

답변 해 주셔서 감사합니다. 내 잘못이야. 나는 질문을 제대로하지 않았다. 파일이 여러 개 있고 각 파일마다 다른 헤더가있을 수 있으며 열의 수가 너무 다를 수 있습니다. 모든 파일에서 작동하는 스크립트를 갖고 싶습니다. – abn

+0

첫 번째 행을 사용하여 데이터 딕셔너리를 만든 다음 데이터를 추가하면 문제가 더 간단해질 수 있습니다. – kezzos

관련 문제