선미 파이썬 0404 18일차

azuremei
이동: 둘러보기, 검색
#12_file_io
'''
    [파일 입출력] file input/output
                 standard input/output(표준입출력 : 콘솔/idle)
                    콘콜 : 콘솔창(까만화면)에서 입력받거나 출력하는 것을 표준입출력이라고 함

      - 파일 입출력 :파일을 생성, 삭제, 읽기, 쓰기 등을 하는 것
      - 파일과 디렉토리
          디렉토리 :
            > 폴더 혹은 디렉토리
            > 파일과 또다른 디렉토리를 포함할 수 있다.
            > 용량이 없다.
          파일 :
            > 컴퓨터에서 정보를 저장하는 논리적인 단위
            > 파일명+확장자
            > 읽기, 쓰기, 실행 등을 할 수 있다. (폴더는 안으로 접근하다는 개념만 있고 읽기, 실행 등의 기능은 수행하지 않는다.)
            > 파일은 물리적인 디스크(hdd, ssd, usb...)에 내용이 쓰여져 있고 우리가 폴더형태를 찾고 실행하는 것은 운영체제(os)의 파일시스템 역할(폴더는 파일시스템에서 구분하기 좋으라고 만들어준 것)

            > 기본적으로 모든 파일은 메모장으로 열 수 있다. 우리가 idle 편집기를 통해 소스 파일을 다루는 것도 메모장으로 열어서 편집하는 것과 동일(but idle는 코드실행과 같은 기능이 있는 것.)

              - binary 파일 : 특정 프로그램으로 열어야 알아볼 수 있는 파일(메모장으로 열었을 때 알아볼 수 있는 형태 :
                   docc, hwp)
              - text 파일 메모장으로 열었을 때 우리가 알아볼 수 있는 파일, 순수 텍스트 파일  (예 : txt, .py, .html, .xml)
            - > 파일을 읽는 것은 메모장으로 열었을 때 보이는 형태 그대로 읽는다(기본적인 파일입출력)
            텍스트파일 형태는 우리가 다룰 수 있지만 바이너리는 알아볼 수 없어져서 못다룬다
            바이너리 파일을 프로그램으로 다두류면 워드가 docx 열었듯 분석해야한다. 그래서 이런 형태의 파일을 다룰 때는 라이브러리를 차용함
[파일 다루는 방법]
파일객체 = open("파일이름", "파일열기모드") 이 때의 파일 이름은 상대경로/절대경로가 들어갈 수 있다.
    절대경로는 c\부터 다 들어감
    파일객체 = 변수(오픈을 통해 파일 경로를 전달해줄 때 그를 다루는 변수)
    파일이름 = 컴퓨터에 존재하는 파일명 혹은 전체경로(절대경로)를 포함하는 파일명
    파일열기모드
        - 파일 객체도 엄밀히 말하면 도구
        - r : 읽기모드 : 파일의 내용을 읽기만 하고 싶을 때
        - w : 쓰기모드 : 파일에 내용을 쓰고싶을 때
        - a : 추가모드 : 파일의 내용을 추가(쓰는것)
        - w+, a+, r+ 등등....추가 모드도 있다.

'''
'''
#file : 파일객체(변수처럼사용), c:의 :은 드라이브를 나타냄, \는 폴더를 구분함
file = open("c:\\test.txt", "r") # 문자열로 경로를 다룰 때는 \\를 사용(두 개 써야 하나로 인식)
file_name = "c:\\test.txt"
text = file.read() #파일 내용 전체를 '문자열로 반환해준다' > return "내용전체"
print(text) #읽은 파일 내용 출력
#파일을 open했으면 반드리 close도 해줘야 함
file.close()
#열고 있으면 다른 프로그램이 이 파일을 다룰 수 없다.

#with문을 이용하여 클로즈 생략하기
with open(file_name, "r") : # 문자열로 경로를 다룰 때는 \\를 사용(두 개 써야 하나로 인식)
    text = file.read() #파일 내용 전체를 '문자열로 반환해준다' > return "내용전체"
    print(text)
#위드의 수행문이 끝나면 오픈했던 파일이 자동으로 클로즈된다.
#파일의 내용을 한 번씩 읽기(1)
    #readlines : '복수!!!'

with open("c:\\test.txt", "r") : 
    text_list = file.readlines() # 전체의 내용을 한 줄씩 리스트에 추가
    print(text_list)
    print("파일은 {}줄 입니다.".format(len(text_list)))

#파일 내용을 한 줄씩 읽기 (2)
    #readline() : s없음, 한 줄씩 문자ㅕㅇㄹ로 변환


with open("c:\\test.txt", "r") :
    while True : #무한반복
        text_list = file.readline()
        print(text_list, end="") 
        print("파일은 {}줄 입니다.".format(len(text_list)))
        if not text : # readline을 통해 읽은 내용이 없다(비어있다.)
            break
        
    
#readline을 할 때마다 '알아서' 읽고 난 뒤를 읽는다.
#현재 내가 읽을 위치를 offset이라고 하는데 open하고 처음에는 맨 앞, readline하고나면 한 줄 읽음 >>>> 자동으로 다음줄로 옵셋 이동
'''

#파일의 단어, 라인, 통계 산출
with open("C:\\test.txt", "r") as file :
    test = file.read() #전체 내용 모두 읽음
    word_list = test.split(" ")
    line_list = test.split("\n")
    print(word_list, "\n", line_list)
    print("단어 개수 : ", len(word_list))
    print("라인 개수 : ", len(line_list))

#파일 쓰기 >>> w로 하면 파일이 존재할 때 새로 만든다(기존 파일이 날아감...)
with open("C:\\test2.txt","w") as file :
    for i in range (1, 11) : #1~10까지 대입
        text = "{}번째 줄입니다. \n".format(i)
        file.write(text)
#리드라인과 마찬가지로 라이트도 하고나면 자동으로 옵셋으로 돌아간다.(처음 옵셋은 0)
        

#파일 입출력 연습
'''
    c드라이브 root에 test_new.txt파일을 만들고 아래 내용을 작성한 뒤 파일을 읽어서 (r) 아래와 같이 출력
[출력내용]
전체 글자 수 : ??
전체 단어 수 : ??
전체 라인 수 : ??
'사랑' 단어 수 : ??

test_new.txt 내용
사랑하는 엄마에게...
안녕하세요 엄마! 사랑하는 자식 홍길동이에요.
그럼 이만..ㅎㅎ
'''