2014-11-20 5 views
0

다음 코드를 사용하여 헤더를 기반으로 컬럼을 호출했습니다.헤더가있는 csv 파일에서 데이터 호출하기 Python

def GetValuesFromColumn(title): 

    values = [] 
    rownum = 0 
    with open(file, 'r') as f: 
    reader = csv.reader(f) 
    for row in reader: 
     if rownum == 0: 
     index = row.index(title) 
     rownum = 1 
     else: 
     values.append(row[index]) 

    return values 

괜찮습니다. 그러나 나는 현재 같은 헤더를 가진 하나 이상의 행이있을 수있는 파일에 대해 작업하고 있으며 스크립트는 첫 번째 열만을 제공합니다. 대신 특정 단어가 있는지 확인하여 열을 호출하고 싶습니다. 예를 들어 '데이터'라는 이름의 열이 3 개 있다고 가정합니다. 첫 번째 데이터 열이 나는이 형식의 첫 번째 데이터 열에서 데이터를 '조직'전화를받을 수 있도록하고 싶습니다 다음

data,data,data 
ab tissue, cell: b cells, organism: human 
bc gf tissue, cell: d cells, organism: human 
bc gf tissue, cell: e cells, organism: human 

아래 같은 생물에 대한 세 번째 조직에 대한 정보, 세포에 대한 두 번째,이 - ab,bc gf . 어떻게해야합니까?

+0

첫 번째 데이터 열에 조직에 대한 정보가 있음을 알기 위해 코드에서 사용하는 규칙은 무엇입니까? 유일한 대답은 "데이터를 읽고 인간이하는 방식을 이해하고 추측해야합니다"라고 말하면 코드 작성이 매우 어려울 것입니다. – abarnert

+0

@abarnert 열에 조직에 관한 데이터가있는 경우 즉, '조직'이라는 단어가있는 경우이를 추출하여 변수 '조직'또는 기타 항목에 할당하면됩니다. 그러나 변수 '조직'은 실제 단어 '조직'을 가져서는 안되지만 조직 이름 (예 : 위의 예에서 ab, bc 등)을 가져야합니다. – abn

+0

줄을 읽고 첫 번째 열을 가져 오거나, 또는'split (',')'을 사용하여. 그런 다음 'tissue'라는 단어가 인덱스 0에있는 문자열에 있는지 확인하고, 그렇다면 공백을 기반으로 문자열을 다시 분할 한 후 인쇄하십시오. 'value = 'ab tissue'라고하면'value.split ('') [0]' – T90

답변

1

허용하려는 제목/키워드를 식별 할 수있는 정확한 방법 집합에 따라 달라집니다. 예를 들어 'value keyword'와 'keyword : value'형식의 사례를 식별하려면 다음을 수행 할 수 있습니다 (열의 맨 위에있는 제목과 상관 없음). 만약 값의 특정 유형은 항상 처음 매칭 헤더 데이터의 첫 번째 행을 검사하는 기능을 쓸 수있는 동일한 열에 것이다 안다면

def get_values_flexibly(file, keyword): 
    values = [] 
    with open(file, 'r') as f: 
     reader = csv.reader(f) 
     for row in reader: 
      for cell in row: 
       if cell.endswith(' ' + keyword): 
        values.append(cell[:-len(keyword) - 1]) 
       elif cell.split(':')[0].strip() == keyword: 
        values.append(cell.split(':')[1].strip()) 
    return values 

print get_values_flexibly(file, 'tissue') # ['ab', 'bc gf', 'bc gf'] 
print get_values_flexibly(file, 'organism') # ['human', 'human', 'human'] 

선택적으로, 다음에 대한 두 번째 행을 검사 형식은 '값 키워드'또는에서 키워드를 일치하는 '키워드 : 값'

def get_values_flexibly(file, keyword): 
    def process(func): 
     return [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 [row[first_row.index(keyword)] for row in reader] 
     for index, cell in enumerate(reader.next()): 
      if cell.endswith(' ' + keyword): 
       return process(lambda cell: cell[:-len(keyword) - 1]) 
      elif cell.split(':')[0].strip() == keyword: 
       return process(lambda cell: cell.split(':')[1].strip()) 
+0

감사합니다. 더 큰 세트에서 이것을 시도하고 알려 드리겠습니다. – abn

0

f.readline()을 시도한 다음 문자열의 split 메소드를 사용하여 다른 섹션의 목록을 반환 할 수 있습니까? 너가 선을 다 떨어질 때, 너는 파일을 읽는 중지 할 수 있었다. 따라서 :

def GetValuesFromColumn(title): 
    values = list() 
    with (pen(file, 'r') as f: 
     line = ' ' 
     while line != '': 
      line = f.readline() 
      values.append(line.split(',')) 
    return values 

이 시점에서 목록의 목록을 살펴 본다면 조직 데이터를 찾을 수 있습니다. 그러나 귀하의 질문을 완전히 오해했을 가능성이 있습니다. 그렇다면 용서해주십시오.

1

당신이 요청했습니다 무엇인가

가 열이 조직에 대한 데이터가있는 경우, 인 할 필요가 모든 , 즉, 단어 '조직' , 추출한 다음 변수 '조직'또는 다른 것에 할당하십시오.

좋아, 마지막 부분을 잊어 버리자. 변수 이름이 데이터와 관련이있는 변수에 할당하고 싶지는 않습니다. 반환하려는 values 목록에 추가하기 만하면됩니다.

어쨌든이 규칙은 매우 간단합니다. 제게 아주 좋은 규칙처럼 보이지 않습니다. 'tissue'에 대한 후행 공백으로 'ab '을 제공 할 것이며, 을 부여하면 'cell'의 경우 더욱 악화 될 것입니다. 그러나 그것은 당신이 생각해 낸 규칙이므로, 구현하십시오.

먼저, 호출자가 특수 "데이터"열을 요구하는지 감지해야합니다. title이 헤더에 없기 때문에이 경우를 알 수 있습니다.단지 모든 데이터 열을 통과, 각 행에 대해, 지금

# ... 
if rownum == 0: 
    try: 
     index = row.index(title) 
    except ValueError: 
     indices = [i for i, col in index if col == 'data'] 
     return GetValuesFromDataColumn(title, indices, reader) 
    rownum = 1 
# ... 

: 우리가 볼 경우, 그냥 일반적인 논리의 나머지 부분에 펀트, 그리고 특별한 "데이터"열 논리에 다른 함수를 호출하자 (우리는 색인을 가지고 있습니다), 단어를 확인하고, 발견되면, 그것을 추출하고 나머지 문자열을 은닉합니다.

"단어 확인"을 수행하는 가장 간단한 방법은 str.find입니다. 존재하지 않으면 -1 또는 단어 시작의 색인을 반환합니다.

단어를 추출하고 나머지는 숨기려면 단어 전후에 열을 슬라이스합니다. 따라서 :

def GetValuesFromDataColumn(title, indices, reader): 
    values = [] 
    for row in reader: 
     for index in indices: 
      pos = row[index].find(title) 
      if pos != -1: 
       value = row[index][:pos] + row[index][pos+len(title):] 
       values.append(value) 
       break 
    return values 
관련 문제