오늘의 생각
벌써 부트캠프를 시작한 지 7일이나 지났다.
매일매일 초빙된 강사님의 특강을 듣고, 복습하고, 동시에 온라인 강의 일정을 병행하니 진짜 시간이 너무 모자른다.
욕심으로는 파이썬 알고리즘도 풀고 싶고, 배운 것 외의 내용들도 정리하여 기술 블로그도 쓰고 싶은데...현실적으로 시간이 너무 모자라서 그걸 하지는 못하고 있다.
빨리 기초 교육이 끝나야 개인 사이드 프로젝트나 추가 학습을 진행할 수 있을 것 같다. 복습이 제일 중요한 것 같다. 오늘 배워도 내일 까먹으면 소용이 없으니...
온라인 강의의 경우 특히 어려움이 많았는데, 파일을 읽고 불러오는 과정에서 유니코드가 문제가 되는 부분들이 많았다.
오늘의 학습내용
- 파이썬에서 정규표현식 활요하는 방법
- 디렉터리를 다루기 위한 파이썬 라이브러리들
- 파일 읽기, 저장하기
- 파읽 찾기, 복사하기, 이동시키기
- 파일 압축하고 풀기
추가적으로 알게된 내용
앞서 언급했듯 온라인 강의에서 파일 인코딩 문제로 읽어오고 쓰는데 어려움이 있었다.
해당 문제는 파이썬 환경 3.9.0 버전인데 fileinput 내장 라이브러리를 쓰려고 하면서 발생하는 문제였는데, 해당 버전에서읜 fileinput 라이브러리의 경우 encoding 옵션이 없다.
즉, openhook 속성을 통해 해당 파일의 유니코드가 CP949(비표준, 윈도우 한국어 환경 기반)임을 알려줘야 인코딩이 된다.
예를 들어, 파일의 시작 시 파일명을 출력하고 싶으면 다음과 같이 코드를 작성해야 한다.
# path는 임의의 파일 경로, 라이브러리는 임포트해왔다고 가정
# 파일 목록 가져오기
txt_files = glob.glob(os.path.join(path, "*.txt"))
# 파일명 기준 정렬
txt_files = sorted(txt_files, key=os.path.basename)
print("정렬된 파일 목록:", txt_files)
if txt_files:
with fileinput.input(files=txt_files, openhook=fileinput.hook_encoded("cp949")) as f:
for line in f:
# 파일의 시작 시 파일명 출력
if fileinput.isfirstline():
print(f"\n=== {fileinput.filename()} ===")
print(line.strip())
else:
print("'.txt' 파일이 없습니다.")
환장할 포인트는 이 경우 파일을 덮어씌우는 inplace 속성 역시 활용할 수 없다는 점.
이것때문에 거의 2시간을 머리를 꽁꽁 싸매면서 멘붕에 휩쌓였다.
결론은 해당 버전의 fileinput 라이브러리로는 inplace 옵션을 활용해 파일을 덮어씌울 수 없다. 즉, with 문법을 통해 직접 파일을 열고 덮어씌워야 한다.
import shutil
for file in txt_files:
print(f"처리 중: {file}")
# 1. 백업 파일 생성
backup_file = file + '.bak'
shutil.copy(file, backup_file) # 원본 파일 백업
try:
# 2. 파일 내용 읽기
with open(file, 'r', encoding='cp949') as f:
lines = f.readlines()
# 3. 파일 덮어쓰기
with open(file, 'w', encoding='cp949') as f:
for line in lines:
# 조건에 따라 내용 수정
if '14번째' in line:
f.write('열네번째 줄입니다.\n') # 수정된 내용 작성
else:
f.write(line) # 원본 내용 그대로 작성
print(f"{file} 수정 완료")
except Exception as e:
# 예외 발생 시 백업 복원
print(f"오류 발생: {e}. 백업 파일을 원본으로 복원합니다.")
shutil.move(backup_file, file) # 백업 파일 복원
파일 읽기/쓰기 강의 자료를 받아왔는데 유니코드가 표준형이 아니라는 점도, 파이썬 버전이 강의 기준으로는 꽤 예전 버전이라 인코딩 과련 기능이 개선된 라이브러리를 사용할 수 없다는 점 때문에 절망에 가까운 고통을 겪었다.
하지만 잘 극복해냈기 때문에, 성장은 한 것 같다...
'개발자 일기 > 일일회고 (TIL)' 카테고리의 다른 글
[Upstage AI Lab]부트캠프 9일차 (0) | 2024.11.26 |
---|---|
[Upstage AI Lab]부트캠프 8일차 (0) | 2024.11.25 |
[Upstage AI Lab]부트캠프 4~6일차 (1) | 2024.11.21 |
[Upstage AI Lab]부트캠프 3일차 (2) | 2024.11.19 |
[Upstage AI Lab]부트캠프 2일차 (3) | 2024.11.15 |
댓글