老板丢给我60万行的Excel数据,幸亏我会Python,不然就惨了

image

一个朋友在某运动品牌公司上班,老板给他布置了一个处理客户订单数据的任务。要求是根据订单时间和客户id判断生成四个新的数据:

1、记录该客户是第几次光顾

2、上一次的日期时间是什么时候

3、与上次订单的间隔时间

4、这是一个existing客户还是一个new客户(见定义)

文件说明:

1、第一列是订单日期和时间(乱序)

2、第二列是客户的id

3、第三列不需要使用

4、60+万行数据

相关定义如下:

1、existing:此次下单日期时间与上次日期时间的距离在N天以内,精确到时间(时分秒)

2、new:即超过N天

image

整体思路

1、读取表格的行数据存储成list,并按照时间列的升序排序。

2、维护一个map(在python里是字典dict),每个用户 id 作为key,一个二元组(第几次下单,上一次的日期时间)作为value。

3、遍历表格行数据的list。判断客户 id 是否已经存在于map中,若首次出现,则置该客户 id 在map中的value为[1,‘首次下单’],对应行数据新增的4个数据为[1,‘首次下单’,该次日期时间与上次日期时间差,‘new’]。若已经存在,则更新map中对应的value为[原次数+1,该次日期时间],对应行数据新增的4个数据为[原次数+1,上次日期时间,间隔时间,new/existing取决于间隔时间与预设N]Python资源分享秋秋裙 855408893 ,内有安装包,学习视频资料,免费直播实战案例。这里是Python学习者的聚集地,零基础,进阶,都欢迎

4、将修改过后的行数据list写入到Excel工作簿并保存。

读取表格数据

我们可以用xlrd模块对Excel文件进行读取,以便进一步分析处理数据。示例代码如下:

image

以上代码成功输出前100行的日期则说明已经成功读取到数据。输出结果如下:

image

既然读取文件没有问题,进一步浏览整个文件发现存在多余的空行和重复的标题行在读取和转存中可以用正则匹配过滤掉这些行。

image

将读取的行数据转存到list中,以便进行排序。

image

将修改后的行数据list写入Excel表格并保存为xslx格式

image

结果展示

image

完整代码

image

