2013-07-07 2 views
4

파이썬에서 한 줄씩 스트리밍하여 입력 텍스트 파일을 읽어야합니다. 즉, 한 번에 한 줄씩 텍스트 파일을 한 번에 메모리에로드하는 것을 의미합니다. 하지만 줄 바꿈 문자는 공백이 아니며 임의의 문자입니다. 그러나 나는 다른 문자로 공백에서 구분 기호를 변경해야, 위의"파이썬에서 문자열마다"구분 기호를 변경하십시오.

with open("log.txt") as infile: 
    for line in infile: 
     do_something_with(line) 

완벽 : 여기

라인에 의해 파일로드 라인 스택 오버플로하는 방법입니다.

어떻게이 작업을 수행 할 수 있습니까? 고맙습니다.

+0

나는 따라 가지 않는다. 줄 구분자는'\ r \ n' 또는'\ n '이 아닌가? – BLaZuRE

+0

이들은 임의의 문자이지만 \ r \ n 또는 \ n 또는 탭 문자는 아닙니다. 그래서 당신은 맞습니다 –

+0

정확히 어떤 캐릭터입니까? 파일의 크기는 얼마입니까? –

답변

5
import re 
def open_delimited(filename, delimiter, chunksize=1024, *args, **kwargs): 
    with open(filename, *args, **kwargs) as infile: 
     remainder = '' 
     for chunk in iter(lambda: infile.read(chunksize), ''): 
      pieces = re.split(delimiter, remainder+chunk) 
      for piece in pieces[:-1]: 
       yield piece 
      remainder = pieces[-1] 
     if remainder: 
      yield remainder 

for line in open_delimited("log.txt", delimiter='/'): 
    print(repr(line)) 
+0

센티넬과 함께 iter를 잘 사용하십시오. –

+0

이것은 훌륭하지만 인수에서 chunkksize를 변경하는 방법을 추가 할 것입니다. – Jmac

+0

@Jmac : 제안에 감사드립니다. – unutbu

1

파이썬에는이 기본 구조가 없습니다. 문자를 한 번에 하나씩 읽고 생성자가 전체 구분 된 항목을 가질 때까지 누적하는 생성기를 작성할 수 있습니다.

def items(infile, delim): 
    item = [] 
    c = infile.read(1) 
    while c: 
     if c == delim: 
      yield "".join(item) 
      item = [] 
     else: 
      c = infile.read(1) 
      item.append(c) 
    yield "".join(item) 

with open("log.txt") as infile: 
    for item in items(infile, ","): # comma delimited 
     do_something_with(item) 

파일을 청크 (예 : 64K 정도)로 읽고이를 분할하면 성능이 향상됩니다. 그러나이 논리는 항목이 여러 청크로 분할 될 수 있기 때문에 더욱 복잡해 지므로 100 % 확신 할 수는 없으므로 여기서는 다루지 않을 것입니다. :-)

관련 문제