2013-02-09 10 views
12

Ja próbuje uruchomić następujący kod w Pythonie, i otrzymuję błąd:Python CSV Błąd: sekwencja spodziewać

csv.Error: sequence expected 

Czy ktoś ma jakiś pomysł co jest nie tak z moim kodzie? (Plik został wcześniej zaimportowany do programu).

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

Błąd pojawia się jako:

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

Prosimy o przesłanie kompletnego komunikatu o błędzie z pełnym prześwitem. – BrenBarn

+1

'else: pass' nic nie robi w twoim kodzie. Miałeś na myśli to, aby zrobić coś innego? –

+0

Powinien pominąć bieżący wiersz w otwartym pliku i przejść do następnego wiersza. Sądzę, że to kolejny numer, na który miałem wpaść! –

Odpowiedz

2

w tej chwili wygląda na to, starają się pisać po prostu ciąg

writer.writerow(variables) 

zapisze cały rząd

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

sprawdź listę zmiennych

[tmp_STID, tmp_T, tmp_RH, tmp_Time] 

również wygląda na to, że otwierasz nowy plik CSV dla każdej iteracji? Czy to powinno wyjść z pętli?

+0

Przepraszam za to - poprawiono kod programu tak, aby zawierał początkowa część mojego programu. Przypadkowo nie skopiował tego po raz pierwszy. –

+0

Tak, to powinno być z pętli ... Dziękuję bardzo za zauważenie tego również. –

+0

Próbuję zapisać STID, T, RH i Times w tym samym wierszu, ale oddzielne kolumny w pliku csv. Czy ten kod nie powinien działać? –

14

writer.writerow oczekuje sekwencji (krotki lub listy) wartości do wpisania w jednym wierszu, z jedną wartością na kolumnę w tym wierszu. To, co podałeś, to pojedyncza wartość. Kod naprawdę powinien wyglądać bardziej jak:

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

i patrzy na mnie jak większość tego kodu powinny być w dużej pętli, czyli raz na stacji (a więc raz z rzędu).


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 Widzę! To sprawia, że ​​DUŻO ma więcej sensu. Cała część "writerow" wyrzucała mnie tym, że czekałem na otwarcie pliku csv i mam tylko jeden zestaw danych w rzędzie. To ma sens. Dziękuję bardzo. –

1

Cóż, staram się myśleć o tym, co Python spodziewać, gdy próbuje użyć „writeROW” metody :) Wprowadzanie tylko jedną wartość nie będzie działać, ponieważ każda wartość będzie w innym rzędzie , co prawdopodobnie nie jest tym, co próbujesz zrobić. Zamiast tego możesz uzyskać wszystkie wartości, które są w jakiś sposób powiązane ze sobą w jednym zestawie.

Na przykład: Temprature jest 26C na 16:35 na stacji kolejowej w Waszyngtonie, o wilgotności 85%. Będzie to reprezentowane jako: ["Waszyngton", "16:35", 26, 85].

+0

Dziękuję bardzo za to wyjaśnienie. Nie mogłem znaleźć żadnej innej metody .write, która wystarczyłaby do zrobienia jednego pola danych na kolumnę i przejścia od kolumny do kolumny. Twoje wyjaśnienie na .writerow usuwa to. Zakładam, że z sugerowanym formatem zamiast rzeczywistych słów i liczb użyłbym zmiennych referencyjnych? –