IO에 대한 내용이다.

내용을 많지 않지만 들어있는 내용 자체가 파이썬 자체의 구조를 알아야 하는 부분들이 있어서 어렵다는 느낌을 받았다.



==============================  Python ==============================

import os

# getcwd = get current work directory

print(os.getcwd())

'''

\\, / 의 차이

객체지향 \\ => 내부 연동

        / => 경로

'''


s = '안녕하세요!!'

f = open('test.txt', 'w', encoding = 'UTF-8')  # 인코딩을 utf-8로 한다.

f = open('test.txt', 'w', encoding = 'UTF-8-sig')  # 인코딩을 utf-8로 하면서 BOM(Byte Order Mark)을 없앤다.

f.write(s)

f.close()  # 이게 없어도 일단 파일은 생성되고 내용도 들어간다. 객체지향언어에서는 자원을 환원시키는 게 좋기 때문에 해준다.


s = ['1', '2', '3']

ss = [1, 2, 3]

f = open('test.txt', 'w', encoding='UTF-8-sig')

f.writelines(s)  # 한 줄로 출력하는 방법

    # f.writelines(ss)  # 무조건 String만 write가 가능하다. 때문에 이건 오류가 난다.

f.close()


s = {'1':'asdf'}

f = open('test.txt', 'w', encoding='UTF-8-sig')

f.writelines(s)  # 사전타입은 키값만 넘어간다. value를 넘기기 위해서는 class를 이용해서 넘겨야 한다.

f.close()


f = open('test.txt','r')

print(f.read())  # 인코딩이 안 맞아서 에러가 발생

                 # UnicodeDecodeError: 'cp949' codec can't decode byte 0xec in position 0: illegal multibyte sequence

f = open('test.txt', encoding='UTF-8')

print(f.read())  # 결과는 안녕하세요!!. 인코딩이 맞아서 정상출력.


# 추가로 입력

f = open('test.txt','a', encoding='UTF-8')

f.write('추가한다.\n')

f.close()


# 한 줄씩 읽는 방법

f = open('test.txt', encoding='UTF-8')

s = f.readline()

while s:  # 0, 데이터가 없는 경우에 멈춘다. hasnext, next가 필요없음.

    print(s)

    s = f.readline()  # 이런 형식으로 입력하면 기존의 hasnext랑 같아진다. 여기서는 s에 그 다음줄이 들어가게 된다.

f.close()

'''

'결과'

파이썬은 우수한 객체지향 언어다.


자바는 객체지향 언어의 기본이 되는 언어이다.


스프링은 프레임워크 기반 언어이다.

'''


f = open('test.txt', encoding='UTF-8')

for i in f:  # 위의 while s:와 동일한 방법. f의 길이는 f.readlines()를 이용해서 나온 값을 보면 알 수 있다.

    print(i)

f.close()

'''

'결과'

f.readlines() 

                ['파이썬은 우수한 객체지향 언어다.\n', 

                '자바는 객체지향 언어의 기본이 되는 언어이다.\n', 

                '스프링은 프레임워크 기반 언어이다.']

for i in f:

    print(i)

파이썬은 우수한 객체지향 언어다.


자바는 객체지향 언어의 기본이 되는 언어이다.


스프링은 프레임워크 기반 언어이다.


'해석'

기본적으로 txt파일은 

1. 리스트로 읽힌다. 

2. 각 줄은 리스트의 원소로 취급된다.

3. 이스케이프 문자 \n은 각 원소의 기본값으로 들어간다.

4. 마지막 줄의 마지막에 줄바꿈이 없다면 이스케이프 문자 \n은 원소에 포함되지 않는다.

5. 모든 내용은 String으로 입력된다.

위의 규칙을 따르게 된다.

'''


'''

'os.read(fd,n)에 관하여'

Read at most n bytes from file descriptor fd. 

Return a bytestring containing the bytes read. 

If the end of the file referred to by fd has been reached, 

    an empty bytes object is returned.

즉, bytestring 단위로 읽기 때문에(커서로 위치로 구분하기 때문에) 구분이 줄별로 일어나게 된다는 뜻.


ref.

Python 3 Documentation

https://docs.python.org/ko/3/library/os.html?highlight=read#os.read

'''


==============================  Python ==============================

+ Recent posts