讲师中心 微信公众号

工具推荐

视频效率加速
立刻MV
立刻MV

低成本歌曲 MV、视频生成

剧云
剧云

中文短剧剧本制作平台

updream

一键生成高质量推广成片

AniShort
AniShort

AI短剧协同制作平台

python如何将字符串转换为整数_python字符串与整数类型转换技巧

轻芳酱_6941

轻芳酱_6941

发布时间:2025-09-12 12:03:01

|

777人浏览过

|

来源于php中文网

原创

使用int()函数可将字符串转为整数,支持指定进制和自动忽略空白字符,但非法字符会引发ValueError;可通过try-except处理异常,或用正则提取数字;浮点字符串需先转float再转int,可选择截断、四舍五入等策略;大批量转换时推荐map()或numpy以提升性能。

python如何将字符串转换为整数_python字符串与整数类型转换技巧

在Python中,将字符串转换为整数的核心方法是使用内置的

int()
函数。这个函数非常直接,能处理标准的数字字符串,但处理不当也容易引发
ValueError
,因此理解其工作原理和错误处理至关重要。

解决方案

Python 提供了一个直观且强大的内置函数

int()
来实现字符串到整数的转换。最基本的用法就是直接将字符串作为参数传入:

# 基本转换
s_num = "12345"
i_num = int(s_num)
print(f"字符串 '{s_num}' 转换为整数:{i_num}, 类型:{type(i_num)}") # 输出:12345, 类型:<class 'int'>

# 负数转换
s_neg_num = "-678"
i_neg_num = int(s_neg_num)
print(f"字符串 '{s_neg_num}' 转换为整数:{i_neg_num}") # 输出:-678

# 带有前导或尾随空格的字符串
# int() 函数会自动忽略前导和尾随的空白字符
s_padded_num = "   9012   "
i_padded_num = int(s_padded_num)
print(f"字符串 '{s_padded_num}' 转换为整数:{i_padded_num}") # 输出:9012

# 指定进制进行转换
# int() 函数还可以接受第二个可选参数 `base`,用于指定字符串表示的数字的进制
s_binary = "1011" # 二进制的1011是十进制的11
i_binary = int(s_binary, 2)
print(f"二进制字符串 '{s_binary}' 转换为整数:{i_binary}") # 输出:11

s_hex = "FF" # 十六进制的FF是十进制的255
i_hex = int(s_hex, 16)
print(f"十六进制字符串 '{s_hex}' 转换为整数:{i_hex}") # 输出:255

然而,当字符串内容不符合整数格式时,

int()
函数会抛出
ValueError
。这包括空字符串、包含非数字字符(除了合法的正负号)的字符串,或者浮点数字符串。

# 错误示例:包含非数字字符
try:
    int("12a3")
except ValueError as e:
    print(f"尝试转换 '12a3' 失败:{e}") # 输出:invalid literal for int() with base 10: '12a3'

# 错误示例:空字符串
try:
    int("")
except ValueError as e:
    print(f"尝试转换 '' 失败:{e}") # 输出:invalid literal for int() with base 10: ''

# 错误示例:浮点数字符串(直接转换)
try:
    int("3.14")
except ValueError as e:
    print(f"尝试转换 '3.14' 失败:{e}") # 输出:invalid literal for int() with base 10: '3.14'

为了稳健地处理这些潜在的错误,通常会结合

try-except
语句来捕获
ValueError
,从而避免程序崩溃,并提供优雅的错误处理机制。

立即学习“Python免费学习笔记(深入)”;

def safe_str_to_int(s):
    try:
        return int(s)
    except ValueError:
        print(f"警告:无法将 '{s}' 转换为整数,返回 None。")
        return None

print(safe_str_to_int("123"))      # 输出:123
print(safe_str_to_int("abc"))      # 输出:警告:无法将 'abc' 转换为整数,返回 None。 None
print(safe_str_to_int("12.5"))     # 输出:警告:无法将 '12.5' 转换为整数,返回 None。 None

如何安全地将包含非数字字符的字符串转换为整数?

在实际开发中,我们经常会遇到字符串中夹杂着数字和非数字字符的情况,比如从用户输入、文件读取或网页抓取中获取的“价格:120元”、“温度25℃”这类数据。直接使用

