TypeError: se requiere un objeto similar a bytes, no 'str' en Python y CSV

Resuelto ShivaGuntuku asked hace 9 años • 5 respuestas

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)
ShivaGuntuku avatar Dec 15 '15 14:12 ShivaGuntuku
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)
dstudeba avatar Dec 15 '2015 08:12 dstudeba

Tuve el mismo problema con Python3. Mi código estaba escribiendo en io.BytesIO().

Reemplazando con io.StringIO()resuelto.

vinyll avatar Dec 22 '2016 21:12 vinyll

solo cambia wb a w

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

a

outfile=open('./immates.csv','w')
Sarath Ak avatar Sep 18 '2019 06:09 Sarath Ak