[PYTHON] 스트림에서 CSV 파일을 읽고 각 행을 쓰면서 처리하는 방법은 무엇입니까?
PYTHON스트림에서 CSV 파일을 읽고 각 행을 쓰면서 처리하는 방법은 무엇입니까?
표준 입력에서 CSV 파일을 읽고 각 행을 처리하려고합니다. 내 CSV 출력 코드는 하나씩 행을 씁니다. 그러나 독자는 행을 반복하기 전에 스트림이 종료되기를 기다립니다. 이것이 csv 모듈의 한계입니까? 내가 뭔가 잘못하고 있는거야?
내 독자 코드 :
import csv
import sys
import time
reader = csv.reader(sys.stdin)
for row in reader:
print "Read: (%s) %r" % (time.time(), row)
내 작가 코드 :
import csv
import sys
import time
writer = csv.writer(sys.stdout)
for i in range(8):
writer.writerow(["R%d" % i, "$" * (i+1)])
sys.stdout.flush()
time.sleep(0.5)
python의 출력 test_writer.py | python test_reader.py :
Read: (1309597426.3) ['R0', '$']
Read: (1309597426.3) ['R1', '$$']
Read: (1309597426.3) ['R2', '$$$']
Read: (1309597426.3) ['R3', '$$$$']
Read: (1309597426.3) ['R4', '$$$$$']
Read: (1309597426.3) ['R5', '$$$$$$']
Read: (1309597426.3) ['R6', '$$$$$$$']
Read: (1309597426.3) ['R7', '$$$$$$$$']
보시다시피 모든 인쇄 명령문은 동시에 실행되지만, 나는 500ms 간격이 있기를 기대합니다.
해결법
-
==============================
1.문서에서 말했듯이,
문서에서 말했듯이,
그리고 csv.reader가 (PyIter_Next를 통해) underlyling iterator의 next () 메소드를 호출하는 csv 모듈 (784 행)의 구현을 보면 알 수 있습니다.
따라서 CSV 파일을 버퍼링하지 않고 읽으려면 파일 객체 (여기 sys.stdin)를 next () 메서드가 실제로 readline ()을 대신 호출하는 반복기로 변환해야합니다. 이는 iter 함수의 두 인수 형식을 사용하여 쉽게 수행 할 수 있습니다. 그래서 test_reader.py의 코드를 다음과 같이 변경하십시오 :
for row in csv.reader(iter(sys.stdin.readline, '')): print("Read: ({}) {!r}".format(time.time(), row))
예를 들어,
$ python test_writer.py | python test_reader.py Read: (1388776652.964925) ['R0', '$'] Read: (1388776653.466134) ['R1', '$$'] Read: (1388776653.967327) ['R2', '$$$'] Read: (1388776654.468532) ['R3', '$$$$'] [etc]
왜 버퍼링되지 않은 CSV 파일을 읽어야하는지 설명 할 수 있습니까? 그것이하려고하는 것이 무엇이든지간에 더 나은 해결책이있을 수 있습니다.
-
==============================
2.아마 그것은 한계 다. 읽기 http://docs.python.org/using/cmdline.html#cmdoption-unittest-discover-u
아마 그것은 한계 다. 읽기 http://docs.python.org/using/cmdline.html#cmdoption-unittest-discover-u
test_reader.py를 다음과 같이 수정했습니다.
import csv, sys, time while True: print "Read: (%s) %r" % (time.time(), sys.stdin.readline())
산출
python test_writer.py | python test_reader.py Read: (1309600865.84) 'R0,$\r\n' Read: (1309600865.84) 'R1,$$\r\n' Read: (1309600866.34) 'R2,$$$\r\n' Read: (1309600866.84) 'R3,$$$$\r\n' Read: (1309600867.34) 'R4,$$$$$\r\n' Read: (1309600867.84) 'R5,$$$$$$\r\n' Read: (1309600868.34) 'R6,$$$$$$$\r\n' Read: (1309600868.84) 'R7,$$$$$$$$\r\n'
-
==============================
3.stdout은 플러시하지만 stdin은 플러시하지 않습니다.
stdout은 플러시하지만 stdin은 플러시하지 않습니다.
Sys.stdin에는 flush () 메서드도 있습니다. 실제로 버퍼링을 비활성화하려면 각 행을 읽은 후에 사용하십시오.
from https://stackoverflow.com/questions/6556078/how-to-read-a-csv-file-from-a-stream-and-process-each-line-as-it-is-written by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] URL에서 mp3를 재생하는 방법 (0) | 2018.11.20 |
---|---|
[PYTHON] 파이썬에서 많은리스트의 연결 (0) | 2018.11.20 |
[PYTHON] 드라이브 API를 사용하여 Google 드라이브에서 빈 스프레드 시트 만들기 (0) | 2018.11.20 |
[PYTHON] Python에서 저렴한 예외 처리 기능을 제공합니까? (0) | 2018.11.20 |
[PYTHON] SSL : Python3을 사용하여 CERTIFICATE_VERIFY_FAILED (0) | 2018.11.20 |