TypeError : 파이썬과 CSV에서 'str'이 아닌 바이트와 유사한 객체가 필요합니다.


173

TypeError : 'str'이 아닌 바이트와 같은 객체가 필요합니다.

Csv 파일에 HTML 테이블 데이터를 저장하기 위해 Python 코드 아래에서 실행하는 동안 오류가 발생합니다. rideup.pls를 얻는 방법을 모르십시오.

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)

마지막 줄 위에.



hello-MX-Linux에서 ATOM에서 이것을 실행하려고했지만 다시 가져옵니다. ´Traceback (가장 최근 호출) : File "/home/martin/.atom/python/examples/bs_gumtree_pl.py", line 20, <module> writer.writerows (list_of_rows) UnicodeEncodeError : 'ascii'코덱은 위치 0에서 문자 u '\ xa0'을 (를) 인코딩 할 수 없습니다. 서수는 range (128)에 없습니다. 여기에 간다!? 당신의 의견을 듣고
0

답변:


332

Python 3 대신 Python 2 방법론을 사용하고 있습니다.

변화:

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모듈 과 함께 사용하기 위해 파이썬 3 opennewline=''매개 변수 [ref ]를
가져야합니다

1
'wb'문자열을 'w'로 변경하면 효과가 있습니다. 고마워요
Loc 데이 후인

버퍼를 사용하는 경우 vinyll의 답변을 참조하십시오 !
handras 2009

안녕하세요-코드를 시험 해보고 이것을 다시 얻었습니다 .` Traceback (가장 최근 호출) : <module> UnicodeEncodeError의 "/home/martin/.atom/python/examples/bs_gumtree_pl.py", 20 행 파일 '아스키'코덱 수 없습니다 인코딩 문자 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을 사용하여 Python 3.x로 .txt를 작성했습니다. 같은 문제가있었습니다. @tsduteba가 말했듯이 첫 번째 줄의 'wb'를 'w'로 변경하십시오.


답을 할 때 왜 답되는지에 대해 설명 하는 것이 좋습니다 . 이 경우이 답변이 허용되는 답변과 어떻게 다릅니 까?
Stephen Rauch

@StephenRauch 의견을 보내 주셔서 감사합니다. 나는 여기에 처음 왔고 몇 주 전에 파이썬을 배우기 시작했습니다. 앞으로 더 나은 답변을 드리려고 노력할 것입니다.
양 리

이 게시물을 편집하고 더 자세한 내용을 추가 할 수 있습니다. 게시물의 왼쪽과 왼쪽에있는 수정 버튼을 누르십시오.
Stephen Rauch

@StephenRauch 팁 주셔서 감사합니다!
양 리

1

wb를 w로 변경하십시오.

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

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

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.