2013-02-09 44 views
12

予想:PythonのCSVエラー:シーケンスは、私はPythonで次のコードを実行しようとしていて、エラーを取得しています

csv.Error: sequence expected 

誰もが私のコードで何が間違っている任意のアイデアを持っていますか? (ファイルは以前にプログラムにインポートされていました)。

import csv 
file = open('/home/btoms/Desktop/TomsBen/2000/01/01/20000101acme.mts', 'r') 

variables = [] 

file.readline() #Skip a line 
file.readline() 
file.readline() #Skip another line 

for line in file: 
    tmp = line.split() 
    tmp_STID = str(tmp[0]) 
    tmp_T = float(tmp[4]) 
    tmp_RH = float(tmp[3]) 
    tmp_Times = float(tmp[2]) 
    variables.append(tmp_STID) 
    variables.append(tmp_Times) 
    variables.append(tmp_T) 
    variables.append(tmp_RH) 


    if tmp_T < 6.2 and tmp_RH > 60.0: 
    dataCSV = open('ProgramCheck.csv', 'w') 
    writer = csv.writer(dataCSV, dialect='excel') 
    writer.writerow(['Station ID', 'Time', 'Temperature' , 'Relative Humidity']) 

    for values in variables: 
     writer.writerow(values) 
    else: 
      pass 
    file.close() 

エラーがとして起動します:今、あなただけの文字列に書き込もうとしているように見える

Traceback (most recent call last): 
     File "checkcsv.py", line 30, in <module> 
     writer.writerow(values) 
    _csv.Error: sequence expected 
+1

フルトレースバックで完全なエラーメッセージを投稿してください。 – BrenBarn

+1

'else:pass'はあなたのコードに何もしません。他に何かすることを意味しましたか? –

+0

開いているファイルの現在の行をスキップして次の行に移動することになっています。私はこれが次の問題であると思います。 –

答えて

2

writer.writerow(variables) 

行全体を書き込みます

tmp_STID = str(tmp[0]) 
    tmp_T = float(tmp[4])  
    tmp_RH = float(tmp[3]) 
    tmp_Times = float(tmp[2]) 

変数リストを検査する

[tmp_STID, tmp_T, tmp_RH, tmp_Time] 

また、繰り返しごとに新しいcsvファイルを開くようですか?それはループから外れるべきですか?

+0

残念です - 私のプログラムの最初の部分です。誤って初めてコピーしたわけではありません。 –

+0

はい、それはループから外れるべきです...それに気づいてくれてありがとう。 –

+0

私はSTID、T、RH、およびTimesを同じ行に書き込もうとしていますが、csvファイルの列は別々です。そのコードはそれのために働くべきではありませんか? –

14

writer.writerowは、値のシーケンス(タプルまたはリスト)を1行に書き込むことを想定しています。その値は1行の値です。代わりにそれに与えたものは、単一の値です。あなたのコードは本当に多くのようになります。

writer.writerow([tmp_STID, tmp_Times, tmp_T, tmp_RH]) 

と、このコードのほとんどは(行ごとに一度これと)駅ごとに一度実行し、大きなループにする必要がありますようにそれは私には見えます。まあ


dataCSV = open('ProgramCheck.csv', 'w') 
writer = csv.writer(dataCSV, dialect='excel') 
writer.writerow(['Station ID', 'Time', 'Temperature' , 'Relative Humidity']) 

for line in inputData: 
    tmp = line.split() 

    tmp_STID = str(tmp[0]) 
    tmp_T = float(tmp[4]) 
    tmp_RH = float(tmp[3]) 
    tmp_Times = float(tmp[2]) 

    if tmp_T < 6.2 and tmp_RH > 60.0: 
     writer.writerow([tmp_STID, tmp_Times, tmp_T, tmp_RH]) 

file.close() 
+0

Ahhhh参照してください!それはもっと意味をなさない。全体の 'writerow'部分は、私がcsvファイルを開き、1行につき1つのデータセットしか持たないのを待っていることで私を捨てていました。これは完全に意味をなさない。どうもありがとうございます。 –

1

、すべての値が異なる行になりますので、あなたが「のwriterow」方法:) はただ一つの値が動作しません入力し、使用しようとすると、Pythonが期待するものについて考えてみてくださいおそらくあなたがしようとしているものではありません。代わりに、どういうわけか、お互いに関連しているすべての値を1つのセットで得ることができます。

たとえば、温度はワシントンの駅で16:35、湿度85%で26℃です。これは、["Washington"、 "16:35"、26、85]と表されます。

+0

その説明をありがとうございました。私は列ごとに1つのデータフィールドを行い、列から列に移動する他の.writeメソッドを見つけることができませんでした。 .writerowに関するあなたの説明はそれをクリアする。実際の言葉や数字の代わりに参照変数を使用するというあなたの提案された形式を仮定していますか? –

関連する問題