2013-02-09 103 views
12

我试图运行在Python下面的代码,并正在错误:Python的CSV错误:序列预计

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 2013-02-09 02:33:59

+1

'else:pass'在你的代码中什么也不做。你是否想要做别的事情? – 2013-02-09 02:37:18

+0

它应该跳过打开的文件中的当前行并转到下一行。我想这是我将要遇到的下一个问题! – 2013-02-09 02:41:09

回答

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

对不起 - 修复了程序代码我的程序的最初部分。意外地没有复制第一次。 – 2013-02-09 02:48:28

+0

是的,这应该是在循环之外...非常感谢,因为注意到这一点。 – 2013-02-09 02:50:48

+0

我正在尝试在同一行中写入STID,T,RH和Times,但在csv文件中分隔列。该代码不应该为此工作? – 2013-02-09 02:51:23

14

writer.writerow需要一个值的序列(一个元组或列表)写入一行,每行中有一个值写入该行。你给它的是一个单一的值。你的代码真的应该更像:

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我明白了!这使得更多的意义。整个“作家”部分让我不知所措,因为我正在等待打开csv文件,并且每行只有一个数据集。这是完全合理的。非常感谢。 – 2013-02-09 02:55:06

1

好吧,试着想想Python的希望当您尝试使用“writeROW”方法:) 只输入一个值将无法正常工作,因为每个值将在不同的行,这可能不是你想要做的。相反,您可能会得到所有在某个集合中彼此相关的值。

例如:华盛顿火车站16:35的温度为26℃,湿度为85%。这将表示为:[“华盛顿”,“16:35”,26,85]。

+0

非常感谢你的解释。我找不到任何其他的.write方法,它只会为每列执行一个数据字段并从列移动到列。你在.writerow上的解释清楚了这一点。我假设您的建议格式,而不是实际的单词和数字,我会使用参考变量? – 2013-02-09 02:57:06