TypeError: बाइट्स जैसी वस्तु की आवश्यकता होती है, अजगर और CSV में 'str' की नहीं


173

TypeError: बाइट्स जैसी वस्तु की आवश्यकता होती है, न कि 'str' की

Csv फ़ाइल में HTML तालिका डेटा को बचाने के लिए अजगर कोड से नीचे निष्पादित करते समय त्रुटि हो रही है। राइडअप पाने के लिए पता नहीं है। मेरी मदद करो।

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)

अंतिम पंक्ति के ऊपर।



हैलो - मैंने इसे एमएक्स-लिनक्स पर अपने एटम पर चलाने की कोशिश की - लेकिन मुझे यह वापस मिल गया: backट्रेसबैक (सबसे हालिया कॉल अंतिम): फ़ाइल "/home/martin/.atom/python/examples/n_gumtree_pl.py", लाइन 20, में <मॉड्यूल> लेखक.लेखक (सूची_ऑफ_रो) यूनिकोड ईनकोड: 'एससीआई' कोडक चरित्र 0 'xa0' को स्थिति 0 में सांकेतिक शब्दों में बदलना नहीं कर सकता है: क्रमबद्ध नहीं रेंज में (128) [2.015 में समाप्त] ´ अच्छी तरह से मुझे आश्चर्य है कि क्या यहाँ जाता है! आप से सुनने के लिए प्यार
शून्य

जवाबों:


332

आप पायथन 3 के बजाय पायथन 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
.....

पायथन 3 में csv इनपुट को टेक्स्ट मोड में लेता है, जबकि पायथन 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 को एक पैरामीटर के रूप में openभी होना चाहिए [रेफ ]newline=''
मार्क टॉलेनन

1
मेरे लिए 'wb' स्ट्रिंग को 'w' कार्यों में बदलें। धन्यवाद एक बहुत
नियंत्रण रेखा Huynh

यदि आप एक बफर का उपयोग कर रहे हैं तो vinyll का उत्तर देखें !
हैंड्स

नमस्ते वहाँ - मैं कोड बाहर की कोशिश की - और यह वापस मिल गया: `Traceback (सबसे हाल ही में कॉल अंतिम): फ़ाइल" /home/martin/.atom/python/examples/bs_gumtree_pl.py ", लाइन 20, में <मॉड्यूल> UnicodeEncodeError : 'ascii' कोडक चरित्र u '\ xa0' को स्थिति में सांकेतिक शब्दों में बदलना नहीं कर सकता है: क्रम में सीमा नहीं है (128) [1.415 में समाप्त] `मुझे कोई गोंद नहीं है कि यहां क्या हो जाता है
शून्य

21

मैं Python3 के साथ एक ही मुद्दा था। मेरा कोड में लिख रहा था io.BytesIO()

io.StringIO()हल के साथ बदल रहा है।


स्ट्रिंगियो के साथ भी मेरे साथ होता है
thebeancounter

एक विचार: io.StringIO()मेमोरी लालच है और बड़ी फ़ाइलों के साथ सिरदर्द हो सकता है।
फ्लावियो

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()

मेरे मामले में, मैंने ब्यूटीफुल का इस्तेमाल पायथन 3.x के साथ एक .txt लिखने के लिए किया। यह एक ही मुद्दा था। जैसा कि @tsduteba ने कहा, पहली पंक्ति में 'wb' को 'w' में बदलें।


उत्तर देते समय कुछ स्पष्टीकरण देना बेहतर होता है क्योंकि आपका उत्तर एक है। इस मामले में यह उत्तर स्वीकृत उत्तर से कैसे भिन्न है?
स्टीफन राउच

@StephenRauch आपकी टिप्पणी के लिए धन्यवाद। मैं यहां नया हूं और अभी कई हफ्तों पहले ही अजगर सीखना शुरू किया है। मैं भविष्य में बेहतर जवाब देने की कोशिश करूंगा।
यांग ली

आप इस पोस्ट को संपादित कर सकते हैं, और अधिक विवरण जोड़ सकते हैं। नीचे और पोस्ट के बाईं ओर संपादित करें बटन दबाएं।
स्टीफन राउच

@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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.