기본 파일 I/O 검토

Beginner

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

소개

이 랩에서는 Python 에서 기본적인 파일 입출력 연산을 검토하는 방법을 배우게 됩니다. 주식 포트폴리오 정보가 담긴 파일에서 데이터를 읽어 포트폴리오의 총 비용을 계산하는 Python 프로그램을 만들 것입니다.

이 랩의 목표는 Python 에서 파일을 열고 읽는 방법, 파일에서 데이터를 줄 단위로 처리하는 방법, 데이터에 대한 계산을 수행하는 방법, 그리고 결과를 출력하는 방법을 배우는 것입니다. 여러분이 만들 파일은 pcost.py입니다.

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

문제 이해

이 단계에서는 먼저 해결해야 할 문제가 무엇인지 이해하고, 작업할 데이터를 살펴보겠습니다. 이는 모든 프로그래밍 작업에서 중요한 첫 번째 단계입니다. 이를 통해 정확히 무엇을 목표로 하고 있으며, 어떤 자원을 사용할 수 있는지 알 수 있습니다.

프로젝트 디렉토리에는 portfolio.dat라는 파일이 있습니다. 이 파일은 주식 포트폴리오에 대한 정보를 저장합니다. 포트폴리오는 투자자가 소유한 다양한 주식의 모음과 같습니다. 이 파일의 각 줄은 단일 주식 구매를 나타냅니다. 각 줄의 형식은 다음과 같습니다.

[주식 기호] [주식 수] [주당 가격]

주식 기호는 특정 회사의 주식을 나타내는 짧은 코드입니다. 주식 수는 해당 주식을 몇 주 구매했는지 알려주고, 주당 가격은 해당 주식 1 주의 가격입니다.

예시를 살펴보겠습니다. 파일의 첫 번째 줄을 고려해 보겠습니다.

AA 100 32.20

이 줄은 "AA" 기호의 주식 100 주를 구매했음을 나타냅니다. 각 주식의 가격은 $32.20 입니다.

portfolio.dat 파일의 내용을 확인하려면 터미널에서 다음 명령을 실행할 수 있습니다. cat 명령은 파일의 내용을 볼 수 있는 터미널에서 유용한 도구입니다.

cat ~/project/portfolio.dat

이제 여러분의 과제는 pcost.py라는 Python 프로그램을 만드는 것입니다. 이 프로그램은 세 가지 주요 작업을 수행합니다.

  1. 먼저, portfolio.dat 파일을 열고 읽어야 합니다. Python 에서 파일을 열면 프로그램이 파일 내에 저장된 데이터에 액세스할 수 있습니다.
  2. 그런 다음, 포트폴리오의 모든 주식 구매에 대한 총 비용을 계산해야 합니다. 이를 위해 파일의 각 줄에 대해 주식 수와 주당 가격을 곱해야 합니다. 각 줄에 대한 이러한 값을 얻은 후, 모두 합산합니다. 이렇게 하면 포트폴리오의 모든 주식에 지출된 총 금액이 계산됩니다.
  3. 마지막으로, 프로그램은 총 비용을 출력해야 합니다. 이렇게 하면 계산 결과를 볼 수 있습니다.

pcost.py 파일을 만들어 보겠습니다. 편집기를 사용하여 이 파일을 열고 편집할 수 있습니다. 이 파일은 설정 단계에서 이미 생성되었습니다. 이 파일은 방금 논의한 문제를 해결하기 위해 Python 코드를 작성하는 곳입니다.

파일 열기 및 읽기

이 단계에서는 Python 에서 파일을 열고 읽는 방법을 배우겠습니다. 파일 입출력 (I/O) 은 프로그래밍의 기본적인 개념입니다. 이를 통해 프로그램이 텍스트 파일, CSV 파일 등과 같은 외부 파일과 상호 작용할 수 있습니다. Python 에서 파일을 사용하는 가장 일반적인 방법 중 하나는 open() 함수를 사용하는 것입니다.

