2013-04-21 2 views
1

나는 생성자가 파일 목록을 취하는 클래스 객체를 만들려고 시도하고 있습니다. 각 객체는 문자열 목록 (한 줄에 하나씩)으로 변환하고 모든 목록을 연결합니다 함께 보관하고 보관합니다. 이 클래스는 또한리스트파일 목록을 파이썬에서 문자열 목록으로 연결하기

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()를 그렇지 않니? 문제가 무엇인지 파악하기가 힘듭니다. 당신은 단지 '아무것도하지 않는다()이 대신

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

'self.lines + f.readlines에 대한 fileinput을 사용할 수 있습니다 그러나 – Volatility

+0

'def __init __ (self, filename = []) :'그 습관이 당신을 곤경에 빠뜨릴 것입니다. 기본 인수로 목록과 같은 변경 가능한 객체를 사용하지 마십시오. 설명은 [here] (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 

이어야한다. 어쩌면 당신은`self.lines + = f.readlines()`를 대신 원하겠습니까?

+1

감사합니다. – user2303321

관련 문제