파이썬의 빌트인 csv 모듈에서 이전에 눈치 채지 못한 동작이 나타났습니다. 일반적으로 CSV 파일을 읽을 때 doc's 다음과 같이 'with'를 사용하여 파일을 열고 'for'루프를 사용하여 판독기 객체를 반복합니다. 그러나 최근에는 두 번째 'for'루프가 아무 것도하지 않았다는 것을 알아 내기 위해 csv.reader 객체를 두 번 반복하여 반복적으로 시도했습니다.파이썬의 csv.reader 객체를 이해하지 못합니다.
import csv
with open('smallfriends.csv','rU') as csvfile:
readit = csv.reader(csvfile,delimiter=',')
for line in readit:
print line
for line in readit:
print 'foo'
콘솔 출력 :
Austins-iMac:Desktop austin$ python -i amy.py
['Amy', 'James', 'Nathan', 'Sara', 'Kayley', 'Alexis']
['James', 'Nathan', 'Tristan', 'Miles', 'Amy', 'Dave']
['Nathan', 'Amy', 'James', 'Tristan', 'Will', 'Zoey']
['Kayley', 'Amy', 'Alexis', 'Mikey', 'Sara', 'Baxter']
>>>
>>> readit
<_csv.reader object at 0x1023fa3d0>
>>>
그래서 'for'루프 두 번째는 기본적으로 아무것도하지 않습니다. 한 가지 생각은 csv.reader 객체가 한 번 읽은 후에 메모리에서 해제된다는 것입니다. 메모리 주소가 여전히 유지되므로이 경우가 아닙니다. 비슷한 문제가있는 post을 발견했습니다. 그들이 제공 한 이유는 일단 객체가 읽혀지면 포인터 스테이는 객체에 데이터를 쓸 준비가 된 메모리 주소의 끝에 있다는 것입니다. 이 올바른지? 누군가 여기서 일어나는 일에 대해 더 자세히 설명해 줄 수 있을까요? 그것을 다시 읽으려면 메모리 주소의 시작 부분에 포인터를 다시 밀어 넣는 방법이 있습니까? 나는 그것을하는 것이 나쁜 코딩 습관이라는 것을 알고 있지만, 나는 단지 궁금해서 파이썬의 두포 (hood)에서 일어나는 일에 대해 더 많이 배우고 싶다.
감사합니다. 너무 많은 데이터가 아닌 경우
일단 반복기를 사용하면 첫 번째 루프에서 'readit'이 발생하지만 기본적으로는 비어 있습니다. – monkut
그러면 "읽기 - 한 번"으로 생각할 수 있습니까? –
예, 독자 객체는 생성자 객체와 비슷합니다 (요청한대로 (next()를 통해) 파일에서 행을 가져 와서 파싱합니다. 일단 그것을 소비하면 (전체 파일을 실행) 처음에 파일을 다시 시작하거나 다시 처리하려는 경우 모든 데이터를 메모리로 읽어야합니다. – monkut