2017-01-04 16 views
0

を解析するためにCSVファイルを読み込む:私は、このファイルのPythonコードを実行私はこれらのデータを含む.csvファイル持っている日付

equipement,"144444444" 
Date,"Time","measure" 
16/09/2016,"07:15:00","16.47777" 
16/09/2016,"07:30:00","15.44454" 
16/09/2016,"07:45:00","16.21114" 

を、私の目的は、出力として、このような何かを持っていることです。

ここで
"measure","20160916071500","16.47777" 
"measure","20160916073000","15.44454" 
"measure","20160916074500","16.21114" 

は私のコードです:

import csv 
import sys 
import os 
import re 
import fnmatch 
import csv 
from dateutil.parser import parse as parseDate 
from datetime import datetime, time, timedelta 


    file = open("myfile.csv", 'rt') 
    reader = csv.reader(file) 
    next(reader) 
    rows = list(reader) 
    firstline = rows[0] 
    header = firstline[2] 
    print header 
    for row in rows: 
     next(reader) 
     print rows[0] 
     if "".join(row).strip() != "": 
      chaine = str(row[0]+row[1]) 
      #print chaine 
      date = chaine[:10] + " " + chaine[11:] 
      #print date 
      index = parseDate(date) 
      index = str(index).replace('-','') 
      index = str(index).replace(':','') 
      index = str(index).replace(' ','') 
      data = row[2] 

私の問題は、私は次の(読者)を行うことを第一と第二をスキップする必要がある、ということです彼らは日付を含んでいないので、ファイル内の行。しかし、私はこのエラーが表示されます:

Traceback (most recent call last): File "t.py", line 19, in <module> next(reader) StopIteration 

いいですか?

+0

エラーがあるエラー – e4c5

+0

投稿していない: で、 ファイル "t.py"、19行目: 'トレースバック(最後の最新のコール) next(リーダー) StopIteration' – JavaQueen

+0

@ e4c5 done!ありがとう – JavaQueen

答えて

3

rows = list(reader)を実行すると、既にreaderが使い果たされ、rowsというリストに結果が収集されています。 next(reader)を再度実行すると、StopIterationが発生します。

rowsリストを作成する必要はありません。あなたは直接forループを使用してreaderを反復処理することができます。

reader = csv.reader(file) 
next(reader)    # skip first line 
secondline = next(reader) # capture second line 
header = secondline[2] 
for row in reader:   # iterate from third line to the end 
    # next(reader) <-- don't do this, the for loop already does it for you 
    if "".join(row).strip() != "": 
     # ... your code processing row ... 
+0

それは動作しませんでしたし、私は同じエラーが発生しました... – JavaQueen

+0

'rows = list(reader)'を削除してもよろしいですか? forループの中に 'next(reader) 'がないのは確かですか?あなたの入力ファイルに複数の行がありますか? – mkrieger1

+0

はい、私はこのコードが必要です: 'rows = list(reader) firstline = rows [0] header = firstline [2]'文字列 "measure"を含むヘッダを取得します。あなたのコードは動作しますが、私が望む結果を与えるわけではありません。 – JavaQueen

3

必要になります場合は、パンダとそれを解決することができます:

import pandas as pd 

df = pd.read_csv('in.csv', skiprows=2, header=None, parse_dates=[[0,1]]) 
df['dt']=df["0_1"].apply(lambda x: x.strftime('%Y%m%d%H%M%S')) 
df['mes'] = pd.Series(["measure"]*len(df), index=df.index) 
df[['mes','dt',2]].to_csv('out.csv', quoting=True, index=None,header=None) 

CSVファイル:

"measure","20160916071500","16.47777" 
"measure","20160916073000","15.44454" 
"measure","20160916074500","16.21114" 
0

あなたは同じを持つことができますがtwo for loopsとこの例のようないくつかの文字列の置換を使用して希望の出力(私はあなたの入力はin.csvと呼ばれると仮定します):

data = list(k.strip("\n") for k in open("in.csv", 'r')) 
mesure = data[1].split(",")[2] 
m = list(k.replace('"', "").split(",") for k in data[2:]) 

final, d =[], "" 
for k in m: 
    for j in k[:-1]: 
     if "/" in j: 
      d = '"%s' % "".join(j.split("/")[::-1]) 
     if ":" in j: 
      d += '%s"' % "".join(j.split(":")) 
    final.append(",".join([mesure, d,'"%s"' % k[-1:][0]])) 

for k in final: 
    print(k) 

出力:

"measure","20160916071500","16.47777" 
"measure","20160916073000","15.44454" 
"measure","20160916074500","16.21114" 
関連する問題