【问题标题】:CSV Returning as Bytes not String PythonCSV 作为字节返回而不是字符串 Python
【发布时间】:2019-03-25 00:41:42
【问题描述】:

我收到的错误是:

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

【问题讨论】:

  • 你也可以稍微修正缩进

标签: python python-3.x urllib pymysql


【解决方案1】:
response =  urllib.request.urlopen(url)

这里responsebytes 对象上返回一个迭代器。

如果你知道 csv 文件只是纯文本,你可以插入一个生成器理解来解码这些行:

csv_data = csv.reader(line.decode() for line in response)

map(你不喜欢python 3 map吗?不用lambda也可以使用它?)

csv_data = csv.reader(map(bytes.decode,response))

独立示例:

import urllib.request,csv

url = 'https://api.iextrading.com/1.0/stock/market/collection/sector?collectionName=Health%20Care&format=csv'
response =  urllib.request.urlopen(url)
for row in csv.reader(line.decode() for line in response):
    print(row)

现在您正在为csv.reader 提供一个字符串列表,这将起作用。

样本输出:

['CAPR', 'Capricor Therapeutics Inc.', 'NASDAQ Capital Market', 'Healthcare', 'close', '0.9011', '1539955800519', '0.875', '1539979200341', '0.9011', '0.8702', '0.875', 'Close', 'October 19, 2018', '1539979200341', '96625', '', '', '', '0.875', '1539979200341', '0.9011', '0.0261', '0.02983', '1539954158310', '0.9011', '-0.0261', '-0.02896', '', '', '106532', '', '', '', '', '26905263', '-1.72', '3.19', '0.851', '-0.4716351592356688']
['AVDL', 'Avadel Pharmaceuticals plc', 'NASDAQ Global Market', 'Healthcare', 'close', '4.24', '1539955800643', '4.1', '1539979200312', '4.24', '4', '4.1', 'Close', 'October 19, 2018', '1539979200312', '78386', '', '', '', '4.1', '1539979200312', '4.2', '0.1', '0.02439', '1539892803066', '4.2', '-0.1', '-0.02381', '', '', '114387', '', '', '', '', '150734712', '-3.8', '11.93', '3.98', '-0.5579009090909092']

【讨论】:

  • 请注意,这将使用 utf-8 编解码器盲目解码响应内容,这可能与实际编码不匹配。大多数服务器将在 HTTP 标头中包含正确的编码。有一个关于找到正确的响应编码here 的问题,但没有一个答案真的很好。
  • @Aran-Fey 正确。在那种情况下有效(在真实站点上测试过)。这个编码猜谜游戏很难。
猜你喜欢
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
相关资源
最近更新 更多