当前位置:首页>python>Python 中 join() 和 split() 函数有什么区别?

Python 中 join() 和 split() 函数有什么区别?

  • 2026-10-11 07:30:06
Python 中 join() 和 split() 函数有什么区别?

报错是这么来的:

ValueError: too many values to unpack

盯着日志看了两分钟,最后发现不是接口返回错了,也不是文件编码问题,就是一行字符串被 split() 拆多了。

这类问题在 Python 里很常见。join() 和 split() 看着都在处理字符串,但方向正好反着。

split() 是把一个字符串拆成列表。

join() 是把一个列表拼回字符串。

别背概念,直接看现场。

比如有个接口返回了一串商品编码:

raw_codes = "A102,B881,C009,D777"

codes = raw_codes.split(",")

print(codes)
# ['A102', 'B881', 'C009', 'D777']

这里 split(",") 的意思很直接:遇到逗号就切一刀。

所以原来是一整个字符串:

"A102,B881,C009,D777"

拆完以后变成了列表:

['A102', 'B881', 'C009', 'D777']

我一般在处理配置、日志、CSV 小文件时,经常会这么干。尤其是那种后台导出来的字段,看着像一行,其实里面塞了好几个值。

比如:

line = "10086|paid|2026-05-10 09:31:22|Denver"

order_id, status, pay_time, city = line.split("|")

print(order_id)
print(status)

这段代码能跑,前提是这一行永远只有 4 段。

但线上数据不会这么老实。

哪天多塞一个字段:

line = "10086|paid|2026-05-10 09:31:22|Denver|coupon_30"

再用刚才那句:

order_id, status, pay_time, city = line.split("|")

就会炸。

我通常不会直接这么写,至少会先兜一下:

line = "10086|paid|2026-05-10 09:31:22|Denver|coupon_30"

parts = line.split("|", 4)

order_id = parts[0]
status = parts[1]
pay_time = parts[2]
city = parts[3]
extra = parts[4] if len(parts) > 4else""

print(order_id, status, city, extra)

注意这里的 split("|", 4)。

第二个参数不是随便写的,它表示最多切 4 次。这个细节挺容易被忽略。数据里如果后面还有乱七八糟的备注字段,直接无限切,后面解析就容易错位。

再看 join()。

它干的是反方向的事:把列表里的字符串,用某个分隔符拼起来。

codes = ["A102", "B881", "C009", "D777"]

raw_codes = ",".join(codes)

print(raw_codes)
# A102,B881,C009,D777

这地方有个写法,刚开始看可能别扭:

",".join(codes)

为什么不是 codes.join(",")?

因为在 Python 里,join() 是字符串的方法。前面的 "," 才是拼接时用的分隔符。

换句话说:

",".join(codes)

意思是:用逗号把 codes 里的元素粘起来。

你想用竖线,就这么写:

"|".join(codes)
# A102|B881|C009|D777

想用空格:

" ".join(codes)
# A102 B881 C009 D777

有个坑我见过不少次。

items = ["order", 10086, "paid"]

text = ",".join(items)

这段会报错:

TypeError: sequence item 1: expected str instance, int found

原因也简单,join() 只认字符串。列表里混了整数,它不帮你自动转。

别偷懒,自己转清楚:

items = ["order", 10086, "paid"]

text = ",".join(str(item) for item in items)

print(text)
# order,10086,paid

这比先拼一堆 + 要稳。

有些代码喜欢这么写:

sql_ids = ""

for user_id in [101, 102, 103]:
    sql_ids += str(user_id) + ","

sql_ids = sql_ids.rstrip(",")

能跑,但我不太喜欢。循环里不停拼字符串,看着就有点旧账味。直接:

user_ids = [101, 102, 103]

sql_ids = ",".join(str(user_id) for user_id in user_ids)

print(sql_ids)
# 101,102,103

清楚,也不容易多一个逗号。

split() 还有一个默认行为,也得注意。

text = "  python   java   go  "

print(text.split())
# ['python', 'java', 'go']

不传参数时,它会按空白字符切,而且连续多个空格会当成一个。

但如果你明确传空格:

text = "  python   java   go  "

print(text.split(" "))
# ['', '', 'python', '', '', 'java', '', '', 'go', '', '']

这个结果就很烦了。

所以处理用户输入、日志关键字、命令行参数时,我一般优先用:

words = text.split()

处理固定格式文件时,才指定分隔符:

row = "u_1024,login,success"

fields = row.split(",")

最后把区别收一下,不绕。

split():字符串变列表。

"u_1024,login,success".split(",")
# ['u_1024', 'login', 'success']

join():列表变字符串。

",".join(["u_1024", "login", "success"])
# u_1024,login,success

实际写代码时,我更关心两件事。

第一,分隔符到底稳不稳。比如用户备注里也可能出现逗号,那你用逗号切 CSV,就别怪字段错位。

第二,列表里是不是全是字符串。join() 不吃整数、不吃 None、不吃对象,除非你明确转成字符串。

这俩函数不难,难的是别在脏数据面前写得太自信。线上很多字符串问题,不是 Python 不会切,是你以为数据永远长一个样。

最新文章

随机文章