TypeError: se requiere un objeto similar a bytes, no 'str' en Python y CSV
TypeError: se requiere un objeto similar a bytes, no 'str'
Recibo el error anterior al ejecutar el siguiente código Python para guardar los datos de la tabla HTML en un archivo CSV. ¿Cómo me deshago de ese error?
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)
Aceptado
Estás utilizando la metodología Python 2 en lugar de Python 3.
Cambiar:
outfile=open('./immates.csv','wb')
A:
outfile=open('./immates.csv','w')
y obtendrá un archivo con el siguiente resultado:
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
.....
En Python 3, csv toma la entrada en modo texto, mientras que en Python 2 la toma en modo binario.
Editado para agregar
Aquí está el código que ejecuté:
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)
Tuve el mismo problema con Python3. Mi código estaba escribiendo en io.BytesIO()
.
Reemplazando con io.StringIO()
resuelto.
solo cambia wb a w
outfile=open('./immates.csv','wb')
a
outfile=open('./immates.csv','w')