2016-08-28 14 views
-2

入力ファイル -Readブロックテキスト

#######A Result:######### 
2016-07-27 bar  51  14 
2015-06-27 roujri 30  86 
#######B Result:######### 
2016-08-26 foo  34  83 
2016-08-26 foo  34  83 
######################### 

出力結果

A result: 
    Col-1: 81 
    Col-2: 100 
B result: 
    Col-1: 68 
    Col-2: 166 

input.csv私は、上記の入力に応じて出力を一つの問題を解決しようとしています。これまでのところ、私は最初のブロックテキストだけを読むことができます。私はより一般的な関数にしたいので、ハードコーディング(例えば#######A Result:#########)ではなく、ブロック内で読み込む必要がある変数を初期化し、ブロック情報を別の関数に渡して値を合計します。どんな提案も大いに感謝します。正規表現の少しのおかげで:)

import re 
def reading_block_text_file(infile): 
    with open(infile) as fp: 
     for result in re.findall('#######A Result:#########(.*?)#######B Result:#########', fp.read(), re.S): 
      print result, 

reading_block_text_file(input_file) 
+1

入力ファイルがないことCSVのように見える私が... –

答えて

1

スロー:

$ cat a 
#######A Result:######### 
2016-07-27 bar  51  14 
2015-06-27 roujri 30  86 
#######B Result:######### 
2016-08-26 foo  34  83 
2016-08-26 foo  34  83 
######################### 
$ cat a.py 
import re 
col_names = ['abc', 'xyz'] 
with open("/tmp/a", "r") as f: 
    tables = re.findall(r'#+(\w+ Result:)#+([^#]*)', f.read(), re.S) 
    for table in tables: 
     name = table[0] 
     rows = table[1].strip().split('\n') 
     print name 
     for i in range(len(col_names)): 
      print "\t{}: {}".format(col_names[i], sum(map(lambda x: int(x.split()[i + 2]), rows))) 
$ python a.py 
A Result: 
    abc: 81 
    xyz: 100 
B Result: 
    abc: 68 
    xyz: 166 

正規表現の説明:

#+(\w+ Result:)#+([^#]*) 

Regular expression visualization

Debuggex Demo

+0

リストを定義した場合、どのようにして各リストの値を一度に取得するのですか?= ['aba'、 'xyz'、 'foo'、 'bar']上記のソリューションをありがとうございます。 – Roujri

+0

@Roujri例を示します。これらの言葉は何を表していますか? –

+0

言葉は事前定義テキストリストから取得されている - 単語= [ 'ABA'、 'XYZ'、 'foo' で、 'バー'] 結果: ABA:81 XYZ:100 Bの結果: ABA:68 XYZ -2:166 – Roujri