int()
显然会失败。要安全地从中提取整数,我们需要一些预处理。

一种常见且有效的方法是使用正则表达式(

re
模块)来“清洗”字符串,只保留数字和可能的负号,然后再进行转换。

import re

def extract_and_convert_int(text):
    # 匹配字符串开头可选的负号,后面跟着一个或多个数字
    # 或者只匹配一个或多个数字
    match = re.search(r'^-?\d+', text)
    if match:
        try:
            return int(match.group(0))
        except ValueError:
            # 理论上,如果正则表达式匹配成功,int() 不应该失败,
            # 但为了极致的健壮性,这里依然保留。
            print(f"内部错误:'{match.group(0)}' 匹配成功但转换失败。")
            return None
    else:
        print(f"字符串 '{text}' 中未找到可转换的整数部分。")
        return None

print(extract_and_convert_int("价格:120元"))      # 输出:120
print(extract_and_convert_int("温度-25℃"))      # 输出:-25
print(extract_and_convert_int("订单号ABC123XYZ")) # 输出:123
print(extract_and_convert_int("没有数字的字符串")) # 输出:字符串 '没有数字的字符串' 中未找到可转换的整数部分。 None
print(extract_and_convert_int("123.45元"))      # 输出:123 (只提取了整数部分)
print(extract_and_convert_int("-50.5度"))       # 输出:-50

上述

re.search(r'^-?\d+', text)
会从字符串开头查找一个可选的负号 (
-?
) 后面跟着一个或多个数字 (
\d+
)。这对于提取字符串开头的整数非常有效。如果数字可能出现在字符串的任何位置,并且我们只想提取第一个数字序列,可以简化正则表达式为
r'-?\d+'
。

另一种思路是,如果知道字符串中只有数字和一些特定的非数字字符需要移除,可以使用

str.replace()
或
re.sub()
来移除这些字符。

Zyt text to digital person
Zyt text to digital person

使用禅境文字转数字人API,创建AI人像图片,将其转换为说话视频,可选运行LoRA训练,轮询异步任务等。

下载
def clean_and_convert(text, chars_to_remove='元℃'):
    cleaned_text = text
    for char in chars_to_remove:
        cleaned_text = cleaned_text.replace(char, '')

    # 移除所有非数字和非负号字符,但要小心处理负号的位置
    # 更安全的做法是先尝试匹配整个数字
    match = re.match(r'^-?\d+$', cleaned_text.strip())
    if match:
        try:
            return int(match.group(0))
        except ValueError:
            print(f"清理后的字符串 '{cleaned_text}' 转换失败。")
            return None
    else:
        print(f"清理后的字符串 '{cleaned_text}' 不是纯整数格式。")
        return None

print(clean_and_convert("价格:120元")) # 输出:清理后的字符串 '价格:120' 不是纯整数格式。 None (因为'价格:'没被移除)
print(clean_and_convert("120元", chars_to_remove='元')) # 输出:120
print(clean_and_convert("-25℃", chars_to_remove='℃')) # 输出:-25

可以看出,

clean_and_convert
方法在处理复杂字符串时不如正则表达式灵活,它更适用于已知特定字符需要移除的场景。通常,正则表达式是处理这种“非数字字符混杂”问题的首选,因为它能更精确地定义我们想要匹配的“数字模式”。

在Python中处理浮点数字符串转换为整数的几种策略是什么?

当字符串代表的是浮点数(如 "3.14" 或 "10.99"),而我们最终需要一个整数时,直接使用