open() 함수는 Python 에서 파일을 여는 데 사용됩니다. 두 개의 중요한 인수를 받습니다. 첫 번째 인수는 열려는 파일의 이름입니다. 두 번째 인수는 파일을 열려는 모드입니다. 파일을 읽으려면 'r' 모드를 사용합니다. 이렇게 하면 Python 에 파일의 내용만 읽고 변경하지 않도록 지시합니다.

이제 pcost.py 파일에 portfolio.dat 파일을 열고 읽는 코드를 추가해 보겠습니다. 코드 편집기에서 pcost.py 파일을 열고 다음 코드를 추가합니다.

## pcost.py
## Calculate the total cost of a portfolio of stocks

def portfolio_cost(filename):
    """
    Computes the total cost (shares*price) of a portfolio file
    """
    total_cost = 0.0

    ## Open the file
    with open(filename, 'r') as file:
        ## Read all lines in the file
        for line in file:
            print(line)  ## Just for debugging, to see what we're reading

    ## Return the total cost
    return total_cost

## Call the function with the portfolio file
total_cost = portfolio_cost('portfolio.dat')
print(f'Total cost: ${total_cost}')

이 코드가 수행하는 작업을 자세히 살펴보겠습니다.

  1. 먼저, portfolio_cost()라는 함수를 정의합니다. 이 함수는 파일 이름을 입력 매개변수로 받습니다. 이 함수의 목적은 파일의 데이터를 기반으로 주식 포트폴리오의 총 비용을 계산하는 것입니다.
  2. 함수 내부에서 open() 함수를 사용하여 지정된 파일을 읽기 모드로 엽니다. with 문은 파일을 읽은 후 제대로 닫히도록 하는 데 사용됩니다. 이는 리소스 누수를 방지하기 위한 좋은 방법입니다.
  3. 그런 다음 for 루프를 사용하여 파일을 줄 단위로 읽습니다. 파일의 각 줄에 대해 이를 출력합니다. 이는 디버깅 목적으로만 사용되며, 파일에서 어떤 데이터를 읽고 있는지 확인할 수 있습니다.
  4. 파일을 읽은 후, 함수는 총 비용을 반환합니다. 현재 총 비용은 아직 실제 계산을 구현하지 않았기 때문에 0.0 으로 설정되어 있습니다.
  5. 함수 외부에서 파일 이름 'portfolio.dat'를 사용하여 portfolio_cost() 함수를 호출합니다. 즉, portfolio.dat 파일의 데이터를 기반으로 총 비용을 계산하도록 함수에 요청하는 것입니다.
  6. 마지막으로, f-string 을 사용하여 총 비용을 출력합니다.

이제 이 코드를 실행하여 어떤 작업을 수행하는지 확인해 보겠습니다. 다음 명령을 사용하여 터미널에서 Python 파일을 실행할 수 있습니다.

python3 ~/project/pcost.py

이 명령을 실행하면 portfolio.dat 파일의 각 줄이 터미널에 출력되고, 그 다음 현재 0.0 으로 설정된 총 비용이 출력됩니다. 이 출력은 파일이 올바르게 읽히고 있는지 확인하는 데 도움이 됩니다.

데이터 처리

이제 파일을 읽는 방법을 배웠으므로 다음 단계는 파일의 각 줄을 처리하여 각 주식 구매 비용을 계산하는 것입니다. 이는 Python 에서 데이터를 처리하는 데 중요한 부분이며, 파일을 통해 의미 있는 정보를 추출할 수 있습니다.

파일의 각 줄은 특정 형식을 따릅니다: [주식 기호] [주식 수] [주당 가격]. 각 주식 구매 비용을 계산하려면 각 줄에서 주식 수와 주당 가격을 추출해야 합니다. 그런 다음, 이 두 값을 곱하여 해당 특정 주식 구매 비용을 구합니다. 마지막으로, 이 비용을 총계에 더하여 포트폴리오의 전체 비용을 구합니다.

