2015-10-25 16 views
9

Potrzebujesz pomocy. Mieć listę danych o nazwie arglist, przykład: ["dlink", "des", "1210", "c", 24] < - to, co "drukuje" widoki.Python TypeError: oczekiwany ciąg lub bufor

I ten kod:

sw_info ={"Brand":arglist[0], 
     "Model":arglist[1], 
     "Hardware":arglist[2], 
     "Software":arglist[3], 
     "Portsnum":arglist[4]} 


print json.dumps(sw_info, open("test", "w")) 
z = json.loads(open("test", "r")) 
print s 

Daje:

Traceback (most recent call last): 
    File "parsetest.py", line 34, in <module> 
    z = json.loads(open("test", "r")) 
    File "/usr/lib64/python2.6/site-packages/simplejson/__init__.py", line 307, in loads 
    return _default_decoder.decode(s) 
    File "/usr/lib64/python2.6/site-packages/simplejson/decoder.py", line 335, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
TypeError: expected string or buffer 

Co się stało?

+1

Próbujesz 'ładować' obiekt pliku, a nie ciąg znaków. Powinieneś po prostu użyć 'json.load' i' json.dump', jeśli chcesz pracować z plikami zamiast ciągów. – geoffspear

+2

Pierwszą zasadą debugowania jest założenie, że błąd mówi ci dosłowną prawdę. Oczekuje ciągu, ale go nie dajesz. Rozpocznij więc badanie od tego, dlaczego przekazujesz coś, co nie jest ciągiem znaków lub dlaczego używasz funkcji, która wymaga ciągu, gdy masz coś innego. –

+0

Masz rację. Tak oczywiste. Dzięki za pomoc. – Jetpylot

Odpowiedz

16

Próbujesz wczytać obiekt pliku, gdy json.loads spodziewa się ciągu znaków. Można użyć

z = json.loads(open("test", "r").read()) 

lub znacznie lepiej:

with open("test") as f: 
    z = json.load(f) 

W pierwszym przykładzie plik jest otwarty, ale nie zamknięte (złe praktyki). W drugim przykładzie menedżer kontekstu zamyka plik po opuszczeniu bloku kontekstowego.

+1

'.read()' jest tutaj ważne. Kompilacja 'open' zwraca obiekt pliku, a nie ciąg. – seth10

Powiązane problemy