<think>嗯,用户之前问过关于“load_workbook”未定义的问题,现在他们想知道如何在Python中往已有的Excel表中写入新数据并分到子表里。我需要先回想一下之前是怎么回答的,确保这次回答保持连贯。 首先,用户可能已经安装了openpyxl库,但需要确认。他们可能对Excel的基本操作有一定了解,但不太清楚如何分工作表处理。用户提到的“子表”应该是指不同的工作表(sheet),所以需要指导他们如何选择或创建新的sheet,并写入数据。 接下来,用户的需求可能包括两种情况:在现有sheet中添加数据和创建新sheet。要分别说明这两种情况的操作步骤。可能需要提到使用load_workbook加载工作簿,然后操作active属性或指定sheet名称,或者用create_sheet新建sheet。 同时,用户可能容易犯的错误包括没有保存修改后的工作簿,或者路径错误导致文件覆盖。需要提醒他们保存时使用不同的文件名或确认路径正确。另外,如果使用pandas的话,可能需要提到结合openpyxl引擎,但主要应该以openpyxl为主,因为用户之前的问题是关于这个库的。 还要注意代码示例的正确性,比如确保导入正确,使用正确的语法来写入单元格或追加数据。可能还需要提到如何遍历数据,或者使用append方法添加多行数据。此外,异常处理也是重要的,比如处理文件不存在的错误,或者sheet名称不存在的情况。 用户可能希望保持原有数据的完整性,所以需要强调在写入新数据时不要覆盖原有内容。可能还需要建议备份原文件,或者使用不同的文件名保存修改后的文件。此外,关于版本兼容性,比如不支持.xls格式,需要提醒用户使用.xlsx格式,或者安装xlrd库来处理旧版文件。 最后,总结步骤,确保结构清晰,分点说明,让用户能一步步跟着操作。可能还需要给出完整的代码示例,并解释每个部分的作用,帮助用户理解如何整合到自己的项目中。同时,扩展建议如依赖管理和异常处理也能提升代码的健壮性,这也是用户可能需要的。</think>--- ### **PythonExcel 原有文件写入新数据(分工作表操作)** 在 Python 中向 **已有 Excel 文件** 写入新数据并分到不同工作表(子表),需使用 `openpyxl` 库。以下是详细操作步骤: --- ### **步骤 1:安装依赖库** 确保已安装 `openpyxl`: ```bash pip install openpyxl ``` --- ### **步骤 2:基础操作(加载文件与选择工作表)** #### **场景 1:向已有工作表追加数据** ```python from openpyxl import load_workbook # 加载现有 Excel 文件 wb = load_workbook("example.xlsx") # 选择指定工作表(通过名称) sheet = wb["Sheet1"] # 假设原文件有一个名为 "Sheet1" 的工作表 # 向单元格写入数据 sheet["A1"] = "姓名" sheet["B1"] = "年龄" sheet.append(["张三", 25]) # 追加一行数据到末尾 # 保存文件(覆盖原文件或另存为新文件) wb.save("example_modified.xlsx") ``` #### **场景 2:创建新工作表并写入数据** ```python from openpyxl import load_workbook wb = load_workbook("example.xlsx") # 创建新工作表(自动添加到末尾) new_sheet = wb.create_sheet(title="新数据表") # 向新工作表写入数据 new_sheet["A1"] = "产品" new_sheet["B1"] = "价格" new_sheet.append(["手机", 5000]) new_sheet.append(["电脑", 8000]) # 保存修改 wb.save("example_with_new_sheet.xlsx") ``` --- ### **关键注意事项** 1. **避免覆盖原文件** 建议先备份原文件,或在 `save()` 时使用不同文件名(如 `原文件_new.xlsx`)。 2. **工作表名称冲突** 若新工作表名称与已有工作表重复,会自动在名称后添加数字(如 `新数据表1`)。 3. **写入大数据时的性能优化** 默认 `openpyxl` 会缓存数据以提高速度,但写入大量数据时建议手动关闭自动计算: ```python wb = load_workbook("large_file.xlsx", read_only=False, keep_vba=False) sheet = wb.active sheet.sheet_view.tabSelected = True # 禁用自动计算 ``` --- ### **高级操作:分工作表批量写入数据** #### **示例:将数据按类别拆分到不同工作表** ```python from openpyxl import load_workbook # 原始数据(字典形式,键为工作表名,值为数据列表) data = { "电子产品": [["手机", 5000], ["耳机", 300]], "服装": [["T恤", 100], ["外套", 250]] } # 加载或创建 Excel 文件 try: wb = load_workbook("products.xlsx") except FileNotFoundError: wb = Workbook() # 若文件不存在,创建新工作簿 # 遍历数据字典,写入对应工作表 for sheet_name, rows in data.items(): if sheet_name in wb.sheetnames: # 若工作表已存在,直接使用 sheet = wb[sheet_name] else: # 若不存在,创建新工作表 sheet = wb.create_sheet(title=sheet_name) # 添加表头(如果工作表为空) if sheet.max_row == 0: sheet.append(["产品名称", "价格"]) # 追加数据行 for row in rows: sheet.append(row) # 删除默认创建的空白工作表(如果有) if "Sheet" in wb.sheetnames and wb["Sheet"].max_row == 0: del wb["Sheet"] # 保存文件 wb.save("products.xlsx") ``` --- ### **常见问题与解决** #### **1. 写入后文件损坏或无法打开** - **原因**:文件被其他程序占用,或代码未正确关闭工作簿。 - **解决**:确保代码中只调用一次 `wb.save()`,并检查文件是否已关闭。 #### **2. 中文乱码** - **原因**:Excel 默认编码与 Python 不一致。 - **解决**:保存时指定编码(通常不需要),或确保系统区域设置支持中文。 #### **3. 性能优化** - **写入超大数据(10万行以上)**:改用 `pandas` + `openpyxl` 组合: ```python import pandas as pd # 将 DataFrame 写入新工作表(需 openpyxl 引擎) with pd.ExcelWriter("large_data.xlsx", engine="openpyxl", mode="a") as writer: df_large.to_excel(writer, sheet_name="大数据表", index=False) ``` --- ### **完整代码示例** ```python from openpyxl import load_workbook def write_to_excel(filename, sheet_data): """ 向 Excel 文件的不同工作表写入数据 :param filename: Excel 文件名 :param sheet_data: 字典格式 {工作表名: 数据列表} """ try: # 加载现有文件 wb = load_workbook(filename) except FileNotFoundError: # 文件不存在时创建新工作簿 from openpyxl import Workbook wb = Workbook() # 删除默认空白工作表 if "Sheet" in wb.sheetnames: del wb["Sheet"] # 遍历数据并写入工作表 for sheet_name, data in sheet_data.items(): if sheet_name in wb.sheetnames: sheet = wb[sheet_name] else: sheet = wb.create_sheet(sheet_name) # 写入数据(假设数据是二维列表) for row in data: sheet.append(row) # 保存文件 wb.save(filename) print(f"数据已成功写入 {filename}") # 使用示例 data = { "销售记录": [ ["日期", "销售额"], ["2023-01-01", 15000], ["2023-01-02", 23000] ], "库存": [ ["产品", "数量"], ["手机", 500], ["电脑", 200] ] } write_to_excel("business_data.xlsx", data) ``` --- ### **扩展建议** 1. **结合数据库** 从数据库查询数据并直接写入 Excel: ```python import sqlite3 from openpyxl import Workbook conn = sqlite3.connect("database.db") cursor = conn.cursor() # 查询数据 cursor.execute("SELECT * FROM products") data = cursor.fetchall() # 写入 Excel wb = Workbook() sheet = wb.active sheet.title = "产品数据" sheet.append(["ID", "名称", "价格"]) # 表头 for row in data: sheet.append(row) wb.save("products_from_db.xlsx") ``` 2. **定时任务** 使用 `schedule` 库实现每日自动导出: ```python import schedule import time def daily_export(): write_to_excel("daily_report.xlsx", get_today_data()) # 每天 18:00 执行 schedule.every().day.at("18:00").do(daily_export) while True: schedule.run_pending() time.sleep(60) ``` --- 通过以上方法,可灵活实现 **按需分工作表写入数据**,同时保留原文件内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值