Python技术迷

解释Python中的join()和split()函数。

前两天在公司加班到快十点,我跟我们组的小李在茶水间闲聊,他问我一个特别基础但又很容易踩坑的东西:Python 里那个 join() 和 split(),到底该怎么理解,什么时候该用哪个?我一听乐了,这俩函数平时写脚本用得飞起,可真要系统地说清楚,还真得花点时间。我索性就整理了一篇文章,既能帮小李理顺,也能给其他刚入门或者用得模糊的同学一个参考。

先从 split() 说起

场景很常见,你从一个日志里读到一行 "ERROR 2025-08-25 Something failed",你想把它拆成几个部分来分析。这时候 split() 就是救命的。

line = "ERROR 2025-08-25 Something failed"
parts = line.split(" ")
print(parts)
# ['ERROR', '2025-08-25', 'Something', 'failed']

split() 的基本作用,就是把一个长字符串按指定的分隔符切开,得到一个列表。如果你不写参数,它默认是按照空格、换行、制表符这些空白符来分的。小李当时说,他有一次写错,想要拆 "a,b,c",结果用 split() 没传参数,直接就得到一个 ['a,b,c'],完全没拆开,差点查半天 bug。其实只要传对分隔符:

text = "a,b,c"
print(text.split(","))  
# ['a', 'b', 'c']

还有一点特别容易忽略,就是 split() 可以传第二个参数 maxsplit,用来限制最多拆多少次。比如:

data = "user:1001:active"
print(data.split(":", 1))
# ['user', '1001:active']

这在处理带有多级结构的数据时特别有用,不然一下子全拆开就不好控制了。

再看看 join()

join() 和 split() 就像一对兄弟,一个拆,一个合。经常有人搞混,把 join() 当成字符串拼接函数,结果写出类似 s.join("a", "b") 的代码,立马报错。其实它的用法是反过来的,join() 是“字符串方法”,前面的那个字符串是用作“分隔符”的。

words = ['Python', 'is', 'fun']
sentence = " ".join(words)
print(sentence)
# Python is fun

所以理解的关键点是:join() 不是随便两个字符串合并,而是用一个字符串把一堆列表里的元素拼起来。你要用逗号,就写 ",".join(list);要用换行符,就写 "\n".join(list)。

举个真实场景,我们当时在写一个导出 CSV 的脚本,需要把每一行的字段拼成逗号分隔的文本。用 join() 特别顺手:

fields = ["id", "name", "age"]
line = ",".join(fields)
print(line)
# id,name,age

join 和 split 的配合

我跟小李说,你只要记住:split() 把字符串变成列表,join() 把列表变回字符串。它们是可逆的,但要注意分隔符得一致。

s = "a-b-c-d"
parts = s.split("-")
print(parts)  # ['a', 'b', 'c', 'd']

back = "-".join(parts)
print(back)  # a-b-c-d

如果分隔符不一致,那就回不去了。比如你用空格拼接,结果肯定跟原始字符串不一样。

常见坑点

这个地方我特意提醒过小李,不然以后面试的时候很容易被问到。

  1. join() 只能拼接字符串如果列表里有数字,直接 join() 会报错:

    nums = [1, 2, 3]
    "-".join(nums)  # TypeError

    正确做法:

    "-".join(map(str, nums))
  2. split() 遇到多个空格默认的 split() 会把连续的空格当成一个分隔符:

    s = "a   b   c"
    print(s.split())
    # ['a', 'b', 'c']

    如果你想严格按照单个空格拆,那得写 split(" "):

    print(s.split(" "))
    # ['a', '', '', 'b', '', '', 'c']
  3. 处理大文件要小心我有一次处理几百 MB 的日志,直接 split("\n"),结果内存爆掉。后来才发现更好的办法是逐行读,而不是一口气全切开。

进阶玩法

说点稍微进阶的。比如,有些数据需要“部分拆分再拼接”,用 split() 和 join() 灵活组合就能搞定。

假设有一堆 URL:

urls = ["https://example.com/page/1", "https://example.com/page/2"]

想把最后的数字提出来再改一改:

for u in urls:
    parts = u.split("/")
    parts[-1] = str(int(parts[-1]) + 10)
    new_url = "/".join(parts)
    print(new_url)
# https://example.com/page/11
# https://example.com/page/12

这个方法比用正则还直观。

还有一个技巧是结合 splitlines(),它是专门用来按行拆分的,比 split("\n") 更智能,可以兼容不同操作系统的换行符。

text = "first line\r\nsecond line\nthird line"
print(text.splitlines())
# ['first line', 'second line', 'third line']

记得去年双十一的时候,我们做一个促销短信的模板替换,里面有点类似 "亲爱的{user},您在{date}购买的商品...",我当时一开始写了个很傻的逻辑,用 split("{") 再拼回去,结果一大堆边界情况没处理好,搞得短信里经常出现半个大括号。后来反应过来,split() 是可以嵌套用的,但遇到这种情况其实更适合用 str.format() 或者 re.sub()。不过那次也让我对 split() 的局限性有了更深刻的印象。

split() 拆,join() 合,看清楚谁是列表谁是字符串,别搞反了。小李后来听完,立马在他正在写的脚本里改了几个地方,立马清爽了很多。

写到这里,估计字数也差不多了,其实还有不少细节,比如 rsplit()(从右边拆)和 partition() 这些也能部分替代 split() 的场景,但我怕一口气说太多反而记不住。

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

🔥虎哥私藏精品🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领