在Python开发中,字符串与数字类型的相互转换是极其高频的操作。无论是处理用户输入、解析文件数据,还是进行网络通信,将字符串(`str`)转换为数字(`int`, `float`)都是必经之路。本文将从基础到进阶,系统讲解Python中字符串转数字的各种方法、技巧、陷阱及最佳实践。
一、基础转换:int 与 float
Python内置函数 `int` 和 `float` 是字符串转数字的核心工具。
1. 整数转换:`int`
python
num_str = "42
num_int = int(num_str)
print(num_int) 输出: 42
print(type(num_int)) 输出:
2. 浮点数转换:`float`
python
num_str = "3.14159
num_float = float(num_str)
print(num_float) 输出: 3.14159
3. 处理进制转换
`int` 支持将不同进制的字符串转为十进制整数:
python
binary_str = "1010
hex_str = "FF
octal_str = "755
print(int(binary_str, 2)) 二进制转十进制 → 10
print(int(hex_str, 16)) 十六进制转十进制 → 255
print(int(octal_str, 8)) 八进制转十进制 → 493
二、处理转换异常:避免程序崩溃
直接转换可能因非法字符导致 `ValueError` 或 `TypeError`,必须捕获异常。
1. 基础异常处理
python
def safe_convert(s):
try:
return int(s)
except ValueError:
try:
return float(s)
except ValueError:
return None 或抛出自定义异常
print(safe_convert("123")) 123
print(safe_convert("12.3")) 12.3
print(safe_convert("abc")) None
2. 创建健壮的转换函数
python
def str_to_number(s, default=0):
安全转换字符串为数字,失败返回默认值
for converter in (int, float):
try:
return converter(s)
except (ValueError, TypeError):
continue
return default
三、高级转换技巧
1. 处理千位分隔符
python
num_str = "1,000,000
cleaned = num_str.replace(',', '') 移除逗号
num_int = int(cleaned) 1000000
2. 科学计数法转换
`float` 自动支持科学计数法:
python
sci_str = "2.5e3
num_float = float(sci_str) 2500.0
3. 使用 `ast.literal_eval` 安全评估
python
import ast
s = "[1, 2, 3.5]" 可解析列表中的数字
parsed = ast.literal_eval(s) [1, 2, 3.5]
> ⚠️ 注意:`eval` 有安全风险!绝对不要用其解析不可信来源的字符串。
四、深入理解:转换过程中的“陷阱”
1. 浮点数的精度问题
python
s = "0.1
f = float(s)
print(f) 0.1
print(f 3) 0.000004 → 浮点数精度问题
解决方案: 对精度要求高的场景(如金融计算),使用 `decimal` 模块:
python
from decimal import Decimal
s = "0.1
d = Decimal(s)
print(d 3) 0.3
2. 空字符串与空白字符
python
int(" ") ValueError
建议: 始终先调用 `s.strip` 清理字符串:
python
s = " 42
num = int(s.strip) 安全
3. 非ASCII数字字符
某些语言环境可能使用非阿拉伯数字(如中文“一二三”),需特殊处理:
python
示例:转换中文数字
cn_map = {'一': 1, '二': 2, '三': 3}
s = "一二三
num = int(''.join(str(cn_map[c]) for c in s)) 123
五、性能优化建议
1. 避免重复转换
python
低效做法
for s in str_list:
process(int(s))
高效做法
num_list = [int(s) for s in str_list]
for num in num_list:
process(num)
2. 使用 `map` 加速批量转换
python
str_list = ["1", "2", "3"]
num_list = list(map(int, str_list)) [1, 2, 3]
3. 预编译正则表达式(复杂解析)
python
import re
pattern = pile(r'd+') 预编译
numbers = [int(match) for match in pattern.findall(text)]
六、特殊场景处理指南
1. 解析混合文本中的数字
python
text = "ID: 007, Price: $19.99
import re
prices = re.findall(r'd+.d+|d+', text) ['007', '19.99']
2. 处理货币符号
python
price_str = "$29.99
clean = price_str.lstrip('$€¥£') 移除常见货币符号
amount = float(clean)
3. 自定义复杂格式解析
python
s = "Score: 85.5%
提取数字并转换
score = float(s.split(':')[1].strip.rstrip('%'))
七、与最佳实践
1. 核心方法:优先使用 `int` 和 `float` 进行基础转换。
2. 安全第一:始终使用 `try-except` 处理可能的转换异常。
3. 数据清洗:转换前用 `strip` 移除空白字符,处理分隔符。
4. 高精度需求:涉及财务等敏感计算时,用 `decimal.Decimal` 替代 `float`。
5. 批量处理:使用列表推导式或 `map` 提升性能。
6. 复杂文本:结合正则表达式(`re` 模块)提取数字字符串。
7. 避免 `eval`:对不可信输入源,绝对禁止使用 `eval`。
> 深度建议:在大型项目中,封装统一转换工具函数。将异常处理、日志记录、默认值策略集中管理,避免散落的转换代码导致维护困难和安全风险。
python
示例:项目级转换工具
def to_number(s, logger=None, default=0):
try:
return float(s) if '.' in s else int(s)
except Exception as e:
if logger:
logger.error(f"Convert failed: {s}, error: {e}")
return default
通过掌握上述技巧,您将能游刃有余地处理Python中字符串到数字的各类转换场景,写出更健壮、高效的代码。理解转换背后的原理与陷阱,远比单纯调用函数更重要——这是区分新手与资深工程师的关键所在。