int()
会引发
ValueError
。这时,我们需要先将字符串转换为浮点数,然后再将浮点数转换为整数。从浮点数到整数的转换有几种不同的策略,取决于我们希望如何处理小数部分:

  1. 直接截断 (Truncation): 这是最简单直接的方式,Python 的

    int()
    函数在将浮点数转换为整数时,会直接截断小数部分,只保留整数部分。这相当于向下取整(对于正数)或向上取整(对于负数)。

    s_float1 = "3.14"
    s_float2 = "3.99"
    s_float3 = "-2.7"
    
    i_trunc1 = int(float(s_float1))
    i_trunc2 = int(float(s_float2))
    i_trunc3 = int(float(s_float3))
    
    print(f"'{s_float1}' 截断后:{i_trunc1}") # 输出:3
    print(f"'{s_float2}' 截断后:{i_trunc2}") # 输出:3
    print(f"'{s_float3}' 截断后:{i_trunc3}") # 输出:-2 (注意:对于负数,是向0取整)
  2. 四舍五入 (Rounding): 如果希望将浮点数四舍五入到最接近的整数,可以使用内置的

    round()
    函数。
    round()
    函数在Python 3中遵循“银行家舍入法”(或称“四舍六入五成双”),即当小数部分恰好为
    .5
    时,会舍入到最近的偶数。

    s_float4 = "3.4"
    s_float5 = "3.5"
    s_float6 = "3.6"
    s_float7 = "2.5" # 银行家舍入法示例
    s_float8 = "-3.5"
    
    i_round4 = int(round(float(s_float4)))
    i_round5 = int(round(float(s_float5)))
    i_round6 = int(round(float(s_float6)))
    i_round7 = int(round(float(s_float7)))
    i_round8 = int(round(float(s_float8)))
    
    print(f"'{s_float4}' 四舍五入后:{i_round4}") # 输出:3
    print(f"'{s_float5}' 四舍五入后:{i_round5}") # 输出:4 (因为3.5到4的距离和到3的距离相等,round()倾向于偶数)
    print(f"'{s_float6}' 四舍五入后:{i_round6}") # 输出:4
    print(f"'{s_float7}' 四舍五入后:{i_round7}") # 输出:2 (2.5到2的距离和到3的距离相等,round()倾向于偶数)
    print(f"'{s_float8}' 四舍五入后:{i_round8}") # 输出:-4 (对于负数,-3.5到-4的距离和到-3的距离相等,round()倾向于偶数)

    如果你需要传统的“四舍五入”(即

    .5
    总是向上取整),可以手动实现:
    int(f + 0.5)
    对于正数有效,但对负数不适用,更通用的方法是
    int(f + 0.5) if f >= 0 else int(f - 0.5)
    或者使用
    decimal
    模块。

  3. 向上取整 (Ceiling): 总是向正无穷方向取整,即无论小数部分是什么,都向上取到下一个整数。需要导入

    math
    模块。

    import math
    
    s_float9 = "3.14"
    s_float10 = "3.99"
    s_float11 = "-2.7"
    s_float12 = "-2.1"
    
    i_ceil9 = int(math.ceil(float(s_float9)))
    i_ceil10 = int(math.ceil(float(s_float10)))
    i_ceil11 = int(math.ceil(float(s_float11)))
    i_ceil12 = int(math.ceil(float(s_float12)))
    
    print(f"'{s_float9}' 向上取整后:{i_ceil9}")   # 输出:4
    print(f"'{s_float10}' 向上取整后:{i_ceil10}") # 输出:4
    print(f"'{s_float11}' 向上取整后:{i_ceil11}") # 输出:-2
    print(f"'{s_float12}' 向上取整后:{i_ceil12}") # 输出:-2
  4. 向下取整 (Floor): 总是向负无穷方向取整,即无论小数部分是什么,都向下取到上一个整数。同样需要导入

    math
    模块。

    import math
    
    s_float13 = "3.14"
    s_float14 = "3.99"
    s_float15 = "-2.7"
    s_float16 = "-2.1"
    
    i_floor13 = int(math.floor(float(s_float13)))
    i_floor14 = int(math.floor(float(s_float14)))
    i_floor15 = int(math.floor(float(s_float15)))
    i_floor16 = int(math.floor(float(s_float16)))
    
    print(f"'{s_float13}' 向下取整后:{i_floor13}") # 输出:3
    print(f"'{s_float14}' 向下取整后:{i_floor14}") # 输出:3
    print(f"'{s_float15}' 向下取整后:{i_floor15}") # 输出:-3
    print(f"'{s_float16}' 向下取整后:{i_floor16}") # 输出:-3

选择哪种策略取决于具体的业务需求。如果只是简单地丢弃小数,

int(float(s))
就足够了;如果需要精确的四舍五入,
round()
结合
int()
是个好选择;而
math.ceil()
和
math.floor()
则提供了明确的向上或向下取整行为。

