2013-02-09 64 views
12

Tôi đang cố gắng để chạy các đoạn mã sau trong Python, và đang nhận được lỗi:Python CSV Lỗi: chuỗi dự kiến ​​

csv.Error: sequence expected 

Có ai có bất kỳ ý tưởng gì là sai với mã của tôi? (Tệp đã được nhập trước đó vào chương trình).

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() 

Các lỗi đi lên như:

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

Vui lòng đăng thông báo lỗi đầy đủ với truy xuất đầy đủ. – BrenBarn

+1

'else: pass' không có gì trong mã của bạn. Ý bạn là nó làm điều gì đó khác? –

+0

Đó là nghĩa vụ phải bỏ qua dòng hiện tại trong tập tin mở và đi đến dòng tiếp theo. Tôi đoán đó là vấn đề tiếp theo tôi sẽ gặp phải! –

Trả lời

2

Ngay bây giờ có vẻ như bạn đang cố gắng viết chỉ là một chuỗi

writer.writerow(variables) 

sẽ viết toàn bộ hàng

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

kiểm tra danh sách biến

[tmp_STID, tmp_T, tmp_RH, tmp_Time] 

cũng có vẻ như bạn đang mở một tệp csv mới cho mỗi lần lặp? Nên ra khỏi vòng lặp?

+0

Xin lỗi về điều đó - đã sửa mã chương trình để bao gồm phần đầu tiên của chương trình của tôi. Vô tình không sao chép điều đó lần đầu tiên. –

+0

Có điều đó nên được ra khỏi vòng lặp ... cảm ơn rất nhiều để nhận thấy rằng là tốt. –

+0

Tôi đang cố gắng viết STID, T, RH và Times trong cùng một hàng nhưng các cột riêng biệt trong tệp csv. Mã đó có hiệu quả không? –

14

writer.writerow dự kiến ​​một chuỗi (một bộ hoặc danh sách) các giá trị để viết trong một hàng, với một giá trị cho mỗi cột trong hàng đó. Những gì bạn đã cho nó thay vào đó là một giá trị duy nhất. Mã của bạn thực sự trông giống như sau:

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

và có vẻ như hầu hết mã này phải ở vòng lặp lớn, chạy một lần trên mỗi trạm (và do đó một lần mỗi hàng).


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 Tôi hiểu rồi !! Điều đó có lý hơn. Toàn bộ phần 'writerow' đã ném tôi đi trong đó tôi đã chờ đợi để mở tập tin csv và chỉ có một tập dữ liệu mỗi hàng. Điều này có ý nghĩa hoàn toàn. Cảm ơn bạn rất nhiều. –

1

Vâng, hãy cố gắng suy nghĩ về những gì Python mong đợi khi bạn cố gắng sử dụng phương pháp "writeROW" :) Việc chỉ nhập một giá trị sẽ không làm việc, vì mỗi giá trị sẽ được ở một dãy ghế khác , có lẽ không phải là những gì bạn đang cố gắng làm. Thay vào đó, bạn có thể nhận được tất cả các giá trị bằng cách nào đó liên quan đến nhau trong một bộ.

Ví dụ: Temprature là 26C vào 16:35 tại nhà ga Washington, với độ ẩm 85%. Điều này sẽ được thể hiện như sau: ["Washington", "16:35", 26, 85].

+0

Cảm ơn bạn rất nhiều vì lời giải thích đó. Tôi không thể tìm thấy bất kỳ phương pháp .write khác sẽ chỉ làm một trường dữ liệu cho mỗi cột và di chuyển từ cột này sang cột khác. Lời giải thích của bạn trên .writerow xóa nó đi. Tôi giả sử với định dạng được đề xuất của bạn thay vì các từ và số thực tế, tôi sẽ sử dụng các biến tham chiếu? –

Các vấn đề liên quan