2017-01-02 137 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

好的解決辦法,謝謝! –