性能考量:大量字符串到整数转换时,有哪些优化建议?

在处理少量字符串到整数的转换时,

int()
函数的性能通常不是问题。然而,当需要处理成千上万甚至数百万条数据,例如从大型CSV文件或数据库查询结果中解析数据时,转换的效率就变得至关重要。

  1. 避免不必要的错误处理开销:

    try-except
    块虽然能增强代码的健壮性,但在循环中频繁使用时,如果预期会有大量异常发生,其性能开销会比较大。如果能提前对字符串进行校验,确保它们是合法的数字字符串,就可以减少
    try-except
    的执行频率,从而提升性能。

    # 假设有一个函数可以预先检查字符串是否为纯数字
    def is_numeric(s):
        return s.strip().isdigit() or (s.strip().startswith('-') and s.strip()[1:].isdigit())
    
    data_strings = ["123", "456", "abc", "789", "-100", "xyz"]
    results = []
    for s in data_strings:
        if is_numeric(s):
            results.append(int(s))
        else:
            # 处理非数字字符串,例如跳过或记录错误
            pass
    print(f"预校验后的转换结果:{results}")

    这种预校验的开销可能与

    try-except
    相当,甚至更高,具体取决于
    is_numeric
    的实现。通常,Pythonic 的做法是“请求许可不如请求原谅”(Easier to Ask for Forgiveness than Permission,EAFP),即直接尝试转换并捕获异常。只有当异常预期会非常频繁,且预校验的成本显著低于异常处理时,才考虑预校验。

  2. 使用

    map()
    函数: 对于简单的、无条件转换的场景,
    map()
    函数通常比列表推导式或显式
    for
    循环更快,因为它在C语言层面实现,减少了Python解释器的开销。

    list_of_strings = [str(i) for i in range(100000)] # 10万个字符串
    
    # 使用列表推导式
    import time
    start_time = time.perf_counter()
    ints_lc = [int(s) for s in list_of_strings]
    end_time = time.perf_counter()
    print(f"列表推导式耗时:{(end_time - start_time):.6f} 秒")
    
    # 使用 map()
    start_time = time.perf_counter()
    ints_map = list(map(int, list_of_strings))
    end_time = time.perf_counter()
    print(f"map() 函数耗时:{(end_time - start_time):.6f} 秒")
    
    # 结果通常是 map() 稍快

    然而,

    map()
    仅适用于每个元素都进行相同且简单的操作,如果需要复杂的预处理或条件逻辑,列表推导式或自定义循环可能更具可读性和灵活性。

  3. 利用

    numpy
    (对于数值数组): 如果你的数据已经以
    numpy
    数组的形式存在,或者你需要处理的数据量非常大且是纯数值的字符串(例如从CSV加载),
    numpy
    提供了高效的类型转换方法。
    numpy
    的操作通常在底层C或Fortran实现,性能远超纯Python循环。

    import numpy as np
    
    # 创建一个包含数字字符串的numpy数组
    np_string_array = np.array([str(i) for i in range(1000000)]) # 100万个字符串
    
    start_time = time.perf_counter()
    # 使用astype() 方法进行类型转换
    np_int_array = np_string_array.astype(int)
    end_time = time.perf_counter()
    print(f"NumPy astype() 耗时:{(end_time - start_time):.6f} 秒")
    
    # 注意:如果字符串中包含非数字字符,astype(int) 同样会报错
    # np.array(["123", "abc"]).astype(int) 会引发 ValueError

    numpy
    适用于数据结构规整、类型统一的场景。如果字符串可能包含混合类型或需要复杂清洗,
    numpy
    的优势就不那么明显了,可能需要结合其他方法先进行预处理。

  4. 分批处理 (Batch Processing): 对于海量数据,一次性加载所有数据并转换可能会占用过多内存。可以考虑分批读取和处理数据,例如每次读取10000行,处理完毕后再读取下一批。这有助于控制内存使用,并且在某些

相关文章

python速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

4916

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

3381

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

9422

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

832

2023.08.11

正则表达式空格
正则表达式空格

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

520

2023.08.31

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

693

2023.11.13

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

406

2023.11.17

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

739

2023.12.06

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

60

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn