TypeError: è richiesto un oggetto simile a byte, non 'str' in Python e CSV


173

TypeError: è richiesto un oggetto simile a byte, non 'str'

ottenere l'errore sopra durante l'esecuzione sotto il codice python per salvare i dati della tabella HTML nel file CSV. non so come ottenere rideup.pls aiutarmi.

import csv
import requests
from bs4 import BeautifulSoup

url='http://www.mapsofindia.com/districts-india/'
response=requests.get(url)
html=response.content

soup=BeautifulSoup(html,'html.parser')
table=soup.find('table', attrs={'class':'tableizer-table'})
list_of_rows=[]
for row in table.findAll('tr')[1:]:
    list_of_cells=[]
    for cell in row.findAll('td'):
        list_of_cells.append(cell.text)
    list_of_rows.append(list_of_cells)
outfile=open('./immates.csv','wb')
writer=csv.writer(outfile)
writer.writerow(["SNo", "States", "Dist", "Population"])
writer.writerows(list_of_rows)

sopra l'ultima riga.



ciao - ho provato a eseguirlo sul mio ATOM su MX-Linux - ma torno indietro: ´Traceback (ultima chiamata più recente): File "/home/martin/.atom/python/examples/bs_gumtree_pl.py", linea 20, in <modulo> writer.writerows (list_of_rows) UnicodeEncodeError: il codec 'ascii' non può codificare il carattere u '\ xa0' in posizione 0: ordinale non nel range (128) [Terminato in 2.015s] ´ beh, mi chiedo cosa continua qui!? mi piace sentirti
— zero il

Risposte:


332

Stai usando la metodologia Python 2 invece di Python 3.

Modificare:

outfile=open('./immates.csv','wb')

Per:

outfile=open('./immates.csv','w')

e otterrai un file con il seguente output:

SNo,States,Dist,Population
1,Andhra Pradesh,13,49378776
2,Arunachal Pradesh,16,1382611
3,Assam,27,31169272
4,Bihar,38,103804637
5,Chhattisgarh,19,25540196
6,Goa,2,1457723
7,Gujarat,26,60383628
.....

In Python 3 csv accetta l'input in modalità testo, mentre in Python 2 lo prende in modalità binaria.

Modificato per aggiungere

Ecco il codice che ho eseguito:

url='http://www.mapsofindia.com/districts-india/'
html = urllib.request.urlopen(url).read()
soup = BeautifulSoup(html)
table=soup.find('table', attrs={'class':'tableizer-table'})
list_of_rows=[]
for row in table.findAll('tr')[1:]:
    list_of_cells=[]
    for cell in row.findAll('td'):
        list_of_cells.append(cell.text)
    list_of_rows.append(list_of_cells)
outfile = open('./immates.csv','w')
writer=csv.writer(outfile)
writer.writerow(['SNo', 'States', 'Dist', 'Population'])
writer.writerows(list_of_rows)

20
Per l'uso con il csvmodulo, Python 3 opendovrebbe anche avere newline=''come parametro [ref ]
— Mark Tolonen,

1
Cambia la stringa 'wb' in 'w' funziona per me. Grazie mille
— Loc Huynh,

Se stai usando un buffer, vedi la risposta di vinyll !
— handras

ciao lì - ho provato il codice - e ho ottenuto questo: `Traceback (ultima chiamata più recente): File" /home/martin/.atom/python/examples/bs_gumtree_pl.py ", linea 20, in <module> UnicodeEncodeError : il codec 'ascii' non può codificare il carattere u '\ xa0' in posizione 0: ordinale non nel range (128) [finito in 1.415s] `non ho colla cosa succede qui
— zero

21

Ho avuto lo stesso problema con Python3. Il mio codice stava scrivendo in io.BytesIO().

Sostituzione con io.StringIO()risolto.


mi succede anche con stringio
— thebeancounter il

Una considerazione: io.StringIO()è avidità di memoria e può essere un mal di testa con file di grandi dimensioni.
— Flavio,

1
file = open('parsed_data.txt', 'w')
for link in soup.findAll('a', attrs={'href': re.compile("^http")}): print (link)
soup_link = str(link)
print (soup_link)
file.write(soup_link)
file.flush()
file.close()

Nel mio caso, ho usato BeautifulSoup per scrivere un .txt con Python 3.x. Aveva lo stesso problema. Proprio come ha detto @tsduteba, cambia 'wb' nella prima riga in 'w'.


Quando dai una risposta è preferibile dare una spiegazione del PERCHÉ la tua risposta è quella. In questo caso, in che modo questa risposta differisce dalla risposta accettata?
— Stephen Rauch,

@StephenRauch Grazie per i tuoi commenti. Sono nuovo qui e ho appena iniziato a studiare Python diverse settimane fa. Proverò a dare una risposta migliore in futuro.
— Yang Li,

Puoi modificare questo post e aggiungere ulteriori dettagli. Premi il pulsante Modifica in basso a sinistra del post.
— Stephen Rauch,

@StephenRauch Grazie per i tuoi consigli!
— Yang Li,

1

basta cambiare wb in w

outfile=open('./immates.csv','wb')

per

outfile=open('./immates.csv','w')

1

Stai aprendo il file CSV in modalità binaria, dovrebbe essere 'w'

import csv

# open csv file in write mode with utf-8 encoding
with open('output.csv','w',encoding='utf-8',newline='')as w:
    fieldnames = ["SNo", "States", "Dist", "Population"]
    writer = csv.DictWriter(w, fieldnames=fieldnames)
    # write list of dicts
    writer.writerows(list_of_dicts) #writerow(dict) if write one row at time
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.