2016-11-21 18 views
1

私はPythonと一般的なコーディングにはかなり新しくなっていますので、事前にご容赦ください。私のプログラムは、既存のログファイルをキーワード「MYLOG」に基づいていくつかの* .csvファイル(run1、.csv、run2.csv、...)に分割する必要があります。キーワードが表示されたら、キーワードが再び表示されるまで、2つの希望する列を新しいファイルにコピーし始めます。終了したら、キーワードと同じ数のCSVファイルを作成する必要があります。ログファイルをPythonで複数のcsvファイルに分割するには


53.2436  EXP  MYLOG: START RUN specs/run03_block_order.csv 
53.2589  EXP  TextStim: autoDraw = None 
53.2589  EXP  TextStim: autoDraw = None 
55.2257  DATA Keypress: t 
57.2412  DATA Keypress: t 
59.2406  DATA Keypress: t 
61.2400  DATA Keypress: t 
63.2393  DATA Keypress: t 
... 
89.2314  EXP  MYLOG: START BLOCK scene [specs/run03_block01.csv] 
89.2336  EXP  Imported specs/run03_block01.csv as conditions 
89.2339  EXP  Created sequence: sequential, trialTypes=9 
... 

[EDIT]:次のようになります(* .CSV実行)ファイルあたりの出力は:

onset  type 
53.2436  EXP  
53.2589  EXP  
53.2589  EXP  
55.2257  DATA  
57.2412  DATA  
59.2406  DATA  
61.2400  DATA  
... 

プログラムは、*同じくらいの実行を作成します。必要に応じてcsvを使用しますが、私は新しいファイルに必要な列を保存できません。終了すると、空のCSVファイルがすべて取得されます。カウンタ変数を== 1に変更すると、目的の列を持つ1つの大きなファイルが作成されます。

もう一度おねがいします!

import csv 

QUERY = 'MYLOG' 

with open('localizer.log', 'rt') as log_input: 
i = 0 

for line in log_input: 

    if QUERY in line: 
     i = i + 1 

     with open('run' + str(i) + '.csv', 'w') as output: 
      reader = csv.reader(log_input, delimiter = ' ') 
      writer = csv.writer(output) 
      content_column_A = [0] 
      content_column_B = [1] 

      for row in reader: 
       content_A = list(row[j] for j in content_column_A) 
       content_B = list(row[k] for k in content_column_B) 
       writer.writerow(content_A) 
       writer.writerow(content_B) 
+0

新しいファイルのそれぞれの外観を説明してください。 –

+1

次の情報を提供すると便利です。1.予想される出力2.実際の出力または何がうまくいかない。また、 'counter'変数はこのコードには関係していないと思われます。 – Geekfish

答えて

1

コードを見てみると、おそらく間違っているいくつかあります:

  1. CSVリーダーは、ファイルハンドラではなく、単一のラインを取る必要があります。
  2. ログの実際の区切り文字が複数のスペース文字の可変数であるように、リーダ区切り文字は単一のスペース文字であってはなりません。
  3. ループロジックはビットオフで、ファイル/行/行を少し混乱させるようです。

あなたは(問題の保留中の明確化)以下のコードのようなものを見ていることがあります。

import csv 
NEW_LOG_DELIMITER = 'MYLOG' 

def write_buffer(_index, buffer): 
    """ 
    This function takes an index and a buffer. 
    The buffer is just an iterable of iterables (ex a list of lists) 
    Each buffer item is a row of values. 
    """ 
    filename = 'run{}.csv'.format(_index) 
    with open(filename, 'w') as output: 
     writer = csv.writer(output) 
     writer.writerow(['onset', 'type']) # adding the heading 
     writer.writerows(buffer) 

current_buffer = [] 
_index = 1 

with open('localizer.log', 'rt') as log_input: 
    for line in log_input: 
     # will deal ok with multi-space as long as 
     # you don't care about the last column 
     fields = line.split()[:2] 
     if not NEW_LOG_DELIMITER in line or not current_buffer: 
      # If it's the first line (the current_buffer is empty) 
      # or the line does NOT contain "MYLOG" then 
      # collect it until it's time to write it to file. 
      current_buffer.append(fields) 
     else: 
      write_buffer(_index, current_buffer) 
      _index += 1 
      current_buffer = [fields] # EDIT: fixed bug, new buffer should not be empty 
    if current_buffer: 
     # We are now out of the loop, 
     # if there's an unwritten buffer then write it to file. 
     write_buffer(_index, current_buffer) 
+0

あなたの素晴らしい仕事をありがとう!特に、あなたのコメントは、verry有用であることが判明しました。実行ファイルの1つをExcel(またはOpen Office)で開くと、すべてが1つの列に書き込まれ、入力はカンマで区切られます(たとえば、A1 =開始、タイプ、A2 =空白、A3 = 65.2421 、EXP、A4 =空白...)。 – STD

+1

私はopen関数でnewline = ''引数を追加することですべての空白セルを削除することができました。 – STD

+0

私の答えにバグがありました。私は修正にコメントを追加しました。 – Geekfish

0

あなたがこの問題を単純化するためにパンダを使用することができます。

pandasをインポートしてログファイルを読み込みます。

3列目== 'MYLOG'

df['flag'] = 0 
df.loc[df.event.str[:5] == 'MYLOG', 'flag'] = 1 
df.flag = df['flag'].cumsum() 

保存

import pandas as pd 

df = pd.read_fwf('localizer2.log', header=None) 
df.columns = ['onset', 'type', 'event'] 
df.set_index('onset', inplace=True) 

セットの旗各実行別々の実行* .csvファイルとして

for i in range(1, df.flag.max()+1): 
    df.loc[df.flag == i, 'event'].to_csv('run{0}.csv'.format(i)) 

EDIT: はあなたのように見えますフォーマットは当初想定していたものとは異なります。 pd.read_fwfを使用するように変更されました。私のlocalizer.logファイルは元のデータのコピー&ペーストでした。元の投稿ではヘッダーがないと仮定しました。ヘッダーがある場合は、header=Nonedf.columns = ['onset', 'type', 'event']を削除します。

+0

あなたの仕事のためにありがとうございます。あなたのコードを実行すると、次のエラーが発生しました:ファイル "C:[...]"、行3、 df = pd.read_csv( 'localizer.log')。set_index( 'onset')とFile "pandas \ pandas.parser.TextReader.read(pandas \ parser.c:8748) pandas.parser.TextReader._read_low_memory(pandas \ parser)のファイル "pandas \ parser.pyx"、行827 .c:9003) – STD

+0

ファイル形式の問題のようです。編集中のように 'pd.read_fwf'を使ってみてください。 –

+1

Waylonありがとうございました。今はうまくいきます! – STD

関連する問題