파일 접근 기본 (File Access Fundamentals)

Beginner

This tutorial is from open-source community. Access the source code

소개

대부분의 프로그램은 어딘가에서 입력을 읽어야 합니다. 이 섹션에서는 파일 접근에 대해 논의합니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 84%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

파일 입출력 (File Input and Output)

파일을 엽니다.

f = open('foo.txt', 'rt')     ## 읽기 (텍스트) 용으로 열기
g = open('bar.txt', 'wt')     ## 쓰기 (텍스트) 용으로 열기

모든 데이터를 읽습니다.

data = f.read()

## 'maxbytes' 바이트까지만 읽기
data = f.read([maxbytes])

일부 텍스트를 씁니다.

g.write('some text')

작업이 끝나면 닫습니다.

f.close()
g.close()

파일은 적절하게 닫혀야 하며, 잊기 쉬운 단계입니다. 따라서 선호되는 접근 방식은 다음과 같이 with 문을 사용하는 것입니다.

with open(filename, 'rt') as file:
    ## 파일 `file` 사용
    ...
    ## 명시적으로 닫을 필요 없음
...statements

이렇게 하면 들여쓰기된 코드 블록에서 제어가 벗어날 때 파일이 자동으로 닫힙니다.

파일 데이터 읽기를 위한 일반적인 관용구 (Common Idioms for Reading File Data)

전체 파일을 한 번에 문자열로 읽습니다.

with open('foo.txt', 'rt') as file:
    data = file.read()
    ## `data` 는 `foo.txt` 의 모든 텍스트가 포함된 문자열입니다.

반복하여 파일을 줄 단위로 읽습니다.

with open(filename, 'rt') as file:
    for line in file:
        ## 라인 처리

파일에 쓰기를 위한 일반적인 관용구 (Common Idioms for Writing to a File)

문자열 데이터를 씁니다.

with open('outfile', 'wt') as out:
    out.write('Hello World\n')
    ...

print 함수를 리디렉션합니다.

with open('outfile', 'wt') as out:
    print('Hello World', file=out)
    ...

이 연습은 portfolio.csv 파일에 의존합니다. 이 파일에는 주식 포트폴리오에 대한 정보가 포함된 줄 목록이 있습니다. ~/project/ 디렉토리에서 작업한다고 가정합니다. 확실하지 않은 경우, Python 이 실행 중이라고 생각하는 위치를 다음과 같이 확인할 수 있습니다.

>>> import os
>>> os.getcwd()
'/home/labex/project' ## 출력은 다를 수 있습니다.
>>>

연습 1.26: 파일 예비 작업 (File Preliminaries)

먼저, 전체 파일을 한 번에 큰 문자열로 읽어보세요.

>>> with open('portfolio.csv', 'rt') as f:
        data = f.read()

>>> data
'name,shares,price\n"AA",100,32.20\n"IBM",50,91.10\n"CAT",150,83.44\n"MSFT",200,51.23\n"GE",95,40.37\n"MSFT",50,65.10\n"IBM",100,70.44\n'
>>> print(data)
name,shares,price
"AA",100,32.20
"IBM",50,91.10
"CAT",150,83.44
"MSFT",200,51.23
"GE",95,40.37
"MSFT",50,65.10
"IBM",100,70.44
>>>

위의 예에서 Python 은 두 가지 출력 모드를 가지고 있다는 점에 유의해야 합니다. 프롬프트에서 data를 입력하는 첫 번째 모드에서는 Python 이 따옴표와 이스케이프 코드를 포함한 원시 문자열 표현을 보여줍니다. print(data)를 입력하면 문자열의 실제 서식 지정된 출력을 얻습니다.

파일을 한 번에 모두 읽는 것은 간단하지만, 특히 파일이 거대하거나 한 번에 처리하려는 텍스트 줄이 포함된 경우, 항상 가장 적절한 방법은 아닙니다.

파일을 줄 단위로 읽으려면 다음과 같이 for 루프를 사용하십시오.

>>> with open('portfolio.csv', 'rt') as f:
        for line in f:
            print(line, end='')

name,shares,price
"AA",100,32.20
"IBM",50,91.10
...
>>>

이 코드를 표시된 대로 사용하면 파일 끝에 도달할 때까지 줄이 읽히고, 이 시점에서 루프가 중지됩니다.

