CSV以字节形式而不是字符串形式返回 Python
CSV以字节形式而不是字符串形式返回 Python
我收到的错误是这个:
_csv.Error: 迭代器应该返回字符串,而不是字节(你在文本模式下打开了文件吗?)
在我的代码中哪里会以文本模式打开文件?
import csv import urllib.request import pymysql.cursors connection = pymysql.connect(host='localhost', user='', password='', db='mydb', charset='utf8', cursorclass=pymysql.cursors.DictCursor) try: url = 'https://api.iextrading.com/1.0/stock/market/collection/sector? collectionName=Health%20Care&format=csv' response = urllib.request.urlopen(url) csv_data = csv.reader(response) for row in csv_data: cursor.execute('INSERT INTO Financials (names, \ classes, mark )' \ 'VALUES("%s", "%s", "%s")', row) finally: connection.close()
问题原因:代码中使用urllib库的urlopen方法打开一个URL链接,返回的response对象是一个bytes类型的对象,而不是字符串类型。
解决方法:可以使用生成器推导式或map函数对返回的bytes对象进行解码,将其转换为字符串类型,然后再传给csv.reader()方法进行处理。
完整代码如下:
import urllib.request import csv url = 'https://api.iextrading.com/1.0/stock/market/collection/sector?collectionName=Health%20Care&format=csv' response = urllib.request.urlopen(url) # 使用生成器推导式对返回的bytes对象进行解码 csv_data = csv.reader(line.decode() for line in response) for row in csv_data: print(row)
以上代码将返回的bytes对象以字符串形式传给csv.reader()方法,使其能够正确处理。
注意:这种方法会使用utf-8编码对响应内容进行解码,但有可能与实际编码不符。大多数服务器会在HTTP头部中包含正确的编码信息。如果需要找到正确的响应编码,可以参考这里的问题:[https://stackoverflow.com/q/4981977/1222951](https://stackoverflow.com/q/4981977/1222951),但那里的答案并不十分完美。
-Fey correct. In that case that works (tested with the real site). This encoding guess game is tough.