使用openpyxl加载XLSX到DataFrame,代码遍历正常但无法写入数据库求修复
问题排查与修复方案
我看了你的代码,发现几个关键问题导致你没法把数据写入数据库,咱们一步步来梳理修复:
1. DataFrame拼接时的变量更新错误
你现在用d= pd.concat([df,a])把新读取的表格数据和a拼接,但完全没把拼接后的结果存回a——这就意味着每次循环完,a还是一开始的空DataFrame,最后根本没有数据能拿去写数据库。
修复很简单,直接把拼接结果赋值回a,记得加上ignore_index=True避免索引重复:
a = pd.concat([a, df], ignore_index=True)
2. 路径拼接的坑
你用r'path'+file拼路径的方式很容易出错,如果你的path结尾没加路径分隔符(比如Windows下的\),生成的路径会变成pathfile1.xlsx这种错误格式,应该用os.path.join()来安全拼接,它会自动处理不同系统的路径分隔符:
file_path = os.path.join(r'path', file) wb = openpyxl.load_workbook(file_path)
3. 你漏了写入数据库的核心逻辑
你的代码只完成了数据收集的部分,压根没写把数据存进数据库的代码。这里给你补一个通用的示例(以MySQL为例,其他数据库逻辑类似,只需要改连接字符串):
首先得装依赖:
pip install sqlalchemy pymysql
然后在收集完所有数据后,加上这段写入逻辑:
from sqlalchemy import create_engine # 替换成你自己的数据库信息:用户名、密码、主机、端口、数据库名 engine = create_engine('mysql+pymysql://username:password@host:port/database_name') # 写入数据库,if_exists可选'replace'(覆盖表)或'append'(追加数据) a.to_sql(name='你的表名', con=engine, if_exists='append', index=False)
修复后的完整代码
import pandas as pd import os import openpyxl from sqlalchemy import create_engine # 替换成你的目标文件夹路径 folder_path = r'path' files = [file for file in os.listdir(folder_path)] a = pd.DataFrame() for file in files: # 安全拼接文件路径 file_path = os.path.join(folder_path, file) wb = openpyxl.load_workbook(file_path) print(wb) for ws_name in wb.sheetnames: ws = wb[ws_name] data = ws.values columns = next(data)[0:] df = pd.DataFrame(data, columns=columns) # 更新拼接后的DataFrame a = pd.concat([a, df], ignore_index=True) print(a) # 写入数据库 engine = create_engine('mysql+pymysql://username:password@host:port/database_name') a.to_sql(name='your_table_name', con=engine, if_exists='append', index=False)
最后提几个小细节:
- 如果你的Excel文件表头格式不统一,可能需要先做数据清洗,确保列名一致后再拼接,不然会生成很多空列。
- 如果要处理的文件特别大,建议不要把所有数据都存在内存里,可以读一个文件就写一次数据库,避免内存不够用。
内容的提问来源于stack exchange,提问作者Michał
相关产品推荐
相关产品推荐

