CSV以字节形式而不是字符串形式返回 Python

18 浏览
0 Comments

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

0
0 Comments

问题原因:代码中使用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.

0