2013-04-21 58 views
1

我試圖創建一個類對象,它的構造函數接受一個文件列表,將每個對象轉換爲一個字符串列表(每行一個)並連接所有列表一起存儲。這個類還包含從列表中將文件列表連接到Python中的字符串列表中

class randline: 
    def __init__(self, filename = []): 
     #def __init__(self, filename = [] , *args): 

     #for i in range(len(filename)): 
     self.lines = [] 

     for path in filename: 
      with open(path, 'r') as f: 
       self.lines + f.readlines() 
       f.close() 

    def chooseline(self): 
     if self.lines: 
     return random.choice(self.lines) 

def main(): 
#... 
    try: 
     generator = randline(args) 
     for index in range(numlines): 
      sys.stdout.write(generator.chooseline()) 
    except IOError as (errno, strerror): 
     parser.error("I/O error({0}): {1}". 
        format(errno, strerror)) 

這將產生錯誤消息輸出隨機線的成員函數:

Traceback (most recent call last): 
    File "./1randline.py", line 59, in <module> 
    main() 
    File "./1randline.py", line 53, in main 
    sys.stdout.write(generator.chooseline()) 
TypeError: expected a character buffer object 

但是chooseline()產生從連結文件串的列表的字符串,不是嗎?所以我很難找出問題所在。

+0

'self.lines + f.readlines()'不會做任何事情。也許你想'self.lines + = f.readlines()'而不是? – Volatility 2013-04-21 00:25:29

+0

關於'def __init __(self,filename = []):' - 那種習慣會讓你陷入困境。不要使用像列表這樣的可變對象作爲默認參數 - 請參閱[這裏](http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument)爲什麼。 – DSM 2013-04-21 00:34:16

+0

@DSM謝謝,我應該用什麼來代替? *文件名 ? – user2303321 2013-04-21 00:45:09

回答

1

應該

self.lines += f.readlines() # notice the += 
# self.lines.extend(f.readlines()) is equivalent 

但是你可以使用fileinput這不是

import fileinput 
lines = list(fileinput.input(paths)) 
+1

謝謝,這工作。 – user2303321 2013-04-21 00:46:32

相關問題