TypeError: ต้องการวัตถุที่มีลักษณะเหมือนไบต์ไม่ใช่ 'str' ใน python และ CSV


173

TypeError: จำเป็นต้องมีวัตถุคล้ายไบต์ไม่ใช่ 'str'

รับข้อผิดพลาดดังกล่าวในขณะที่การดำเนินการด้านล่างรหัสหลามเพื่อบันทึกข้อมูลตาราง HTML ในไฟล์ Csv ไม่ทราบวิธีรับ rideup กรุณาช่วยฉันด้วย

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)

บนเหนือบรรทัดสุดท้าย



สวัสดี - ฉันพยายามเรียกใช้งานบน ATOM ของฉันบน MX-Linux - แต่ฉันกลับมาที่นี่:´Traceback (โทรล่าสุดครั้งล่าสุด): ไฟล์ "/home/martin/.atom/python/examples/bs_gumtree_pl.py", บรรทัด 20 ใน <module> writer.writerows (list_of_rows) UnicodeEncodeError: 'ascii' codec ไม่สามารถเข้ารหัสอักขระ u '\ xa0' ในตำแหน่ง 0: ลำดับไม่อยู่ในช่วง (128) [เสร็จสิ้นใน 2.015s] ´ฉันสงสัยว่าอะไร ไปที่นี่! ชอบที่จะได้ยินจากคุณ
ศูนย์

คำตอบ:


332

คุณใช้วิธีการของ Python 2 แทนที่จะเป็น Python 3

เปลี่ยนแปลง:

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

ถึง:

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

และคุณจะได้รับไฟล์ที่มีเอาต์พุตต่อไปนี้:

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 csv รับอินพุตในโหมดข้อความในขณะที่ใน Python 2 มันจะใช้มันในโหมดไบนารี

แก้ไขเพื่อเพิ่ม

นี่คือรหัสที่ฉันใช้:

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
สำหรับใช้กับcsvโมดูล Python 3 openควรมีnewline=''พารามิเตอร์[อ้างอิง ]
Mark Tolonen

1
เปลี่ยนสตริง 'wb' เป็น 'w' ได้ผลสำหรับฉัน ขอบคุณมาก
Loc Huynh

หากคุณใช้บัฟเฟอร์ดูคำตอบของ vinyll !
handras

สวัสดี - ฉันลองใช้รหัสแล้วและได้รับสิ่งนี้กลับมา: `Traceback (การโทรล่าสุดครั้งล่าสุด): ไฟล์" /home/martin/.atom/python/examples/bs_gumtree_pl.py ", บรรทัด 20, ใน <module> UnicodeEncodeError : 'ascii' codec ไม่สามารถเข้ารหัสอักขระ u '\ xa0' ในตำแหน่ง 0: เลขลำดับไม่อยู่ในช่วง (128) [เสร็จสิ้นใน 1.415s] `ฉันไม่มีกาวอะไรเกิดขึ้นที่นี่
ศูนย์

21

ฉันมีปัญหาเดียวกันกับ Python3 io.BytesIO()รหัสของฉันถูกเขียนลงใน

แทนที่ด้วยio.StringIO()แก้ไข


เกิดขึ้นกับฉันด้วย stringio ด้วย
thebeancounter

สิ่งหนึ่งที่ควรพิจารณา: io.StringIO()คือความโลภของหน่วยความจำและอาจปวดหัวกับไฟล์ขนาดใหญ่
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()

ในกรณีของฉันฉันใช้ BeautifulSoup เพื่อเขียน. txt ด้วย Python 3.x มันมีปัญหาเดียวกัน เช่นเดียวกับ @tsduteba กล่าวให้เปลี่ยน 'wb' ในบรรทัดแรกเป็น 'w'


เมื่อให้คำตอบดีกว่าให้คำอธิบายว่าทำไมคำตอบของคุณจึงเป็นคำตอบ ในกรณีนี้คำตอบนี้แตกต่างจากคำตอบที่ยอมรับอย่างไร
Stephen Rauch

@StephenRauch ขอบคุณสำหรับความคิดเห็นของคุณ ฉันใหม่ที่นี่และเพิ่งเริ่มเรียนรู้ Python เมื่อหลายสัปดาห์ก่อน ฉันจะพยายามให้คำตอบที่ดีกว่าในอนาคต
Yang Li

คุณสามารถแก้ไขโพสต์นี้และเพิ่มรายละเอียดเพิ่มเติม กดปุ่มแก้ไขด้านล่างและด้านซ้ายของโพสต์
สตีเฟ่น Rauch

@StephenRauch ขอบคุณสำหรับเคล็ดลับของคุณ!
Yang Li


1

คุณกำลังเปิดไฟล์ csv ในโหมดไบนารีควรเป็น '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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.