Python读取URL获取的CSV时内容被拆分为单个字符的问题
解决CSV在线读取时内容被拆分为单个字符的问题
使用Python 3.10通过以下代码从指定URL读取CSV文件时,除"1 Mo""3 Mo"这类内容外,其余文字和数字均被拆分为单个字符:
from urllib.request import urlopen import csv response = urlopen(url) content = response.read().decode('utf-8') csv_data = csv.reader(content, delimiter=',') for row in csv_data: print(row)
目标URL:
url = "https://home.treasury.gov/resource-center/data-chart-center/interest-rates/daily-treasury-rates.csv/2022/all?type=daily_treasury_yield_curve&field_tdr_date_value=2022&page&_format=csv"
输出示例(仅截取部分):
['D'] ['a'] ['t'] ['e'] ['',''] ['1 Mo'] ['',''] ['2 Mo'] ['',''] ['3 Mo'] ['',''] ... ['30 Yr'] [] ['1'] ['1'] ['/'] ['0'] ['8'] ['/'] ...
直接将文件保存到本地后读取一切正常,无需本地保存的解决方法如下:
问题原因
csv.reader 要求传入的是按行迭代的对象(比如文件对象),而直接传入字符串时,它会将字符串视为字符序列,逐个字符作为"行"来解析,导致内容被拆分为单个字符。
解决方案
使用 io.StringIO 将解码后的字符串包装成类文件对象,让 csv.reader 可以按正确的行来解析:
from urllib.request import urlopen import csv import io url = "https://home.treasury.gov/resource-center/data-chart-center/interest-rates/daily-treasury-rates.csv/2022/all?type=daily_treasury_yield_curve&field_tdr_date_value=2022&page&_format=csv" response = urlopen(url) content = response.read().decode('utf-8') # 用StringIO模拟文件对象,按行迭代内容 csv_data = csv.reader(io.StringIO(content), delimiter=',') for row in csv_data: print(row)
io.StringIO 会把字符串转换成类似文本文件的可迭代对象,csv.reader 就能正确识别每行数据,避免单个字符拆分的问题。
内容的提问来源于stack exchange,提问作者user3151858
相关产品推荐
相关产品推荐

