2013-07-20 3 views
5

나는 메모리에 전체 파일을 가져 오기 위해 노력하고있어하지만 난 볼 수 이러한 개체는 정말 지금까지 정확히 '진짜'파일처럼 행동하지 않습니다 - 나는 전체 내용을 얻을, 또는 내가 할 수있는 한 번에 한 줄을 읽고,하지만 난이 패턴을 적용하는 방법을 작동하지 않을 수 있습니다 그냥 디스크에있는 파일과 같은 memoryfile을 처리하는 방법이 있나요CSV 리더가 메모리 파일을 읽는 방법? (- StringIO를 사용하여 수행) -

import csv 
with open(#MYMEMORYFILE_HERE#, 'rb') as csvfile: 
     spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|') 
     for row in spamreader: 

를, 그래서 더 좋은 숙어를 사용할 수 있습니다 위?

Python 2.7.4 (default, Apr 19 2013, 18:28:01) 

편집 : 이것에 대한 답변을 주셔서 감사합니다 - 다음 내가 나를 혼란 있었는지 좁혀 생각 ...하지만 난 여전히 여기에 문제가있는가, 아무것도 출력하지 않습니다? 나는 홍조를 의심합니까?

from csv import reader, writer 
import StringIO 

memfile=StringIO.StringIO() 
spamwriter = writer(memfile) 
spamwriter.writerow(['Spam'] * 5 + ['Baked Beans']) 
spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam']) 
spamreader=reader(memfile) 
for row in spamreader: 
     print ', '.join(row) 
memfile.close() 

편집 # 2 :하지만 내 생각은 잘못된 트리 짖는 해요 : 나는이의 온 디스크 버전 중 하나가 작동 가져올 수 없습니다를 ('IO 오류 : 읽기 위해 파일을 열 수 없습니다'-시 - 사용 splitlines을 대답에 따라, StringIO (그것을위한 진짜 필요) 포기 : 나는 편집 # 3) ... 이미 열려있는 파일에 읽기를 호출합니다.

는 여기 코드와 덧글을 남길 수 있습니다 - 경우에 유용합니다. (비록 막 다른 골목이라도).

spamreader = csv.reader(MYMEMORYFILE_HERE, delimiter=' ', quotechar='|') 

모든 것을 csv.reader() 필요가있는 반복 가능한 객체 인 다음 StringIO 개체를 열 필요가 없습니다

+0

년 후, 난 당신이 질문을 업데이트 참조; 다시 찾기를 잊어 버렸기 때문에 업데이트가 실패합니다 *. –

답변

9

전체 파일을 텍스트로 읽으려는 경우 StringIO 객체를 열 필요가 없습니다. 그냥 문자열로 읽어라!

with open(filename, 'r') as file: 
    in_memory_file = file.read() 

그런 다음 그 위에 당신이 열려있는 텍스트 파일을 반복 할 방법을 반복 splitlines를 사용할 수 있습니다.

spamreader = csv.reader(in_memory_file.splitlines(), delimiter=' ', quotechar='|') 
for row in spamreader: 
    pass 
+0

사실이 나는 (내가 처음에 디스크 파일 읽기 및 메모리 파일까지 복사하고 있습니다) 아주 잘하려고 노력하고있는 무슨에 맞는 -이 갈 줄거야 - 감사합니다. – monojohnny

+0

그래는 - 위대한 - 너무 오래 내가 읽은()를 사용하여에서 갔다하기 때문에 ->의 readlines을() -> 내가 splitlines에 대해 모든 것을 잊었다 : 열려있는 관용구는 StringIO 과잉이었다! 건배 – monojohnny

4

, 그것은 열린 파일 객체가 이미입니다. StringIO 개체는 해당 요구 사항을 충족시킵니다.

데모 : 자신의 StringIO.StringIO 시험으로

>>> from StringIO import StringIO 
>>> data = StringIO('1,2,3\n4,5,6\n') 
>>> import csv 
>>> for row in csv.reader(data): 
...  print row 
... 
['1', '2', '3'] 
['4', '5', '6'] 

; 당신은 파일 객체에 글을 썼지 만 시작점으로 되돌아 가려고 소홀히했습니다. 파일 포인터가 끝 부분에 있기 때문에 데이터가 읽히지 않습니다. 되돌아 오기 :

관련 문제