pcost.py 파일에서 portfolio_cost() 함수를 수정하여 이를 수행해 보겠습니다. 수정된 코드는 다음과 같습니다.

def portfolio_cost(filename):
    """
    Computes the total cost (shares*price) of a portfolio file
    """
    total_cost = 0.0

    ## Open the file
    with open(filename, 'r') as file:
        ## Read all lines in the file
        for line in file:
            ## Strip any leading/trailing whitespace
            line = line.strip()

            ## Skip empty lines
            if not line:
                continue

            ## Split the line into fields
            fields = line.split()

            ## Extract the relevant data
            ## fields[0] is the stock symbol (which we don't need for the calculation)
            shares = int(fields[1])  ## Number of shares (second field)
            price = float(fields[2])  ## Price per share (third field)

            ## Calculate the cost of this stock purchase
            cost = shares * price

            ## Add to the total cost
            total_cost += cost

            ## Print some debug information
            print(f'{fields[0]}: {shares} shares at ${price:.2f} = ${cost:.2f}')

    ## Return the total cost
    return total_cost

수정된 이 함수가 수행하는 작업을 단계별로 살펴보겠습니다.

  1. 공백 제거: strip() 메서드를 사용하여 각 줄의 앞뒤 공백을 제거합니다. 이렇게 하면 줄을 필드로 분할할 때 실수로 추가 공백이 포함되지 않도록 합니다.
  2. 빈 줄 건너뛰기: 줄이 비어 있으면 (즉, 공백만 포함하는 경우) continue 문을 사용하여 건너뜁니다. 이렇게 하면 빈 줄을 분할하려고 할 때 오류를 방지하는 데 도움이 됩니다.
  3. 줄을 필드로 분할: split() 메서드를 사용하여 각 줄을 공백을 기준으로 필드 목록으로 분할합니다. 이를 통해 줄의 각 부분에 개별적으로 액세스할 수 있습니다.
  4. 관련 데이터 추출: 필드 목록에서 주식 수와 주당 가격을 추출합니다. 주식 수는 두 번째 필드이고, 주당 가격은 세 번째 필드입니다. 이러한 값을 적절한 데이터 유형 (int for shares, float for price) 으로 변환하여 산술 연산을 수행할 수 있도록 합니다.
  5. 비용 계산: 주식 수에 주당 가격을 곱하여 이 주식 구매 비용을 계산합니다.
  6. 총계에 추가: 이 주식 구매 비용을 총계에 더합니다.
  7. 디버그 정보 출력: 각 주식 구매에 대한 일부 정보를 출력하여 어떤 일이 일어나고 있는지 확인하는 데 도움을 줍니다. 여기에는 주식 기호, 주식 수, 주당 가격 및 구매 총 비용이 포함됩니다.

이제 코드를 실행하여 작동하는지 확인해 보겠습니다. 터미널을 열고 다음 명령을 실행합니다.

python3 ~/project/pcost.py

명령을 실행하면 각 주식 구매에 대한 자세한 정보와 포트폴리오의 총 비용이 표시됩니다. 이 출력은 함수가 올바르게 작동하고 총 비용을 정확하게 계산했는지 확인하는 데 도움이 됩니다.

프로그램 마무리

이제 코드를 정리하고 pcost.py 프로그램의 최종 버전을 만들 것입니다. 코드를 정리한다는 것은 불필요한 부분을 제거하고 출력이 보기 좋게 보이도록 하는 것을 의미합니다. 이는 코드를 더 전문적이고 이해하기 쉽게 만들므로 프로그래밍에서 중요한 단계입니다.

먼저 디버그 print 문을 제거합니다. 이러한 문은 변수 값과 프로그램의 흐름을 확인하기 위해 개발 중에 사용되지만 최종 버전에서는 필요하지 않습니다. 그런 다음 최종 출력이 깔끔하게 형식화되었는지 확인합니다.

다음은 pcost.py 코드의 최종 버전입니다.

## pcost.py
## Calculate the total cost of a portfolio of stocks

