2011-01-31 4 views
3

일부 CSV 데이터를 배열로 읽으려고합니다. 나는 아마 내가 영어보다 파이썬에서 더 잘 할 노력하고있어 설명 할 수 있습니다 : 당신이 볼 수 있듯이, CSV 데이터가없는 파일에 메모리에 시작Python CSV 리더가 예상대로 CSV 데이터를 읽지 않습니다.

>>> line = ImportFile.objects.all().reverse()[0].file.split("\n")[0] 
>>> line 
'"007147","John Smith","100 Farley Ln","","Berlin NH 03570","Berlin","NH",2450000,"John",24643203,3454,"E","",2345071,1201,"N",15465,"I",.00,20102456,945610,20247320,1245712,"0T",.00100000,"",.00,.00,780,"D","000",.00,0\r' 
>>> s = cStringIO.StringIO() 
>>> s 
<cStringIO.StringO object at 0x9ab1960> 
>>> s.write(line) 
>>> r = csv.reader(s) 
>>> r 
<_csv.reader object at 0x9aa217c> 
>>> [line for line in r] 
[] 

. 내 독자는 그 데이터의 일부를 기대하지만 그것이하지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

5

StringIO을 잘못 사용하고 있습니다. 시도해보십시오.

s = cStringIO.StringIO(line) 
r = csv.reader(s) 
next(r) 
# "['007147', 'John Smith', '100 Farley Ln', '', 'Berlin NH 03570', 'Berlin', 'NH', '2450000', 'John', '24643203', '3454', 'E', '', '2345071', '1201', 'N', '15465', 'I', '.00', '20102456', '945610', '20247320', '1245712', '0T', '.00100000', '', '.00', '.00', '780', 'D', '000', '.00', '0']" 

결과가 예상 한 값이어야합니다.

편집 : 더 자세히 설명하려면 StringIO 인스턴스에 쓰고 나면 파일 포인터가 내용의 끝을 지나게됩니다. 이것은 이후의 write() 전화로 새로운 내용이 작성되기를 기대하는 곳입니다. 그러나 이것은 또한 read() 호출이 아무 것도 반환하지 않는다는 것을 의미합니다. 위치를 처음으로 재설정하려면 s.reset() 또는 s.seek(0)으로 전화하거나 StringIO을 원하는 내용으로 초기화해야합니다.

+1

이런 식으로 *이 * 바로 *이지만, 때로는 StringIO 객체를 읽고 쓸 필요가 있습니다. 그것은 지원됩니다. – 9000

0

이후에 s.seek(0)을 더하십시오. 파일과 같은 객체 s의 현재 포인터는 작성된 라인 바로 위에 있습니다.