CSV与Parquet仅写入DataFrame最后一行问题求助
解决CSV/Parquet文件仅写入DataFrame最后一行的问题
你的代码核心问题是在循环内部每次创建新DataFrame并直接写入文件,默认写入模式为覆盖,每循环一次就会冲掉之前的内容,最终只留下最后一行数据。
修改思路
- 循环前初始化一个空列表,用来存储所有处理后的数据条目
- 循环内仅完成证书解析和数据整理,把每条数据的字典格式添加到列表中
- 所有循环执行完毕后,将整个列表转换为DataFrame,一次性写入CSV和Parquet文件
修改后的完整代码
import pandas as pd from datetime import datetime # 假设已导入x509、ExtensionOID等必要模块,且定义了qualified_qv_cert_oid # 初始化空列表存储所有数据 data_list = [] for r in records: # 初始化flag,避免异常场景下变量未定义 flag = 'Unknown' content = '-----BEGIN CERTIFICATE-----' + '\n' + \ r[1] + '\n'+'-----END CERTIFICATE-----' try: cert = x509.load_pem_x509_certificate(str.encode(content)) cert_policy_value = cert.extensions.get_extension_for_oid( ExtensionOID.CERTIFICATE_POLICIES).value # 注意:如果cert_policy_value包含多个策略,最后一个会覆盖policy_check # 若需处理多策略场景,需调整逻辑(比如只要存在目标OID就标记) for ext in cert_policy_value: policy_check = ext.policy_identifier.dotted_string # 判断证书策略类型 if policy_check in qualified_qv_cert_oid: flag = 'Non-QF' logging.info('NON-QLFY') else: flag = 'QLFY' except BaseException as e: logging.error(f'Error found for cert: {e}') # 异常时flag保持初始值,也可根据需求自定义 # 将当前行数据加入列表 data_dict = { 'id': r[0], 'flag': flag, 'timestamp': datetime.now().strftime('%Y-%m-%d %H:%M:%S') } data_list.append(data_dict) # 循环结束后统一生成DataFrame并写入文件 df = pd.DataFrame(data_list) df.to_csv('qv_output.csv', index=False, encoding='utf-8') df.to_parquet(path='qv_parsing.parquet', engine='auto', compression='snappy', index=False)
关键说明
- 避免循环内写文件:一次性写入比多次循环写入效率更高,彻底解决覆盖问题
- 初始化flag:防止证书解析异常时
flag变量未定义引发报错 - 策略遍历提示:原代码中若证书包含多个策略OID,最后一个会覆盖前面的判断结果,如有多策略处理需求,需额外调整逻辑
内容的提问来源于stack exchange,提问作者Viraj Rathod
相关产品推荐
相关产品推荐

