在Python开发中,字符串与数字类型的相互转换是极其高频的操作。无论是处理用户输入、解析文件数据,还是进行网络通信,将字符串(`str`)转换为数字(`int`, `float`)都是必经之路。本文将从基础到进阶,系统讲解Python中字符串转数字的各种方法、技巧、陷阱及最佳实践。

一、基础转换:int 与 float

Python字符串转数字核心技术指南

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中字符串到数字的各类转换场景,写出更健壮、高效的代码。理解转换背后的原理与陷阱,远比单纯调用函数更重要——这是区分新手与资深工程师的关键所在。