2011-08-03 4 views
1

텍스트 파일에서 다음 데이터를 읽어야합니다.파이썬에서 다중 계층 CSV 파일을 읽으십시오.

[L02] 
g,g,g,g,g,g,g,g,g,g,w,w,w,w,g,g 
g,g,g,g,g,g,g,g,g,w,w,w,w,w,g,g 
g,g,g,g,g,g,g,g,w,w,w,w,w,g,g,g 
g,g,g,g,g,g,g,g,w,w,w,w,g,g,g,g 
g,g,g,g,g,g,g,g,g,w,w,w,w,g,g,g 
g,g,g,g,g,g,g,g,g,g,w,w,w,w,g,g 
g,g,g,g,g,g,g,g,g,g,g,w,w,w,g,g 
g,g,g,g,g,g,g,g,g,g,g,w,w,g,g,g 
g,g,g,g,g,g,g,g,g,g,g,w,w,g,g,g 
g,g,g,g,g,g,g,g,g,g,w,w,w,g,g,g 
g,g,g,g,g,g,g,g,g,w,w,w,g,g,g,g 
g,g,g,g,g,g,g,g,w,w,w,w,g,g,g,g 
g,g,g,g,g,g,g,w,w,w,w,g,g,g,g,g 
g,g,g,g,g,g,g,w,w,w,g,g,g,g,g,g 
g,g,g,g,g,g,w,w,w,w,w,g,g,g,g,g 
g,g,g,g,g,g,g,w,w,w,w,g,g,g,g,g 
[L01] 
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d 
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d 
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d 
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d 
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d 
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d 
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d 
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d 
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d 
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d 
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d 
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d 
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d 
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d 
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d 
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d 

내가 CSV 파일로 단일 블록을 읽을 수 있지만 별도의 목록으로 각 파일을 읽는 방법을 모르는

내가 원하는 출력은 각 블록에 대한 배열/목록을 가지고있다 블록 내용을 목록 요소로. 어떤 아이디어?

답변

3

다음은 문제를 재사용 가능한 단계 (기능)로 분해하고 필요한 변환을 수행하는 방법을 보여주는 스크립트입니다.

import itertools 
import operator 
import re 
import csv 
import pprint 

class TaggedLine(str): 
    """ 
    Override str to allow a tag to be added. 
    """ 
    def __new__(cls, val, tag): 
     return str.__new__(cls, val) 

    def __init__(self, val, tag): 
     super(TaggedLine, self).__init__(val) 
     self.tag = tag 

def sections(stream): 
    """ 
    Tag each line of the stream with its [section] (or None) 
    """ 
    section_pattern = re.compile('\[(.*)\]') 
    section = None 
    for line in stream: 
     matcher = section_pattern.match(line) 
     if matcher: 
      section = matcher.group(1) 
      continue 
     yield TaggedLine(line, section) 

def splitter(stream): 
    """ 
    Group each stream into sections 
    """ 
    return itertools.groupby(sections(stream), operator.attrgetter('tag')) 

def parsed_sections(stream): 
    for section, lines in splitter(stream): 
     yield section, list(csv.reader(lines)) 

if __name__ == '__main__': 
    with open('data.csv') as stream: 
     for section, data in parsed_sections(stream): 
      print 'section', section 
      pprint.pprint(data[:2]) 

'data.csv'이 출력 데이터에 실행되는 스크립트로 파일 저장 :

section L02 
[['g', 
    'g', 
    'g', 
    'g', 
    'g', 
    'g', 
    'g', 
    'g', 
    'g', 
    'g', 
    'w', 
    'w', 
    'w', 
    'w', 
    'g', 
    'g'], 
['g', 
    'g', 
    'g', 
    'g', 
    'g', 
    'g', 
    'g', 
    'g', 
    'g', 
    'w', 
    'w', 
    'w', 
    'w', 
    'w', 
    'g', 
    'g']] 
section L01 
[['d', 
    'd', 
    'd', 
    'd', 
    'd', 
    'd', 
    'd', 
    'd', 
    'd', 
    'd', 
    'd', 
    'd', 
    'd', 
    'd', 
    'd', 
    'd'], 
['d', 
    'd', 
    'd', 
    'd', 
    'd', 
    'd', 
    'd', 
    'd', 
    'd', 
    'd', 
    'd', 
    'd', 
    'd', 
    'd', 
    'd', 
    'd']] 
+0

와우 고마워! 나는 전체 코드를 기대하지 않는다! 내가해야 할 것은 출력 형식을 지정하는 것입니다. 다시 한번 감사드립니다. –

+0

TaggedLine은 namedtuple :'TaggedLine = namedtuple ("TaggedLine", "line tag")'을 사용하여보다 간단하게 선언 할 수 있습니다. 'str'에서 상속 한 것이 당신을 사는지 확실하지 않습니다. – PaulMcG

+0

str에서 상속한다는 것은 태그가 지정된 행을 여전히 문자열로 사용할 수 있음을 의미하므로 원래 행 (또는 일련의 행)처럼 취급 할 수 있습니다. namedtuple을 사용했다면 시퀀스를 처리하는 코드는 문자열이 아닌 튜플을 얻고 그에 따라 처리한다는 것을 알아야합니다. 이 특별한 예제에서, 튜플은 잘 작동했을 것입니다. 그러나'sections'은 라인 스트림을 생성하고 라인 스트림을 생성하기 때문에 더 재사용 할 수 있습니다. –

1

numpy 사용자는 파일을 수십 개의 배열로 읽을 수 있습니다. comments='['np.genfromtxt[으로 시작하는 줄을 무시하도록 지시합니다. reshape 메서드는 각 16x16 블록을 자체 "레이어"에 배치합니다.

import numpy as np 
arr=np.genfromtxt('data.csv',comments='[',delimiter=',',dtype=None) 
arr=arr.reshape(-1,16,16) 

arr[n]으로 n 번째 레이어에 액세스 할 수 있습니다.

+0

감사합니다! 나는 즉시 비구니를 조사 할 것이다. –

관련 문제