Я пытаюсь создать объект класса, конструктор которого принимает список файлов, превращает их в список строк (по одному на строку) и объединяет все списки вместе и сохраняет его. Этот класс также содержит функцию-член, который выводит случайную строку из спискаОбъединение списка файлов в список строк в 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() производит строку из списка сцепленных строк файла, не так ли? Поэтому мне трудно понять, в чем проблема.
'self.lines + f.readlines()' не делает ничего. Может быть, вы хотите 'self.lines + = f.readlines()' вместо этого? – Volatility
Что касается 'def __init __ (self, filename = []):' - эта привычка приведет вас к неприятностям. Не используйте изменяемые объекты, такие как списки, как аргументы по умолчанию - см. [Здесь] (http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument) для объяснения Зачем. – DSM
@DSM Спасибо, что я должен использовать вместо этого? *имя файла ? – user2303321