1. Python数据处理实战:10个高频函数深度解析
在日常开发中,我们经常需要处理各种数据格式转换、验证和计算任务。下面这组Python函数涵盖了文件操作、字符串处理、日期格式化、数学运算等常见场景,每个函数都经过精心设计并附带完整实现代码。让我们逐一拆解这些实用工具函数的实现原理和注意事项。
1.1 Word文档表格数据提取与求和
处理Word文档中的表格数据是办公自动化中的常见需求。以下函数使用python-docx库读取.docx文件中的所有表格数据并计算总和:
python复制from docx import Document
def main():
doc = Document('data60.docx')
s = 0
for t in doc.tables:
for r in t.rows:
for c in r.cells:
s += int(c.text)
return s
关键点说明:
- Document对象是python-docx的核心类,用于表示整个Word文档
- tables属性返回文档中所有表格的列表
- 每个表格的rows属性提供行迭代器,cells属性获取单元格
- 使用int()转换文本内容时,确保单元格只包含数字字符
常见问题及解决方案:
- 报错"ValueError: invalid literal for int()":说明单元格包含非数字内容
- 解决方法:添加try-except块或预处理文本(如.strip())
- 表格数据量很大时内存消耗高
- 优化建议:分批处理或使用生成器表达式
1.2 千分位逗号处理与验证
金融数据常使用千分位逗号格式化大数字,以下函数实现了严格的格式验证和转换:
python复制def main(s):
try:
s1 = s.replace(',', '')
s1 = int(s1) # 尝试转换为整数验证有效性
n = s.split(',')
for i in range(len(n)):
if len(n[i]) > 3 or (i != 0 and len(n[i]) != 3):
return '数据错误'
except ValueError:
return '数据错误'
return s1
格式验证规则:
- 逗号分隔的每部分最多3位数字
- 第一个部分可以不足3位,但后续部分必须正好3位
- 整个字符串必须能转换为有效整数
测试用例示例:
- 合法输入:'1,234' → 1234
- 非法输入:'12,34' → '数据错误'
- 边界情况:'123' → 123(无逗号直接通过)
1.3 日期时间格式转换(去除前导零)
标准化日期时间格式是数据清洗的常见任务,以下函数智能去除各部分的前导零:
python复制def main(s):
alist = ['-', ':', ' ']
for a in alist:
s = s.replace(a + '0', a)
return s
处理逻辑说明:
- 识别日期时间分隔符:'-'、':'和空格
- 将"分隔符+0"的模式替换为单独的分隔符
- 保留原始字符串的其他部分不变
示例转换:
- 输入:'2020-02-18 22:02:22'
- 输出:'2020-2-18 22:2:22'
注意事项:
- 该方法不验证日期时间有效性
- 仅处理前导零,不处理中间或末尾的零
- 确保输入格式严格匹配'YYYY-MM-DD HH:MM:SS'
1.4 日期时间格式补零
与上一个函数相反,这个函数为日期时间各部分补上前导零:
python复制def main(s):
alist = s.split()
date = alist[0].split('-')
date = list(map(lambda x: '{:02d}'.format(int(x)), date))
time = alist[1].split(':')
time = list(map(lambda x: '{:02d}'.format(int(x)), time))
return '-'.join(date) + ' ' + ':'.join(time)
格式化细节:
- 使用split()分离日期和时间部分
- 对每部分应用'{:02d}'.format()确保两位数显示
- 月份、日期、小时、分钟、秒都会补零
- 年份保持4位数不变(不补零)
典型应用场景:
- 数据库存储前的数据标准化
- 不同系统间的数据交换
- 显示格式的统一处理
2. 数字格式化与数学运算
2.1 千分位逗号格式化
Python内置的字符串格式化功能可以轻松实现千分位逗号插入:
python复制def main(num):
return '{:,}'.format(num)
技术细节:
- format()方法的','选项自动按千分位添加逗号
- 仅适用于整数和浮点数
- 本地化考虑:某些地区使用句点而非逗号
扩展应用:
- 控制小数位数:'{:,.2f}'.format(1234.567) → '1,234.57'
- 结合其他格式:'+{:,}'.format(1234) → '+1,234'
2.2 数字逐位分隔
将数字的每位用逗号分隔,可用于教学演示或特殊显示需求:
python复制def main(num):
if type(num) != int:
return '数据错误'
return ','.join(str(num))
实现原理:
- 将数字转换为字符串
- 使用join()方法插入分隔符
- 严格验证输入类型
注意事项:
- 仅接受整数输入
- 负数处理:'-123' → '-','1','2','3'
- 大整数无压力:Python支持任意长度整数
2.3 素数判断与查找
素数是数论基础概念,以下实现包含判断和查找功能:
python复制def isPrime(k):
if k in (2, 3):
return True
if k % 2 == 0:
return False
for i in range(3, int(k**0.5)+2, 2):
if k % i == 0:
return False
return True
def main(start, num):
i = 0
while True:
if isPrime(start):
i += 1
if i == num:
return start
start += 1
优化技巧:
- 排除偶数(除2外)
- 只需检查到√n的范围
- 步长为2跳过偶数
- 提前处理小素数(2,3)
性能考虑:
- 对于极大数字,可使用Miller-Rabin概率测试
- 缓存已计算的素数可加速后续查询
- 并行计算可能加速批量验证
2.4 丑数验证
丑数是指质因数只包含2、3、5的正整数:
python复制def main(num):
while num % 2 == 0:
num = num / 2
while num % 3 == 0:
num = num / 3
while num % 5 == 0:
num = num / 5
return num == 1
算法逻辑:
- 不断除以2、3、5,直到不能再除
- 如果最终结果为1,则是丑数
- 否则包含其他质因数
应用场景:
- 解决某些数学问题
- 图像处理中的采样率选择
- 算法题目常见考点
3. 列表操作与排序
3.1 按数字各位和排序
根据数字各位之和进行排序,可用于特殊分类需求:
python复制def main(lst):
def digit_sum(n):
return sum(int(d) for d in str(n))
return sorted(lst, key=digit_sum)
实现细节:
- 定义内部函数计算数字各位和
- 使用sorted()的key参数指定排序依据
- 保持原列表不变,返回新列表
扩展应用:
- 支持负数:取绝对值计算
- 加权求和:不同位赋予不同权重
- 多级排序:结合其他条件
3.2 奇偶下标元素求和
分离列表中的奇偶下标元素并分别求和:
python复制def main(lst):
odd_sum = even_sum = 0
for i, num in enumerate(lst):
if i % 2 == 0:
even_sum += num
else:
odd_sum += num
return (odd_sum, even_sum)
代码优化点:
- 使用enumerate替代range(len())
- 元组解包初始化两个累加器
- 直接返回结果元组
边界情况处理:
- 空列表:返回(0,0)
- 单元素列表:返回(0,元素值)
- 非数值元素:会引发TypeError
这些Python函数涵盖了日常开发中的多种常见需求,从简单的字符串处理到复杂的数学运算,展示了Python在数据处理方面的强大能力和灵活性。在实际应用中,可以根据具体需求进行调整和优化,比如添加更严格的输入验证、提高性能或扩展功能。