2012-04-18 37 views
1

我有一个字符串:格式化行Python中打破

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's。

有什么建议吗?

+0

如果“要”和“标题”总是在没有内部换行符自己行,你可以只劈在' \ n',第一个元素是电子邮件,第二个标题,并为身体做'\ n'.join(therest)'? – 2012-04-18 13:42:00

+0

也许你可以逐行阅读文件。 – Akavall 2012-04-18 13:45:32

回答

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 

这样,你可以处理一个较短的清单案例你喜欢的确切方式!

+0

非常感谢! – Neeran 2012-04-18 13:43:58

4

@Hooked为Python2提供了一个很好的答案。 由于Python3 *作品也为元组拆包,你可以这样做:

f_email, f_title, *f_description = tokens 

细节在PEP 3132

+0

Arg,我刚刚发布了这个;)+1,这是3.x用户的不错解决方案。 – 2012-04-18 13:46:12

+0

为了完整性,您可以使用'\ n's加入f_description的元素来重新获得原始描述字符串。 – covertCoder 2012-04-18 13:48:54

+0

此外,本着这种精神的解决方案,可以通过将'* tokens'传递给进行处理的方法来适应Python2。 – 2012-04-18 13:57:58

1

如果你不想使用的文本作为一个整体,而不是在3 .X使用漂亮的图示拆包,你可以简单地做这样的:

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 
+0

+1:非常感谢您的帮助,但如果我从文件中获得很长的字符串,代码可能会显得有点长。 – Neeran 2012-04-18 14:06:16

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()