파이썬으로 파일을 한 줄씩 읽어 리스트에 저장하는 방법
문제: 텍스트 파일을 한 줄씩 읽어 각 줄을 요소로 하는 리스트를 만들고 싶다.
해결: 파이썬에서는 파일을 읽고 처리하는 다양한 방법이 있지만, 한 줄씩 읽어 리스트에 저장하는 가장 일반적인 방법은 readlines()
메서드를 사용하는 것입니다.
readlines()
메서드 사용하기
with open('파일 이름.txt', 'r') as f:
lines = f.readlines()
print(lines)
with open('파일 이름.txt', 'r') as f:
:open()
함수를 사용하여 파일을 읽기 모드('r'
)로 엽니다.with
문을 사용하면 파일을 열고 닫는 과정을 자동으로 처리하여 코드를 간결하게 만들고, 파일이 제대로 닫히지 않아 발생할 수 있는 문제를 예방합니다.
f.readlines():
:lines = f.readlines():
:- 반환된 리스트를
lines
변수에 저장합니다.
- 반환된 리스트를
예시
# numbers.txt 파일에는 다음과 같은 내용이 있다고 가정
# 10
# 20
# 30
with open('numbers.txt', 'r') as f:
numbers = f.readlines()
print(numbers) # 출력: ['10\n', '20\n', '30\n']
위 코드를 실행하면 numbers
리스트에는 각 줄에 있는 숫자 문자열이 '\n' (줄 바꿈 문자)와 함께 저장됩니다. 만약 줄 바꿈 문자를 제거하고 싶다면 다음과 같이 리스트 내포를 사용할 수 있습니다.
numbers = [line.rstrip() for line in f]
추가 설명
- 줄 바꿈 문자:
\n
은 줄 바꿈을 나타내는 특수 문자입니다.readlines()
메서드로 읽어들인 각 줄에는 이 줄 바꿈 문자가 포함되어 있습니다. - 리스트 내포: 리스트 내포를 사용하면 한 줄로 간결하게 리스트를 생성할 수 있습니다. 위 예시에서는 각 줄에서 오른쪽 공백을 제거한 후 리스트에 추가합니다.
- 큰 파일: 매우 큰 파일을 읽을 때는
readlines()
메서드 대신for
루프와readline()
메서드를 사용하여 메모리 사용량을 줄일 수 있습니다.
다른 방법
readline()
메서드: 한 줄씩 읽어 처리하는 경우readline()
메서드를 사용할 수 있습니다. 하지만readlines()
메서드에 비해 코드가 길어질 수 있습니다.- 제너레이터:
yield
키워드를 사용하여 제너레이터를 만들면 메모리 효율적으로 파일을 처리할 수 있습니다.
파이썬으로 파일을 한 줄씩 읽어 리스트에 저장하는 샘플 코드
기본 예시: 숫자 파일 읽기 및 리스트에 저장
# numbers.txt 파일에는 다음과 같은 내용이 있다고 가정
# 10
# 20
# 30
with open('numbers.txt', 'r') as f:
numbers = f.readlines()
# 줄 바꿈 문자 제거
numbers = [line.rstrip() for line in numbers]
# 숫자로 변환 (필요한 경우)
numbers = [int(num) for num in numbers]
print(numbers) # 출력: [10, 20, 30]
다양한 파일 형식 처리
- CSV 파일:
import csv with open('data.csv', 'r') as f: reader = csv.reader(f) data = list(reader) print(data) # 각 행이 리스트로 구성된 2차원 리스트
- JSON 파일:
import json with open('data.json', 'r') as f: data = json.load(f) # 데이터 형식에 따라 리스트로 변환
추가 기능
- 특정 줄만 추출:
with open('data.txt', 'r') as f: lines = f.readlines() selected_lines = lines[2:5] # 3번째 줄부터 5번째 줄까지 추출
- 특정 문자열 포함하는 줄만 추출:
with open('data.txt', 'r') as f: lines = f.readlines() filtered_lines = [line for line in lines if 'keyword' in line]
- 파일 크기가 큰 경우:
with open('large_file.txt', 'r') as f: for line in f: # 한 줄씩 처리 print(line)
설명
with open('파일 이름', 'r') as f:
: 파일을 읽기 모드로 열고, with 문을 사용하여 파일을 안전하게 닫습니다.f.readlines():
: 파일의 모든 줄을 읽어 리스트로 반환합니다.- 리스트 내포: 한 줄로 간결하게 리스트를 생성하고, 특정 조건에 맞는 요소만 추출하거나 변환할 수 있습니다.
csv
모듈: CSV 파일을 읽을 때 사용합니다.
주의 사항
- 파일 인코딩: 파일의 인코딩이 UTF-8이 아닌 경우
encoding
인수를 사용하여 지정해야 합니다 (예:open('file.txt', 'r', encoding='utf-16')
). - 데이터 형식: 파일의 내용에 따라 적절한 데이터 형식으로 변환해야 합니다 (예: 숫자, 문자열, 리스트).
- "특정 열만 추출하고 싶은데 어떻게 해야 하나요?"
- "파일이 너무 커서 메모리 오류가 발생하는데 어떻게 해결할 수 있나요?"
- "다른 파일 형식 (예: XML)을 읽고 싶은데 어떤 모듈을 사용해야 하나요?"
파일을 한 줄씩 읽어 리스트에 저장하는 다른 방법들
이전에 readlines()
를 사용하여 파일을 한 줄씩 읽어 리스트에 저장하는 방법에 대해 알아보았습니다. 하지만 상황에 따라 다른 방법을 사용하는 것이 더 효율적일 수 있습니다.
for 루프와 readline() 사용하기
- 장점: 메모리 효율적이며 큰 파일 처리에 적합합니다.
- 단점:
readlines()
에 비해 코드가 조금 더 길어질 수 있습니다.
with open('파일 이름.txt', 'r') as f:
lines = []
for line in f:
lines.append(line.rstrip())
제너레이터 사용하기
- 단점: 리스트로 변환하기 전까지는 요소에 접근할 수 없습니다.
def read_lines(file_path):
with open(file_path, 'r') as f:
for line in f:
yield line.rstrip()
lines = read_lines('파일 이름.txt')
for line in lines:
print(line)
pandas 라이브러리 사용하기 (데이터 분석 시)
- 장점: 데이터 분석에 특화된 다양한 기능을 제공합니다.
- 단점:
pandas
라이브러리를 설치해야 합니다.
import pandas as pd
df = pd.read_csv('data.csv')
data = df.values.tolist()
어떤 방법을 선택해야 할까요?
- 메모리: 큰 파일을 처리해야 한다면
for
루프와readline()
또는 제너레이터를 사용하는 것이 좋습니다. - 데이터 분석: 데이터 분석을 한다면
pandas
라이브러리를 사용하는 것이 편리합니다. - 코드 가독성: 간단한 작업에는
readlines()
를 사용하고, 더 복잡한 작업에는for
루프 또는 제너레이터를 사용할 수 있습니다.
각 방법의 특징을 비교하여 상황에 맞는 방법을 선택하세요.
추가 고려 사항
- 인코딩: 파일의 인코딩이 다를 경우
encoding
인수를 사용하여 지정해야 합니다. - 에러 처리: 파일 읽기 중 오류가 발생할 수 있으므로
try-except
블록을 사용하여 에러를 처리하는 것이 좋습니다. - 데이터 형식: 파일의 내용에 따라 적절한 데이터 형식으로 변환해야 합니다.
- "1GB 크기의 로그 파일을 처리해야 하는데 어떤 방법이 가장 적합할까요?"
- "CSV 파일을 읽어서 각 열을 별도의 리스트에 저장하고 싶습니다."
python string file