특정 경우에, 텍스트의 단일 줄을 수동으로 읽거나 건너뛸 수 있습니다 (예: 열 머리글의 첫 번째 줄을 건너뛰고 싶을 수 있습니다).

>>> f = open('portfolio.csv', 'rt')
>>> headers = next(f)
>>> headers
'name,shares,price\n'
>>> for line in f:
    print(line, end='')

"AA",100,32.20
"IBM",50,91.10
...
>>> f.close()
>>>

next()는 파일의 다음 텍스트 줄을 반환합니다. 반복적으로 호출하면 연속적인 줄을 얻게 됩니다. 그러나 알아두어야 할 점은 for 루프가 이미 next()를 사용하여 데이터를 얻는다는 것입니다. 따라서 표시된 것처럼 명시적으로 단일 줄을 건너뛰거나 읽으려는 경우가 아니면 일반적으로 직접 호출하지 않습니다.

파일의 줄을 읽으면 분할과 같은 더 많은 처리를 시작할 수 있습니다. 예를 들어, 다음을 시도해 보십시오.

>>> f = open('portfolio.csv', 'rt')
>>> headers = next(f).split(',')
>>> headers
['name', 'shares', 'price\n']
>>> for line in f:
    row = line.split(',')
    print(row)

['"AA"', '100', '32.20\n']
['"IBM"', '50', '91.10\n']
...
>>> f.close()

참고: 이 예제에서는 with 문이 사용되지 않으므로 f.close()가 명시적으로 호출됩니다.

연습 1.27: 데이터 파일 읽기 (Reading a data file)

이제 파일을 읽는 방법을 알았으니, 간단한 계산을 수행하는 프로그램을 작성해 보겠습니다.

portfolio.csv의 열은 주식 이름, 주식 수, 단일 주식 보유의 구매 가격에 해당합니다. 이 파일을 열고, 모든 줄을 읽고, 포트폴리오의 모든 주식을 구매하는 데 얼마의 비용이 들었는지 계산하는 pcost.py라는 프로그램을 /home/labex/project 디렉토리에 작성하십시오.

힌트: 문자열을 정수로 변환하려면 int(s)를 사용하십시오. 문자열을 부동 소수점으로 변환하려면 float(s)를 사용하십시오.

프로그램은 다음과 같은 출력을 인쇄해야 합니다.

Total cost 44671.15

연습 1.28: 다른 종류의 "파일" (Other kinds of "files")

gzip 압축된 데이터 파일과 같은 텍스트가 아닌 파일을 읽고 싶다면 어떻게 해야 할까요? 내장 함수 open()은 여기에서 도움이 되지 않지만, Python 에는 gzip 압축 파일을 읽을 수 있는 gzip 라이브러리 모듈이 있습니다.

시도해 보세요:

>>> import gzip
>>> with gzip.open('portfolio.csv.gz', 'rt') as f:
    for line in f:
        print(line, end='')

... 출력을 확인하세요 ...
>>>

참고: 파일 모드 'rt'를 포함하는 것은 여기에서 중요합니다. 이를 잊어버리면 일반 텍스트 문자열 대신 바이트 문자열을 얻게 됩니다.

해설: Pandas 를 사용해야 하지 않나요? (Shouldn't we being using Pandas for this?)

데이터 과학자들은 Pandas와 같은 라이브러리가 이미 CSV 파일을 읽는 기능을 가지고 있다고 지적합니다. 이는 사실이며, 꽤 잘 작동합니다. 하지만, 이것은 Pandas 를 배우는 과정이 아닙니다. 파일을 읽는 것은 CSV 파일의 세부 사항보다 더 일반적인 문제입니다. 우리가 CSV 파일로 작업하는 주된 이유는 대부분의 코더에게 익숙한 형식이고 직접 작업하기가 비교적 쉽기 때문이며, 그 과정에서 많은 Python 기능을 보여줍니다. 그러므로, 업무에 복귀할 때는 Pandas 를 사용하십시오. 하지만, 이 과정의 나머지 부분에서는 표준 Python 기능을 고수할 것입니다.

요약 (Summary)

축하합니다! 파일 관리 랩을 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 기술을 향상시킬 수 있습니다.