在数据处理、日志分析等场景中,从文本文件中提取数值并完成计算是Python开发者的常见需求。无论是处理结构化的表格文本,还是非结构化的日志内容,都可以通过合适的Python方法高效实现目标。

文本文件读取基础
首先需要根据文本文件的编码和格式选择合适的读取方式,Python内置的open函数可以满足大部分读取需求。以下是读取普通文本文件的基础示例:
# 读取文本文件全部内容
file_path = "data.txt"
try:
with open(file_path, "r", encoding="utf-8") as f:
content = f.read()
print("文件读取成功,内容长度:", len(content))
except FileNotFoundError:
print("目标文件不存在")
except UnicodeDecodeError:
print("文件编码不匹配,请调整encoding参数")
数值提取方法
正则匹配提取数值
对于非结构化的文本,使用正则表达式可以快速匹配出所有数值,包括整数、小数、负数等类型。Python的re模块提供了完善的正则匹配能力:
import re
def extract_numbers(text):
# 匹配整数、小数、负数,支持科学计数法
pattern = r"-?d+.?d*(?:[eE][+-]?d+)?"
numbers = re.findall(pattern, text)
# 转换为浮点型,空字符串跳过
result = []
for num in numbers:
if num:
result.append(float(num))
return result
# 测试提取效果
test_text = "今日销售额120.5元,昨日销售额-30.2元,增长率1.2e2%"
numbers = extract_numbers(test_text)
print("提取到的数值:", numbers)
结构化文本提取
如果文本是结构化的,比如每行包含固定格式的数值,也可以通过字符串分割的方式提取:
def extract_from_structured_text(file_path):
numbers = []
with open(file_path, "r", encoding="utf-8") as f:
for line in f:
# 假设每行格式为 "id: 数值"
parts = line.strip().split(": ")
if len(parts) == 2:
try:
num = float(parts[1])
numbers.append(num)
except ValueError:
# 非数值内容跳过
pass
return numbers
# 假设data_struct.txt内容为:
# item1: 10
# item2: 20.5
# item3: 30
numbers = extract_from_structured_text("data_struct.txt")
print("结构化文本提取的数值:", numbers)
常见数值计算场景
基础统计计算
提取到数值后,可以完成求和、平均值、最大值、最小值等基础统计计算:
def calculate_stats(numbers):
if not numbers:
return None
total = sum(numbers)
avg = total / len(numbers)
max_val = max(numbers)
min_val = min(numbers)
return {
"总和": total,
"平均值": avg,
"最大值": max_val,
"最小值": min_val
}
test_numbers = [10, 20.5, 30, -5, 12.3]
stats = calculate_stats(test_numbers)
print("统计结果:", stats)
批量数值运算
如果需要完成批量数值的自定义运算,比如统一乘以系数、过滤特定范围数值等,也可以通过简单的逻辑实现:
def batch_calculate(numbers, coefficient=1.0, min_limit=None, max_limit=None):
result = []
for num in numbers:
# 过滤范围外的数值
if min_limit is not None and num < min_limit:
continue
if max_limit is not None and num > max_limit:
continue
# 乘以系数
new_num = num * coefficient
result.append(new_num)
return result
original_numbers = [1, 2, 3, 4, 5]
# 过滤大于2的数值,再乘以3
processed = batch_calculate(original_numbers, coefficient=3, min_limit=2)
print("处理后的数值:", processed)
完整实践示例
以下是一个完整的从文本文件提取数值并计算总和的示例,包含异常处理和完整流程:
import re
def process_text_file(file_path):
try:
with open(file_path, "r", encoding="utf-8") as f:
content = f.read()
# 提取数值
pattern = r"-?d+.?d*(?:[eE][+-]?d+)?"
num_strs = re.findall(pattern, content)
numbers = []
for s in num_strs:
if s:
numbers.append(float(s))
if not numbers:
return "文件中未提取到有效数值"
total = sum(numbers)
return f"提取到{len(numbers)}个数值,总和为{total}"
except FileNotFoundError:
return "文件不存在,请检查路径"
except Exception as e:
return f"处理过程出现异常:{str(e)}"
# 调用函数
result = process_text_file("test_data.txt")
print(result)
注意事项
- 读取文件时需要确认编码格式,避免中文乱码问题,常见编码包括utf-8、gbk等
- 正则匹配提取数值时,需要根据实际文本格式调整匹配规则,避免误匹配非数值内容
- 转换数值类型时需要添加异常处理,避免文本中的非数值内容导致程序报错
- 处理大文件时建议使用逐行读取的方式,避免一次性加载全部内容占用过多内存