TypeError: python ve CSV'de 'str' değil, bayt benzeri bir nesne gerekli


173

TypeError: 'str' değil, bayt benzeri bir nesne gerekli

HTML tablosu verilerini Csv dosyasına kaydetmek için aşağıdaki python kodunu yürütürken hata alıyorum. rideup.pls bana nasıl yardımcı olacağını bilmiyorum.

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)

son satırın üstünde.



merhaba - MX-Linux'ta ATOM'umda çalıştırmayı denedim - ama bunu geri alıyorum: raceTraceback (son çağrı son): Dosya "/home/martin/.atom/python/examples/bs_gumtree_pl.py", line 20, <module> writer.writerows (list_of_rows) 'da UnicodeEncodeError:' ascii 'codec bileşeni 0 konumunda u' \ xa0 'karakterini kodlayamıyor: aralık (128) içinde sıralanmayan burada devam ediyor!? duymak seviyorum
sıfır

Yanıtlar:


332

Python 3 yerine Python 2 yöntemini kullanıyorsunuz.

Değişiklik:

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

Kime:

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

ve aşağıdaki çıktıya sahip bir dosya alırsınız:

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
.....

Python 3'te csv girişi metin modunda alırken, Python 2'de bunu ikili modda alır.

Eklemek için düzenlendi

İşte ben koştu kodu:

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
csvModülle kullanım için , Python 3 openayrıca newline=''bir parametre olarak [ref ] olmalıdır
Mark Tolonen

1
'Wb' dizesini 'w' olarak değiştir, benim için çalışıyor. Çok teşekkürler
Loc Huynh

Bir tampon kullanıyorsanız vinyll'in cevabına bakınız !
handras

merhaba orada - kodu denedim - ve bunu geri aldım: `Traceback (en son çağrı son): Dosya" /home/martin/.atom/python/examples/bs_gumtree_pl.py ", satır 20, <module> UnicodeEncodeError : 'ascii' codec bileşeni, 0 konumunda u '\ xa0' karakterini kodlayamıyor: aralık içinde değil (128) [1.415'lerde tamamlandı] `burada olan hiçbir yapıştırıcım yok
sıfır

21

Python3 ile de aynı sorunu yaşadım. Kodum yazıyordu io.BytesIO().

Çözüldü ile değiştirme io.StringIO().


bana stringio ile de olur
thebeancounter

Göz önünde bulundurulması io.StringIO()gereken bir nokta : bellek açgözlülüğüdür ve büyük dosyalarla baş ağrısı olabilir.
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()

Benim durumumda, Python 3.x ile bir .txt yazmak için BeautifulSoup kullandım. Aynı sorun vardı. @Tsduteba'nın dediği gibi, ilk satırdaki 'wb'yi' w 'olarak değiştirin.


Bir cevap verirken, cevabınızın NEDEN olduğu hakkında bazı açıklamalar yapmak tercih edilir . Bu durumda bu cevap kabul edilen cevaptan nasıl farklıdır?
Stephen Rauch

@StephenRauch Yorumlarınız için teşekkür ederiz. Burada yeniyim ve birkaç hafta önce Python öğrenmeye başladım. Gelecekte daha iyi cevap vermeye çalışacağım.
Yang Li

Bu yayını düzenleyebilir ve daha fazla ayrıntı ekleyebilirsiniz. Gönderinin altındaki ve solundaki düzenle düğmesine basın.
Stephen Rauch

@StephenRauch İpuçlarınız için teşekkürler!
Yang Li

1

wb'yi w olarak değiştir

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

için

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

1

Csv dosyasını ikili modda açıyorsunuz, '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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.