[Python기초]file 개념 정리

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!


파이썬 File 개념 정리



파일 입출력 작업

파일 생성

  1. 파일은 쓰기모드(w)로 생성한다.
  2. 해당 파일이 존재하지 않으면 새로 생성, 존재하면 덮어쓴다.
f = open('file1.txt', 'w')
f.close()

# 존재하지 않는 디렉터리에 생성하는 경우 에러 발생
f = open('c:/python/file1.txt', 'w')
# f = open('c:\\python\\file1.txt', 'w')
f.close()
  1. 파일을 열었으면 항상 닫아줘야한다. 그럴 때 .close()를 사용한다.

파일 쓰기

  • 기본적으로 ‘w’(쓰기모드)를 활용한다.

방법(1)

data = 'Hi' # data에 Hi라는 문자열 저장
f = open('file2.txt', 'w') # 쓰기 모드로 file2.txt 생성
f.write(data)  # 파일에 data의 내용인 Hi를 작성
f.close() # 파일을 닫아준다.
  1. 같은 디렉토리에 ‘file2.txt’파일이 생성될 것이다.
  2. 파일을 확인해보면 Hi가 적혀있다.

방법(2)

data = '안녕하세요'
f = open('file2.txt', 'w') # 코딩 형식이 ANSI여서한글이 깨져서 보인다. encoding=UTF-8을 사용하면 한글도 잘 보임.
f.write(data)  # 파일에 data의 내용인 안녕하세요를 작성
f.close()
  1. 같은 디렉토리에 ‘file2.txt’가 생성될 것이다.
  2. 파일을 확인해보면 안녕하세요 대신 이상한 문자로 적혀있을 것이다.

방법(3)

data = '안녕하세요'
f = open('file3.txt', 'w', encoding='utf-8') # 코딩 형식이 utf-8이여서 한글이 잘 보인다.
f.write(data)  # 파일에 data의 내용인 안녕하세요를 작성
f.close()
  1. 같은 디렉토리에 ‘file3.txt’가 생성될 것이다.
  2. encoding을 설정해 주어서 안녕하세요 라고 잘 적혀 있을 것이다.

방법(4)

for문을 활용할 수도 있다.

f = open('file4.txt', 'w', encoding='utf-8')


for i in range(1,11):
    data = '%d행\n'% i
    f.write(data)


f.close()
  1. 같은 디렉토리에 ‘file4.txt’가 생성될 것이다.
  2. ‘1행’ ~ ‘10행’ 문자가 줄을 바꾸며 출력될 것이다.

파일 읽기

  • 기본적으로 ‘r’(읽기 모드)를 활용한다.

  • test.txt 내용:

    안녕하세요. 이순신입니다.
    지금 열심히 파이썬 공부하는 중이에요.
    1. 변수
    2. 자료형
    3. 연산자
    4. 제어문
    5. 함수
    

1. readline() : 한 줄씩 읽어오기

  • 한 줄만 출력

    f = open('test.txt', 'r', encoding='utf-8')
    line = f.readline()  # 첫번째 라인 1개 읽기
    print(line)
    f.close()
    
    안녕하세요. 이순신입니다.
    
  • 한 줄씩 끝까지 읽어오기

    f2 = open('test.txt', 'r', encoding='utf-8')
      
    while True:
        line = f2.readline() # .readline() 뒤에는 \n가 내재되어있다고 생각하면 된다.
        if not line:
            break
        print(line, end='') # end=''를 사용함으로 한줄의 공백들이 사라진다.
      
    f2.close()
    
    안녕하세요. 이순신입니다.
    지금 열심히 파이썬 공부하는 중이에요.
    1. 변수
    2. 자료형
    3. 연산자
    4. 제어문
    5. 함수
    

