2017-01-02 140 views
3

我的代码的目标是编写一个函数并返回一个字符串列表,其中连续的字符串(水果名称)对应于连续的#No.1...#No.5。水果的全名分成多行,我想在列表中显示果实名称作为一个没有空格的单个字符串。 我希望我的代码返回:Python:如何避免在for循环中追加空字符串?

['Pear', 'Apple', 'Cherry', 'Banana', 'Peach'] 

但我得到:

['', 'Pear', 'Apple', 'Cherry', 'Banana', 'Peach'] 

这些都是我的文件fruit.txt的内容:

#NO.1 
P 
ear 
#NO.2 
A 
pp 
l 
e 
#NO.3 
Cherry 
#NO.4 
Banan 
a 
#NO.5 
Pea 
c 
h 

这是我的代码:

def read(filename): 

    myfile = open('fruit', 'r') 
    seq = '' 
    list1 = [] 
    for line in myfile: 

     if line[0] != '#': 
      seq +=line.rstrip('\n') 
     else: 

      list1.append(seq) 
      seq = '' 

    list1.append(seq)  
    return list1 

如何避免追加一个不是我想要的空字符串?我想我只需要调整某一行代码的位置,任何建议表示赞赏。

+0

请注意,如果重复调用,您的函数将导致内存泄漏。如果不确定随后关闭文件,则永远不要打开文件。 最简单的方法是使用'with'构造。 如需进一步阅读,请参阅此链接:http://effbot.org/zone/python-with-statement.htm – sobek

+0

@sobek明白了,谢谢! –

回答

4

你可以改变

else: 

elif seq: 

这将检查seq是否是空的,只有当它不追加它。

+0

非常感谢!我会接受你的解决方案! –

1

从列表中删除空字符串快速修复:

list1 = filter(None, list1) 

这个怎么样的解决方案与regex?以下是两步过程。首先删除像换行符,空格等所有空格。然后按照你的模式#No.\d所有单词都发现:

import re 

whitespace = re.compile(r'\s*') 
fruitdef = re.compile(r'#NO\.\d(\w*)') 
inputfile = open('fruit', 'r').read() 

inputstring = re.sub(whitespace, '', inputfile) 
fruits = re.findall(fruitdef, inputstring) 

print fruits 

[ '鸭梨', '苹果', '樱桃', '香蕉', '桃']


精缩到oneliner:

import re 

print re.findall(r'#NO\.\d(\w*)', re.sub(r'\s*', '', open('fruit', 'r').read())) 
1

选择,如果你想要一个单一的在线解决方案:

with open('fruit.txt') as f: 
    content = f.read() 

output = [''.join(x.split('\n')[1:len(x.split('\n'))+1]) for x in content.split('#') if len(x.split('\n')) > 1] 
+0

好的解决办法,谢谢! –