批量导入Excel数据至Firestore报错:文档路径元素数需为偶数
问题:从Excel批量导入数据到Firestore失败,单条添加正常
现状描述
- 手动单条添加数据到Firestore可正常运行
- 通过for循环批量读取Excel数据添加时失败
正常运行的单条添加代码
import firebase_admin from firebase_admin import credentials from firebase_admin import firestore cred = credentials.Certificate("certificate.json") firebase_admin.initialize_app(cred) db=firestore.client() name = 'Ashwin' date = '23/10/2022' roll = 'sampledata' cert = 'sampledata' def store_add(name, date,roll,cert): data = {'name':name, 'date':date,'roll':roll} db.collection('certs').document(cert).set(data) store_add(name,date,roll,cert)
批量添加失败的代码
import pandas as pd import firebase_admin from firebase_admin import credentials from firebase_admin import firestore cred = credentials.Certificate("certificate.json") firebase_admin.initialize_app(cred) db=firestore.client() def store_add(name, date,roll,cert): data = {'name':name, 'date':date,'roll':roll} db.collection('certs').document(cert).set(data) df = pd.read_excel('data.xlsx') name_list = list(df['name']) cert = list(df['cert']) roll = list(df['roll']) date="24/10/2022" for i in range(len(name_list)): store_add(name_list[i],date,roll[i],cert[i]) print("Added:",name_list[i])
报错信息
Traceback (most recent call last): File "e:\PSDC\Certificate-Generator\bulk.py", line 23, in <module> store_add(name_list[i],date,roll[i],cert[i]) File "e:\PSDC\Certificate-Generator\bulk.py", line 14, in store_add db.collection('certs').document(cert).set(data) File "C:\Users\ashwi\AppData\Local\Programs\Python\Python310\lib\site-packages\google\cloud\firestore_v1\base_collection.py", line 130, in document return self._client.document(*child_path) File "C:\Users\ashwi\AppData\Local\Programs\Python\Python310\lib\site-packages\google\cloud\firestore_v1\base_document.py", line 60, in __init__ _helpers.verify_path(path, is_collection=False) File "C:\Users\ashwi\AppData\Local\Programs\Python\Python310\lib\site-packages\google\cloud\firestore_v1\_helpers.py", line 150, in verify_path raise ValueError("A document must have an even number of path elements") ValueError: A document must have an even number of path elements
Firestore数据库结构
根集合为certs,每个文档以唯一标识作为文档ID,文档内存储name、date、roll三个字段。
问题原因及解决方法
原因分析
报错ValueError: A document must have an even number of path elements说明传入的文档ID(即cert参数)存在问题:
cert为空值或None,导致路径变为certs/,元素数为1(奇数)cert中包含斜杠/,Firestore会将其解析为路径分段,比如cert="a/b"会被识别为certs/a/b,元素数为3(奇数)- Excel中
cert列的数据类型为数值(比如整数ID),被pandas读取为float类型,传入时可能引发路径解析错误
解决步骤及优化代码
- 检查Excel中
cert列数据,确保无空值、无斜杠/,且为字符串或可转为有效字符串的内容 - 修改批量代码,优化遍历方式并添加有效性校验和异常处理:
import pandas as pd import firebase_admin from firebase_admin import credentials from firebase_admin import firestore cred = credentials.Certificate("certificate.json") firebase_admin.initialize_app(cred) db=firestore.client() def store_add(name, date, roll, cert): # 转换为字符串,避免数值类型问题 cert_str = str(cert).strip() # 校验文档ID有效性 if not cert_str: raise ValueError("文档ID不能为空") if '/' in cert_str: raise ValueError(f"文档ID不能包含斜杠: {cert_str}") data = {'name': name, 'date': date, 'roll': roll} db.collection('certs').document(cert_str).set(data) df = pd.read_excel('data.xlsx') date = "24/10/2022" # 直接遍历DataFrame行,避免索引不匹配问题 for idx, row in df.iterrows(): try: store_add(row['name'], date, row['roll'], row['cert']) print(f"已添加: {row['name']}") except Exception as e: print(f"第{idx+1}行添加失败: {str(e)},数据详情: {row.to_dict()}")
代码优化点说明
- 直接遍历DataFrame的行,避免手动处理列表可能出现的索引不匹配问题
- 对
cert参数做字符串转换和有效性校验,提前拦截无效值 - 添加异常捕获,方便定位具体出错的行和数据内容,便于排查问题
内容的提问来源于stack exchange,提问作者R Ashwin
相关产品推荐
相关产品推荐

