我有一个字符串:
f = open("file.txt", r)
message = f.read()
print message
>>> "To: email\ntitle: add title here\nDescription: whatever here\n"
我可以通过执行以下操作来拆分字符串:
f_email, f_title, f_description, blank = message.split('\n')
但是当我收到这样的信息时会出现问题:
"To: email\ntitle: add title here\nDescription: first line\nSecond line\nthirdline\n"
当我分割字符串时,它也会拆分描述。我试过了:
f_email, f_title, f_description, blank = message.split('\n',4)
但是这显然会返回ValueError,因为它会分裂更多的4 \ n。
有什么建议吗?
答案 0 :(得分:4)
当您运行.split('\n')
时,您会返回一个列表。您可以将它们从列表中拉出来,而不是在拆分时分配变量:
tokens = message.split('\n')
f_email = tokens[0]
f_title = tokens[1]
f_description = tokens[2]
通过检查列表的大小,可以减少这种情况。如果您知道它至少需要三个元素,您可以:
assert(len(tokens)>=3)
解决这个问题的另一种方法是将事物包裹在try/except
块中:
tokens = message.split('\n')
try:
f_description = tokens[2]
except:
f_description = None
通过这种方式,您可以按照自己喜欢的方式处理更短列表的情况!
答案 1 :(得分:4)
@Hooked为Python2提供了一个很好的答案。
因为在Python3中*
也适用于元组解包,你可以这样做:
f_email, f_title, *f_description = tokens
详细信息位于PEP 3132
答案 2 :(得分:1)
如果您不想整体使用该文本,并且不在3.x下使用漂亮的splat解包,您可以这样做:
email = None
title = None
description = ""
with open("test.txt", "r") as f:
for number, line in enumerate(f):
if number == 0:
email = line.strip()
elif number == 1:
title = line.strip()
else:
description += line
答案 3 :(得分:1)
当您使用message.split(' \ n',2)时,您会得到三个部分:第一行,第二行和其余行。
使用此表格:
f = open("file.txt")
f_email, f_title, f_description = f.read.split('\n', 2)
f.close()
或者这个:
f = open("file.txt")
f_email = f.readline()
f_title = f.readline()
f_description = f.read()
f.close()