Data Analysis/Python Basic

[파이썬] 파일 입출력의 기본

뉴욕킴 2023. 5. 20. 14:16
 

파일 입출력

 

1단계: 파일열기

읽기용: 변수명 = open('파일명','r')

쓰기용: 변수명 = open('파일명','w')

 2단계: 파일처리

 

3단계: 파일 닫기 

- 1단계에서 open() 함수로 연 변수명: 변수명.close(); 

 

 

# 텍스트 파일 입출력 

inFp = None  #입력파일
inStr = ""   #읽어 온 문자열 

inFp = open('C:/Temp/data1.txt', 'r')  #파일 열기

inStr = inFp.readline() # readline(): inFp로 열린 파일에서 한 행 읽어 inStr에 저장   
print(inStr, end='')    # 화면에 출력 

inStr = inFp.readline()
print(inStr, end='')

inStr = inFp.readline()
print(inStr, end='')


inFp.close()

 

# 파일의 내용을 한 행씩 출력

inFp = None
inList, inStr = [].''

inFp = open('C:/Temp/data1.txt','r')

inList = inFp.readline()
for inStr in inList:
    print(inStr, end='')

inFp.close()

# 한 행씩 파일에 쓰기

# 한 행씩 파일에 쓰기

outFp = None
outStr = ''

outFp = open('C:/Temp/data2.txt','w')  # 쓰기 모드 w 불러오기 

while True:
    outStr = input('내용 입력: ')      # 파일에 쓸 내용 입력 
    if outStr != '':                  # 입력한 글자가 비어 있지 않으면 9행에서 입력한 내용을 파일에 씀
        outFp.writelines(outStr + '/n') #outStr만 파일에 쓰면 줄바꿈X 
    else:
        break                         # 입력한 글자가 비어 있으면 10-11행에서 무한 반복 종료

outFp.close()  #파일 닫기
print('정상적으로 파일에 씀') #메세지 출력

# Copy 명령어

inFp, outFp = None, None
inStr = ''

inFp = open('C:/Windows/win.ini','r')  
outFp = open('C:/Temp/data3.txt','w')

inList = inFp.readlines()
for inStr in inList:
    outFp.writelines(inStr)

inFp.close()
outFp.close()
print('파일이 정상적으로 복사되었음 ')

# readline() 과 readlines()

readline(): 한번에 한 행씩 읽어 들여 모든 행을 처리하려면 반복문을 통해 계속 읽어야 함, 용량이 수백MB가 넘으면 사용

readlines(): 파일로 한번에 읽어 리스트에 저장

 

 

# 이진파일의 복사

inFp, outFp = None, None
inStr =''

inFp =open('C:/Windows/notepad.exe','rb') # 읽기모드
outFp = open('C:/Temp/notepad.exe','wb')  # 쓰기모드 

while True:                               # 파일의 끝까지 한 바이트씩 읽어서 한 바이트씩 파일에 쓰기 
    inStr = inFp.read(1)
    if not inStr:
        break
    outFp.write(inStr)

inFp.close()
outFp.close()
print('이진 파일이 정상적으로 복사되었음')

# 실습: 파일 탐색기 만들기

- 윈도우의 파일 탐색기와 기능이 비슷한 프로그램 만들기

from tkinter import *
import os
import os.path

##함수 선언 부분##
def clickListBox(evt) :
    global currentDir, searchDirList
    if (dirListBox.curselection() == ()): # 다른 리스트 박스 클릭할 때 무시
        return
    dirName = str(dirListBox.get(dirListBox.curselection()))
    if dirName == '상위폴더' :
        if len(searchDirList) == 1 : ## 상위폴더 클릭, 현재 C:\\이면 무시
            return
        searchDirList.pop() # 상위 폴더 이동이라 마지막 검색 폴더 (현재 폴더)
    else :
        searchDirList.append(currentDir + dirName + '\\') # 검색 리스트에 클릭한 폴더 추가

    fillListBox()

def fillListBox() :
    global currentDir, searchDirList, dirLabel, dirListBox, fileListBox
    dirListBox.delete(0, END)
    fileListBox.delete(0,END)

    dirListBox.insert(END, "상위폴더")
    currentDir = searchDirList[len(searchDirList) -1]
    dirLabel.configure(text = currentDir)
    folderList = os.listdir(currentDir)
    for item in folderList :
        if os.path.isdir(currentDir + item) :
            dirListBox.insert(END, item)
        elif os.path.isfile(currentDir + item) :
            fileListBox.insert(END, item)

## 전역 변수 선언 부분
window = None
searchDirList = ['C:\\']
currDir = 'C:\\'
dirLabel, dirListBox, fileListBox = None, None, None

# 메인 코드 부분
window = Tk()
window.title("폴더 및 파일 목록 보기")
window.geometry('300x500')

dirLabel = Label(window, text = currDir)
dirLabel.pack()

dirListBox = Listbox(window)
dirListBox.pack(side = LEFT, fill = BOTH, expand = 1)
dirListBox.bind('<<ListboxSelect>>', clickListBox)

fileListBox = Listbox(window)
fileListBox.pack(side = RIGHT, fill = BOTH, expand =1)

fillListBox()

window.mainloop()