做数据处理、写爬虫、搞自动化脚本,Python里最常打交道的就是字符串。可现实很骨感:API返回的是字符串,Excel读出来是字符串,用户输入也是字符串——但你要算加法、比大小、转日期,就得先把它变成数字、布尔、datetime……别急,这些转换其实都有现成解法。
字符串转数字
最常见的是转整数和浮点数:
int('123') # → 123
float('3.14') # → 3.14
int(' 42 ') # → 42(自动去空格)
注意:带字母或空格的会报错,比如 int('12a') 或 int(' 12 ')(中间有空格)不行,得先用 strip() 清理:
s = ' 123 '
num = int(s.strip()) # → 123
字符串转布尔值
Python没有内置的 bool('true') 直接映射,因为 bool('false') 居然也是 True(非空字符串恒为真):
bool('false') # → True(不是你想要的结果!)
稳妥做法是手动判断:
def str_to_bool(s):
return s.lower() in ('true', '1', 'yes', 'on')
str_to_bool('True') # → True
str_to_bool('0') # → False
字符串转列表或元组
逗号分隔的字符串转列表?用 split():
'apple,banana,orange'.split(',') # → ['apple', 'banana', 'orange']
'1-2-3-4'.split('-') # → ['1', '2', '3', '4']
如果想转成数字列表,套个 map 就行:
list(map(int, '1,2,3'.split(','))) # → [1, 2, 3]
字符串转字典
JSON格式字符串最常用:
import json
s = '{"name": "张三", "age": 28}'
data = json.loads(s) # → {'name': '张三', 'age': 28}
普通键值对字符串(如 name=张三&age=28),可以用 urllib.parse.parse_qs:
from urllib.parse import parse_qs
qs = 'name=%E5%BC%A0%E4%B8%89&age=28'
parse_qs(qs) # → {'name': ['张三'], 'age': ['28']}
字符串转日期时间
从日志、表单、文件名里提取时间,datetime.strptime 是主力:
from datetime import datetime
s = '2024-05-20 14:30:00'
dt = datetime.strptime(s, '%Y-%m-%d %H:%M:%S')
常见格式码记两三个就够用:%Y(4位年)、%m(月)、%d(日)、%H(时)、%M(分)、%S(秒)。
字符串转字节与编码互转
网络请求、文件读写经常遇到编码问题:
'你好'.encode('utf-8') # → b'\xe4\xbd\xa0\xe5\xa5\xbd'
b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode('utf-8') # → '你好'
如果不确定编码,可以试试 chardet 库检测(先 pip install chardet):
import chardet
raw = b'\xc4\xe3\xba\xc3' # GBK 编码的 '你好'
encoding = chardet.detect(raw)['encoding'] # → 'GB2312'
raw.decode(encoding)
其他实用小技巧
• 字符串转 ASCII 码列表:[ord(c) for c in 'abc'] → [97, 98, 99]
• ASCII 码列表转字符串:bytes([97, 98, 99]).decode() → 'abc'
• 十六进制字符串转字节:bytes.fromhex('68656c6c6f') → b'hello'
• 字节转十六进制字符串:b'hello'.hex() → '68656c6c6f'
避坑提醒
• eval() 能转字符串为任意 Python 对象,但极度危险,千万别用在不可信输入上;
• ast.literal_eval() 安全得多,只支持基础类型(str、int、list、dict等);
• 所有转换操作都建议包在 try/except 里,尤其面对用户输入或外部数据时。