programing tip

실제로 파이썬에서 StringIO는 무엇에 사용됩니까?

itbloger 2020. 11. 14. 09:57
반응형

실제로 파이썬에서 StringIO는 무엇에 사용됩니까?


나는 프로가 아니며 StringIO가 정확히 무엇에 사용되는지 이해하는 데 머리를 긁적입니다. 몇 가지 예를 위해 인터넷을 둘러 보았습니다. 그러나 거의 모든 예제는 매우 추상적입니다. 그리고 그들은 그것을 사용하는 "방법"을 보여줍니다. 그러나 그들 중 누구도 "왜"와 "어떤 상황에서"그것을 사용해야 / 사용할 것인지를 보여주지 않습니까? 미리 감사드립니다

ps는 stackoverflow : StringIO Usage 에 대한이 질문과 혼동하지 마십시오. 문자열과 StringIo를 비교합니다.


파일 만받는 API가 있지만 문자열을 사용해야 할 때 사용됩니다. 예를 들어 Python 2에서 gzip 모듈을 사용하여 문자열을 압축하려면 :

import gzip
import StringIO

stringio = StringIO.StringIO()
gzip_file = gzip.GzipFile(fileobj=stringio, mode='w')
gzip_file.write('Hello World')
gzip_file.close()

stringio.getvalue()

StringIO는 문자열에 대한 파일과 유사한 액세스를 제공하므로 파일을 처리하고 거의 아무것도 변경하지 않고 문자열과 함께 작동하는 기존 모듈을 사용할 수 있습니다.

예를 들어 파일에 내용을 기록하는 로거가 있고 대신 네트워크를 통해 로그 출력을 보내고 싶다고 가정 해 보겠습니다. 파일을 읽고 그 내용을 네트워크에 쓰거나 StringIO 객체에 로그를 쓰고 파일 시스템을 건드리지 않고 네트워크 대상으로 보낼 수 있습니다. StringIO를 사용하면 첫 번째 방법으로 쉽게 수행 한 다음 두 번째 방법으로 전환 할 수 있습니다.


ACTS가 파일과 같은 파일 류 객체를 원하지만 메모리 내 문자열 버퍼에 쓰는 경우 : StringIO가 도구입니다. 일반 텍스트 문서와 같은 큰 문자열을 만들고 많은 문자열 연결을 수행하는 경우 여러 mystr += 'more stuff\n'유형의 작업 대신 StringIO를 사용하는 것이 더 쉬울 수 있습니다 .


내가 개인적으로 사용했던 몇 가지 것 :

  1. 전체 파일 캐싱. PDF를 읽고 그것에 대한 다양한 사항을 확인하는 스크립트가 있습니다. 내가 사용중인 PDF 라이브러리는 문서 생성자에서 열린 파일을 사용합니다. 처음에는 읽기에 관심이있는 PDF를 방금 열었지만 한 번에 전체 파일을 메모리로 읽은 다음 StringIO 개체를 PDF 라이브러리에 전달하도록 변경했을 때 스크립트 실행 시간이 절반으로 줄어 들었습니다.

  2. 지연된 인쇄. 동일한 스크립트는 읽는 모든 PDF 앞에 헤더를 인쇄합니다. 그러나 명령 줄에서 구성 파일에있는 특정 테스트를 무시할지 아니면 특정 테스트 만 포함할지 지정할 수 있습니다. 주어진 PDF에 대한 모든 테스트를 무시 하면 헤더가 인쇄되는 것을 원하지 않지만 테스트 실행이 완료 될 때까지 얼마나 많은 테스트를 실행했는지 알 수 없습니다 (테스트는 동적으로 정의 될 수도 있음). 그래서 그것을 sys.stdout가리 키도록 변경하여 헤더를 StringIO 객체로 캡처하고 , 테스트를 실행할 때마다 그 객체에 어떤 것이 있는지 확인합니다. 그렇다면 인쇄 한 다음 빈 상태로 재설정합니다. Voila, 테스트가있는 PDF에만 헤더가 인쇄됩니다.


두 가지를 위해 실제로 StringIO를 사용했습니다.

  • 쉬운 분석 을 위해 인스턴스 print로 리디렉션 sys.stdout하여 많은 작업을 수행하는 스크립트를 단위 테스트합니다 StringIO.
  • HTTP 연결을 통해 전송하기 위해 ElementTree다음 을 사용하여 보장 된 올바른 형식의 XML 문서 (사용자 지정 API 요청)를 생성 write합니다.

StringIO 자주 필요 하지는 않지만 때로는 매우 유용합니다.


단위 테스트를 위해 텍스트 파일 대신 사용했습니다.

예를 들어 pandas (Python 3)로 테스트하기 위해 csv '파일'을 만들려면 :

import io
f = io.StringIO("id,name\n1,brian\n2,amanda\n3,zoey\n")
df = pd.read_csv(f) # pandas takes a file path or a file-like object

여기 문서 에서 :

텍스트 I / O를위한 인 메모리 스트림. close () 메서드가 호출되면 텍스트 버퍼가 삭제됩니다.

버퍼의 초기 값은 initial_value를 제공하여 설정할 수 있습니다.

getvalue () 메소드 : 버퍼의 전체 내용을 포함하는 str을 반환합니다.


Django에는 call_command관리 명령을 호출하는 데 사용되는 기능 이 있습니다. 이 함수는 출력을 stdout에 인쇄하고 값을 반환하지 않습니다. 명령이 성공적으로 실행되었는지 여부를 알고 싶다면 출력을 살펴보고 결정해야합니다.

StringIO를 사용하여 출력을 캡처하고 원하는 출력인지 여부를 확인할 수 있습니다.

with io.StringIO() as output:
    call_command('custom_command', stdout=output)
    if 'Success' not in output.getvalue():
        print('Custom command failed...')

참고 URL : https://stackoverflow.com/questions/7996479/what-is-stringio-in-python-used-for-in-reality

반응형