2011-08-03 11 views
1

テキストファイルから次のデータを読む必要があります。Pythonでマルチティア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

Whoaありがとう! 私はコード全体を期待していません!私が必要とするのは、出力をフォーマットすることだけです。 もう一度ありがとうございます。 –

+0

TaggedLineはnamedtuple: 'TaggedLine = namedtuple(" TaggedLine "、" line tag ")'を使ってより簡単に宣言できます。 'str'から継承したものがあなたを買うかどうかは分かりません。 – PaulMcG

+0

strから継承するということは、タグ付きの行が文字列として使用できることを意味します。したがって、元の行(または一連の行)と同じように扱うことができます。 namedtupleを使用した場合、シーケンスを処理するコードは、文字列ではなくタプルを取得し、それに応じて処理することを知る必要があります。この特定の例では、タプルはうまくいきましたが、 'sections'は行のストリームを取り、行のストリームを生成するので、再利用可能です。 –

1

numpyがある場合は、ファイルを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

ありがとう!私はすぐに裸をチェックします。 –

関連する問題