def portfolio_cost(filename):
    """
    Computes the total cost (shares*price) of a portfolio file
    """
    total_cost = 0.0

    try:
        ## Open the file
        with open(filename, 'r') as file:
            ## Read all lines in the file
            for line in file:
                ## Strip any leading/trailing whitespace
                line = line.strip()

                ## Skip empty lines
                if not line:
                    continue

                ## Split the line into fields
                fields = line.split()

                ## Extract the relevant data
                ## fields[0] is the stock symbol (which we don't need for the calculation)
                shares = int(fields[1])  ## Number of shares (second field)
                price = float(fields[2])  ## Price per share (third field)

                ## Calculate the cost of this stock purchase and add to the total
                total_cost += shares * price

    except FileNotFoundError:
        print(f"Error: Could not find file '{filename}'")
        return 0.0
    except Exception as e:
        print(f"Error processing file: {e}")
        return 0.0

    ## Return the total cost
    return total_cost

## Main block to run when the script is executed directly
if __name__ == '__main__':
    ## Call the function with the portfolio file
    total_cost = portfolio_cost('portfolio.dat')
    print(f'Total cost: ${total_cost:.2f}')

이 코드의 최종 버전에는 몇 가지 개선 사항이 있습니다.

  1. 오류 처리: 두 가지 유형의 오류를 포착하는 코드를 추가했습니다. FileNotFoundError는 지정된 파일이 존재하지 않을 때 발생합니다. 이 경우 프로그램은 오류 메시지를 출력하고 0.0 을 반환합니다. Exception 블록은 파일을 처리하는 동안 발생할 수 있는 다른 모든 오류를 포착합니다. 이렇게 하면 프로그램이 더 강력해지고 예기치 않게 충돌할 가능성이 줄어듭니다.
  2. 적절한 형식 지정: 총 비용은 f-string 에서 :.2f 형식 지정자를 사용하여 소수점 두 자리로 형식화됩니다. 이렇게 하면 출력이 더 전문적으로 보이고 읽기 쉬워집니다.
  3. __name__ == '__main__' 확인: 이는 일반적인 Python 관용구입니다. 이 블록 내부의 코드가 스크립트가 직접 실행될 때만 실행되도록 합니다. 스크립트가 다른 스크립트로 모듈로 가져온 경우 이 코드는 실행되지 않습니다. 이를 통해 스크립트의 동작을 더 잘 제어할 수 있습니다.

이제 최종 코드를 실행해 보겠습니다. 터미널을 열고 다음 명령을 입력합니다.

python3 ~/project/pcost.py

이 명령을 실행하면 프로그램은 portfolio.dat 파일을 읽고, 포트폴리오의 총 비용을 계산하고, 결과를 출력합니다. 포트폴리오의 총 비용이 표시되어야 하며, 이는 $44671.15 여야 합니다.

축하합니다! 파일에서 데이터를 읽고, 처리하고, 결과를 계산하는 Python 프로그램을 성공적으로 만들었습니다. 이는 훌륭한 성과이며, 숙련된 Python 프로그래머가 되기 위한 여정에 있다는 것을 보여줍니다.

요약

이 랩에서는 Python 에서 기본적인 파일 I/O (입출력, Input/Output) 작업을 수행하는 방법을 배웠습니다. open() 함수와 컨텍스트 관리자 (context manager) 를 사용하여 파일을 열고 읽고, 데이터를 줄 단위로 처리하고, 텍스트 데이터를 구문 분석 (parse) 하고, 계산을 수행하고, 오류를 처리하고, 함수와 메인 블록 (main block) 으로 완전한 Python 프로그램을 구성할 수 있습니다.

이러한 기술은 많은 Python 프로그램의 기본이며 데이터 분석 및 구성 관리와 같은 다양한 응용 분야에서 유용합니다. 명령줄 인수 (command-line arguments) 를 추가하고, 다른 파일 형식을 처리하고, 오류 검사를 개선하고, 더 자세한 보고서를 생성하여 프로그램을 더욱 향상시킬 수 있습니다.