如何将Python请求响应对象中的TSV文本数据加载到DataFrame
问题根源
- 接口返回的是
text/tsv格式的制表符分隔文本,本身不属于JSON结构,无需尝试转JSON,直接按TSV格式处理即可 - 原有代码存在两处核心用法错误:
- 遍历空DataFrame
for row in table实际是遍历列名,根本不会读取你解析好的TSV数据 - 已被弃用的
DataFrame.append()方法仅支持传入Series或DataFrame对象,直接传入csv.reader迭代器必然会触发类型错误
- 遍历空DataFrame
修复后代码
你完全不需要手动处理CSV解析,pandas内置方法可以一步完成TSV到DataFrame的转换,代码简化后如下:
import requests import datetime import pandas as pd import sys from requests.auth import HTTPBasicAuth from curlParameters import * def calculate_year(): current_year = datetime.datetime.now().year return str(current_year) def file_name(): name = "CallDetail" year = calculate_year() file_type = ".csv" return name + year + file_type try: response = requests.get(url, params=parameters, auth=HTTPBasicAuth(username, password)) response.raise_for_status() # 直接抛出请求异常,不需要单独判断status_code except Exception as e: print("Error:" + str(e)) sys.exit() # 一步把TSV响应转成DataFrame columns = [ 'contact_id', 'master_contact_id', 'Contact_Code', 'media_name', 'contact_name', 'ani_dialnum', 'skill_no', 'skill_name', 'campaign_no', 'campaign_name', 'agent_no', 'agent_name', 'team_no', 'team_name', 'disposition_code', 'sla', 'start_date', 'start_time', 'PreQueue', 'InQueue', 'Agent_Time', 'PostQueue', 'Total_Time', 'Abandon_Time', 'Routing_Time', 'abandon', 'callback_time', 'Logged', 'Hold_Time' ] # 如果接口返回的TSV本身带表头,去掉names参数即可 df = pd.read_csv( response.text, sep='\t', names=columns, header=0 if response.text.splitlines()[0].startswith('contact_id') else None # 自动判断是否有自带表头 ) # 导出CSV,不需要用petl,pandas自带导出功能 save_path = local_source + file_name() df.to_csv(save_path, encoding='utf-8', index=False) # 如果你一定要用petl导出,替换成下面的代码即可 # import petl # petl.tocsv(table=df, source=save_path, encoding='utf-8', write_header=True)
内容的提问来源于stack exchange,提问作者Owen
相关产品推荐
相关产品推荐

