2013-04-21 2 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

+0

Что касается 'def __init __ (self, filename = []):' - эта привычка приведет вас к неприятностям. Не используйте изменяемые объекты, такие как списки, как аргументы по умолчанию - см. [Здесь] (http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument) для объяснения Зачем. – DSM

+0

@DSM Спасибо, что я должен использовать вместо этого? *имя файла ? – user2303321

ответ

1

Должно быть

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

Однако вы можете просто использовать fileinput для этого вместо

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

Спасибо, это сработало. – user2303321

Смежные вопросы