2. readlines() : 전체 라인을 읽어오기 (기본적으로 리스트로 변환시켜준다.)

  • 내용 전체의 라인 읽어오기

    f = open('test.txt','r',encoding='utf-8')
    lines = f.readlines() # realines로 읽은 내용들을 줄로 나눠 리스트의 원소로 저장
    print(lines)
    f.close()
    
    ['안녕하세요. 이순신입니다.\n', '지금 열심히 파이썬 공부하는 중이에요.\n', '1. 변수\n', '2. 자료형\n', '3. 연산자\n', '4. 제어문\n', '5. 함수\n']
    
  • 반복문(for)을 활용하여 전체 라인 읽어오기

    f = open('test.txt', 'r', encoding='utf-8')
    lines = f.readlines()
    for line in lines:
        print(line, end='')
    f.close()
    
    안녕하세요. 이순신입니다.
    지금 열심히 파이썬 공부하는 중이에요.
    1. 변수
    2. 자료형
    3. 연산자
    4. 제어문
    5. 함수
    
  • f 변수에 파일을 지정해 반복문 활용

    f = open('test.txt', 'r', encoding='utf-8')
    for line in f:   # f.readlines()를 자동 수행
        print(line, end='')
    f.close()
    
    안녕하세요. 이순신입니다.
    지금 열심히 파이썬 공부하는 중이에요.
    1. 변수
    2. 자료형
    3. 연산자
    4. 제어문
    5. 함수
    

3. read() : 내용 전체를 읽어 1개의 문자열로 반환

  • test2.txt 내용:

    01234
    abcde
    가나다라마
    
f = open('test2.txt', 'r', encoding='utf-8')
data = f.read()
print(data)
f.close()
print(type(data))
print(len(data))
f.close()

for ch in data:
    print(ch) # 전체 파일이 하나의 문자열이 되고 하나의 글자씩 출력
01234
abcde
가나다라마

<class 'str'>
18
0
1
2
3
4


a
b
c
d
e


가
나
다
라
마




