我的数据如下:
To: abc@gmail.com;def@gmail.com
CC: abc@hotmail.com;def@hotmail.com
BCC:
我正在做一个键值分割,如下所示。
key, value = line.split(": ")
问题是,它无法处理BCC的零值。我得到以下错误
ValueError: not enough values to unpack (expected 2, got 1)
我想知道在使用键值分割时处理null的最佳方法是什么?
如果事先不知道其大小,则应在执行拆包之前检查其大小。
data = """To: abc@gmail.com;def@gmail.com
CC: abc@hotmail.com;def@hotmail.com
BCC:"""
for line in data.split("n"):
result = line.split(": ")
if len(result) == 2:
[key, value] = result
print(key, value)
else:
print("No emails found.")
打印
To abc@gmail.com;def@gmail.com
CC abc@hotmail.com;def@hotmail.com
No emails found.
使用str.partition()
而不是str.split()
。它总是返回分隔符前的文本、分隔符和分隔符后的文本的三元组。如果找不到分隔符,则不会引发错误,但整个原始字符串位于第一项中,第二项和第三项为空字符串。
key, _, value = line.partition(": ")
if not value: # separator was not found
print("no emails found")
请使用内置的电子邮件解析器
from email.parser import Parser
p = Parser()
data = """To: abc@gmail.com;def@gmail.com
CC: abc@hotmail.com;def@hotmail.com
BCC:"""
parsed = p.parsestr(data)
bcc = [e for e in parsed.get('BCC').strip().split(';') if not len(e) == 0]
print(
'To:', parsed['To'].split(';'),
'nCC:', parsed['CC'].split(';'),
'nBCC', 'None' if not bcc else bcc
)
当代码找不到您在split中传递的字符串时,它会返回一个包含一个项的数组。这就是为什么它不能打开两个值的包装。
固定代码:
split_line = line.split(": ")
if len(split_line) > 1:
key, value = line.split(": ")