2016-10-25 12 views
1

私は解析して.csvに再フォーマットしようとしているテキストファイルを持っています。テキストファイルは、2Hzごとに繰り返しステータスメッセージとして作成され、さまざまな値を出力します。すべてのメッセージにはヘッダー '-----------'、改行文字 '/ n'、フッター ''があります。繰り返しメッセージを解析するための最高のPythonのアプローチ

これを行う最善の方法は、一度に1つの「メッセージ」を読み込み、出力ファイルを更新できることです。私はPython(Python 3.5を使用しています)には新しく、私はすべてのC++スタイルになっていると思います。

入力データは次のようになります。

----------- 
2016-10-10T14:03:38,158000277+0000 
14:03:38 up 1 min, 2 users, load average: 0.58, 0.13, 0.04 
acpitz-virtual-0 
Adapter: Virtual device 
temp1:  +27.8°C (crit = +110.0°C) 
temp2:  +29.8°C (crit = +110.0°C) 

coretemp-isa-0000 
Adapter: ISA adapter 
Physical id 0: +44.0°C (high = +105.0°C, crit = +105.0°C) 
Core 0:   +44.0°C (high = +105.0°C, crit = +105.0°C) 
Core 1:   +44.0°C (high = +105.0°C, crit = +105.0°C) 

nct6776-isa-0a00 
Adapter: ISA adapter 
Vcore:     +1.79 V (min = +0.00 V, max = +1.74 V) ALARM 
in1:     +1.35 V (min = +0.00 V, max = +0.00 V) ALARM 
AVCC:     +3.33 V (min = +2.98 V, max = +3.63 V) 
+3.3V:     +3.33 V (min = +2.98 V, max = +3.63 V) 
in4:     +1.00 V (min = +0.00 V, max = +0.00 V) ALARM 
in5:     +0.00 V (min = +0.00 V, max = +0.00 V) 
in6:     +0.27 V (min = +0.00 V, max = +0.00 V) ALARM 
3VSB:     +3.30 V (min = +2.98 V, max = +3.63 V) 
Vbat:     +3.20 V (min = +2.70 V, max = +3.63 V) 
fan1:      0 RPM (min = 0 RPM) 
fan2:      0 RPM (min = 0 RPM) 
SYSTIN:     +68.0°C (high = +0.0°C, hyst = +0.0°C) ALARM sensor = thermistor 
CPUTIN:     +22.5°C (high = +80.0°C, hyst = +75.0°C) sensor = CPU diode 
AUXTIN:     +28.5°C (high = +80.0°C, hyst = +75.0°C) sensor = CPU diode 
PCH_CHIP_CPU_MAX_TEMP: +26.0°C (high = +80.0°C, hyst = +75.0°C) 
PECI Agent 0:   +44.0°C (high = +80.0°C, hyst = +75.0°C) 
           (crit = +105.0°C) 
PCH_CHIP_TEMP:   +0.0°C 
PCH_CPU_TEMP:   +0.0°C 
intrusion0:   OK 
intrusion1:   OK 

私は等の温度、電圧、

、各メッセージの日付/時間のようなものを引き出したい。ここに私のスーパーです未Python的アプローチ(インデントをコピー&ペースト時に台無ししまったことに注意してください...それは、実際のコードで正しい):

with open('102_sensors.log', 'r') as readFile, open('output.txt','w') as writeFile: 
for line in readFile: 
    if line.startswith('2016'):    
     writeFile.write(line[:10] + ',' + line[11:-1] + ',') #date and time 
    if 'load average' in line: 
     writeFile.write(line[13:15] + ',' + line[-17:-1] + ',') #up-time and load avgs 
    if 'temp1' in line: 
     writeFile.write(line[15:19] + ',')    
    if 'temp2' in line: 
     writeFile.write(line[15:19] + ',')    
    if 'Physical id 0' in line: 
     writeFile.write(line[17:21] + ',') 
    if 'Core 0' in line: 
     writeFile.write(line[17:21] + ',') 
    if 'Core 1' in line: 
     writeFile.write(line[17:21] + ',') 
    if 'Vcore' in line: 
     writeFile.write(line[25:29] + ',') 
    if 'in1' in line: 
     writeFile.write(line[25:29] + ',') 
    if 'AVCC' in line: 
     writeFile.write(line[25:29] + ',') 
    if 'threeV' in line: 
     writeFile.write(line[25:29] + ',') 
    if 'in4' in line: 
     writeFile.write(line[25:29] + ',') 
    if 'in5' in line: 
     writeFile.write(line[25:29] + ',') 
    if 'in6' in line: 
     writeFile.write(line[25:29] + ',') 
    if 'threeVSB' in line: 
     writeFile.write(line[25:29] + ',') 
    if 'Vbat' in line: 
     writeFile.write(line[25:29] + ',') 
    if 'SYSTIN' in line: 
     writeFile.write(line[25:29] + ',') 
    if 'CPUTIN' in line: 
     writeFile.write(line[25:29] + ',') 
    if 'AUXTIN' in line: 
     writeFile.write(line[25:29] + ',') 
    if '-----------' in line: 
     writeFile.write('\n') 
     continue 
writeFile.close() 

答えて

0

使用reモジュールは、入力を解析します。 csvモジュールを使用して、出力を書き込みます。 reference manualの例とその例:

import csv 
with open('eggs.csv', 'w', newline='') as csvfile: 
    spamwriter = csv.writer(csvfile, delimiter=' ', 
          quotechar='|', quoting=csv.QUOTE_MINIMAL) 
    spamwriter.writerow(['Spam'] * 5 + ['Baked Beans']) 
    spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam']) 
+0

reモジュールは私が書いたものよりもどのように優れていますか?それは速いですか?読みやすい? – drone007

関連する問題