4. .seek(offset, whence) : 파일 내 검색

  • offset : 상대적 위치(시작 위치로부터 열의 위치)
  • whence : 위치(0 : 파일 시작 위치, 1: 현재 위치, 2 : 파일의 끝
seek(0,0) : 시작위치로부터 0열의 위치 => 0행 0열
seek(10,0) : 시작위치로부터 오른쪽으로 10열의 위치 => 0행 10열
sekk(0,2) : 파일의 끝으로부터 0열의 위치
  • UTF-8 인코딩 적용 시 한글3Byte로 인식

5. 파일 내에서 검색 시 read() 함수 사용

f = open('test2.txt', 'r', encoding='utf-8')
data = f.read()
value = input('검색 값 입력: ')
if value in data:
    print('Exist!')
else:
    print('Not Exist!')

f.close()
검색 값 입력: ab
Exist!
검색 값 입력: 바
Not Exist!

파일에 내용 추가

append() : 파일의 끝에 내용을 추가한다.

f = open('test2.txt', 'a', encoding='utf-8')


appendData = '\n\nPython Programming'
f.write(appendData)


f = open('test2.txt', 'r', encoding='utf-8')
print(f.read())
f.close()

test2.txt 파일에 appendData 안의 문자열을 추가한다.

01234
abcde
가나다라마


Python Programming

with 문

  • with문이 종료되면 파일 객체는 자동으로 close()

  • with open(파일명, 열기모드, 인코딩) as 파일 객체 :

    ​ 수행 코드1

    ​ 수행 코드2

    ​ ….

file = 'test3.txt' # 파일 명을 변수에 저장할 수 있다.
data = 'Python Programming'
with open(file, 'a', encoding='utf-8') as f: # f = open('test3.txt', 'w', encoding='utf-8')
    f.write(data+'\n')
  • 두 번 실행 시에 test3.txt 파일 내의 내용
Python Programming
Python Programming

디렉토리 및 파일의 생성, 삭제, 존재여부


디렉토리 생성

방법(1)

import os

os.mkdir('log') # 해당 py파일이 존재하는 같은 경로에 log라는 폴더를 생성

import shutil # 해당 py파일이 존재하는 같은 경로에 위치한 log라는 폴더를 삭제
shutil.rmtree('log')

방법(2)

# 기존 디렉터리 확인

import os.path



if not os.path.isdir('log'): # 만약 log라는 폴더가 해당 위치에 없다면
    os.mkdir('log')      # log 폴더를 만들어라


# os.mkdir('log') # 이미 기존에 log 폴더가 존재해 오류가 발생

디렉터리 목록 보기

import os

for dirName, subDir, fnames in os.walk('c:/pythonStudy/Day8'):
    print(fnames)
    for fname in fnames:
        # print(os.path.join(dirName, fname))
        print(fname)
....
['moduel12.py', 'module11.py', '__init__.py']
moduel12.py
module11.py
__init__.py
['moduel12.cpython-310.pyc', 'module11.cpython-310.pyc', '__init__.cpython-310.pyc']
moduel12.cpython-310.pyc
module11.cpython-310.pyc
__init__.cpython-310.pyc
['module21.py', 'module22.py', '__init__.py']
module21.py
module22.py
__init__.py
['module31.py', 'module32.py', '__init__.py']
module31.py
module32.py
__init__.py
['__init__.cpython-310.pyc']
__init__.cpython-310.pyc

디렉토리 또는 파일의 존재 여부 확인

  • 컴퓨터마다 다르겠지만 결과만 본다면!
import os.path

print(os.path.exists('c:/pythonStudy')) #폴더가 있어서 True값 반환
print(os.path.exists('c:/pythonStudy/test.txt')) #해당 경로에 test.txt가 없어서 False 반환
print(os.path.isdir('c:/pythonStudy')) # 해당 폴더가 존재하기에 True
print(os.path.isfile('c:/pythonStudy')) # 해당 이름의 파일이 없기에 False

파일 삭제

import os
# os.remove('c:/pythonStudy/test.py')
# 만약 해당 경로의 파일이 없다면 오류가 뜬다.

파일 크기 확인

a = os.path.getsize('c:/pythonStudy/main.py')
print(a)

파일 압축 및 풀기

1. 파일 압축

import zipfile

new = zipfile.ZipFile('c:/pythonStudy/Day8/Day8.zip', 'w') # 지정한 위치에 지정한 이름의 압축파일을 만듦.
new.write('c:/pythonStudy/Day8/fileIO/test2.txt', compress_type=zipfile.ZIP_DEFLATED) # 압축할 파일을 정함.
new.close()

2. 압축 풀기

ext = zipfile.ZipFile('c:/pythonStudy/Day8/Day8.zip', 'r') # 압축파일을 읽어와 변수에 저장
ext.extractall('c:/pythonStudy/') # 압축파일을 지정 경로에 푼다.
ext.close()

로그 파일

1. log 파일 작성

import os # os 모듈을 호출


if not os.path.isdir('log'): # 만약 log라는 폴더가 존재하지 않는다면
    os.mkdir('log') # log라는 이름의 폴더를 만들어라!


if not os.path.exists('log/countLog.txt'): # log 폴더 하위에 countLog.txt 파일이 존재하지 않는다면
    f = open('log/countLog.txt', 'w', encoding='utf-8') # countLog.txt 파일을 생성
    f.write('기록시작\n') # 기록시작(줄바꿈)을 countLog.txt 파일에 작성 후 
    f.close() # 종료

2. log 기록 남기기

with open('log/countLog.txt', 'a', encoding='utf-8') as f: 
    # with을 사용해 open/close 동시 해결
    # countLog.txt에 내용을 추가하는 'a'
    # alias = f
    import datetime, random # 날짜시간 모듈과 랜덤 모듈 호출
    for i in range(10): # 10회 반복
        stamp = str(datetime.datetime.now()) # 현재 날짜와 시간 저장
        value = random.random() * 1000000 # 0과 1사이의 랜덤한 값을 백만배로 곱해주기
        log_line = stamp + '\t' + str(value) + '값 생성\n' # 위의 두 값을 이어붙인다.
        f.write(log_line) # countLog.txt 에 내용 작성
기록시작
2022-01-03 15:40:20.453091	984483.9636461178값 생성
2022-01-03 15:40:20.453091	926793.3563745391값 생성
2022-01-03 15:40:20.453091	341696.9632425417값 생성
2022-01-03 15:40:20.453091	732976.253184998값 생성
2022-01-03 15:40:20.453091	317465.7040951553값 생성
2022-01-03 15:40:20.453091	953568.146178258값 생성
2022-01-03 15:40:20.453091	725577.1279350694값 생성
2022-01-03 15:40:20.453091	851737.6810587979값 생성
2022-01-03 15:40:20.453091	517171.0043578899값 생성
2022-01-03 15:40:20.453091	864225.8081886568값 생성
2022-01-03 15:41:32.412175	805705.0459983537값 생성
2022-01-03 15:41:32.412175	830118.3735400231값 생성
2022-01-03 15:41:32.412175	713992.2626785933값 생성
2022-01-03 15:41:32.412175	180278.90745187568값 생성
2022-01-03 15:41:32.412175	635766.1216173386값 생성
2022-01-03 15:41:32.412175	180773.25353567253값 생성
2022-01-03 15:41:32.412175	698079.0317322136값 생성
2022-01-03 15:41:32.412175	872830.1752858293값 생성
2022-01-03 15:41:32.412175	58125.309250513514값 생성
2022-01-03 15:41:32.412175	440261.0159612521값 생성
# 이런식으로 저장된다.

이진 파일(Binary File)

  • 글자가 아닌 비트 단위로 의미가 있는 파일
  • 그림, 음악, 동영상, 엑셀, 한글, 실행(exe) 파일 등

(1) 이진 파일 읽기

  • open(‘이진파일 이름’, ‘rb’)
  • read(1) : 1바이트 씩 읽기

(2) 이진 파일 쓰기

  • open(‘이진파일 이름’, ‘wb’)
  • write()

(3) 이진 파일 읽고 쓰기(복사)

f1 = open('c:/windows/notepad.exe', 'rb') # 메모장 응용프로그램을 이진 수로 읽어온다.
f2 = open('c:/Temp/notepad.exe', 'wb') # temp 경로에 notepad.exe 파일을 생성 후 작성 준비
while True:
    inStr = f1.read(1) # 메모장 응용프로그램을 1바이트 씩 읽어서
    if not inStr:  # 파일의 끝(더 이상 읽을게 없음)
        break  # 끝내고
    else:
        f2.write(inStr) # 그게 아니라면 계속 작성

f1.close()
f2.close()

피클(pickle)

  • 메모리에 로딩 된 객체나 정의된 클래스 파일로 저장하여 사용

  • 호출

    import pickle
    
  • 객체 저장 : pickle.dump()

    f = open('list.pickle', 'wb') # list.pickle을 생성
    result = [1,2,3,4,5] # result라는 값이 있는 리스트 생성
    pickle.dump(result, f) # list.pickle 파일에 result의 값 작성
    f.close()
    
  • 객체 로딩 : pickle.load()

    f = open('list.pickle', 'rb') # list.pickle을 읽기 모드로
    result2 = pickle.load(f) # 값을 불러와 result2에 저장
    print(result2)
    result2.append(100) # result2 리스트의 마지막에 100 추가
    print(result2)
    

2022

[web]jQuery 복습 3

2 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]jQuery 복습 2

11 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]jQuery 복습 1

16 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리4

6 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리3

6 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리2

6 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리1

7 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]CSS 기초 정리

9 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]HTML 기초 정리

2 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[Pandas]pandas 연습

3 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

맨 위로 이동 ↑

2021

[Python기초]module

1 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

맨 위로 이동 ↑