print 기능
>>> print("life" "is" "too short")
lifeistoo short
>>> print("life"+"is"+"too short") #큰따옴표로 둘러싸인 문자열은 +연산과 동일
lifeistoo short
>>> print("life","is","too short") #문자열 띄어쓰기는 콤마로 한다
life is too short
>>> for i in range(10):
print(i,end=',') #개행없이 end에다가 끝문자를 지정 할 수 있다
0,1,2,3,4,5,6,7,8,9,
파일 열기 -> 파일 읽기/쓰기 -> 파일 닫기
#write.py
file = open('text.txt','w')
file.write('hello')
file.close()
실행결과:
text.txt 파일이 write.py 파일과 같은 위치에 생성되고 열어보면 hello가 적혀있음
#read.py
file = open('text.txt','r')
str = file.read() #파일의 내용 전체를 문자열로 리턴한다
print(str)
file.close()
실행결과:
hello
with~as
: open() 함수와 함께 with~as문을 사용하면 명시적으로 close() 함수를 호출하지 않아도 파일이 항상 닫힘.
with open(파일이름) as 파일객체:
#코드블록
#이곳에서 읽거나 쓰기를 한 후
#그냥 코드를 빠져나가면 됨 close() 필요X
ex)
with open('text.txt','r') as file:
str = file.read()
print(str)
with
:컨텍스트 매니저(Context Manager)를 제공하는 함수여야 with문과 함께 사용할 수 있다
컨텍스트 매니저는 __enter__(), __exit__() 메소드를 구현하고 있는 객체이다.
with문은 컨텍스트 매니저를 획득한 후 코드블록의 실행을 시작할 때 컨텍스트 매니저의 __enter__() 메소드를 호출하고,
코드블록이 끝날 때 __exit__()를 호출한다.
ex)
class open2(object):
def __init__(self, path):
print('initialized')
self.file = open(path)
def __enter__(self):
print('entered')
return self.file
def __exit__(self, ext, exv, trb):
print('exit')
self.file.close() #자원 해제 코드를 이 메소드에 구현해놓으면 자원을 해제하는 명시적인 코드가 없어도 안전하게 처리 가능
return True
with open2('text.txt') as file:
s = file.read()
print(s)
실행결과:
initialized
entered
hello
exit
@contextmanager 데코레이터
:데코레이터는 __call__() 메소드를 구현하는 클래스이다. @contextmanger 데코레이터는 콜 메소드는 물론이고
컨텍스트 매니저 규약을 준수하는데 필요한 __enter__(), __exit__() 메소드를 모두 갖고 있다.
따라서 함수 하나를 만들고 이 데코레이터를 수식하면 컨텍스트 매니져의 구현이 마무리 된다
from contextlib import contextmanager #모듈로부터 contextmanger를 반입
@contextmanger #데코레이터로 함수 수식
def 함수명():
#자원 획득
try:
#yield 자원 yield문을 통해 자원 반환: with문의 코드 블록이 시작될때 실행
finally:
#자원 해제 with문의 코드블록이 종료될 때 실행
@contextmanger로 수식되는 함수의 구조
1. try~finally 블록을 갖고 있음
2. try문에서는 yield문을 통해 자원을 반환하고 이때 yield문은 자신의 매개변수로 넘겨진 자원을 반환한 뒤
임시적으로 현재 함수의 실행을 정지시킨다. with문의 코드블록 실행이 끝날 때 다시 실행
3. finally 블록에서 획득한 자원을 해제한다
즉 try 블록이 __enter__() 메소드의 역할을, finally블록이 __exit__()메소드의 역할을 수행한다
ex)
from contextlib import contextmanager
@contextmanager
def open3(path):
print("opening file...")
file = open(path)
try:
print("yielding file...")
yield file
finally:
print("closing file...")
file.close()
with open3("text.txt") as file:
s = file.read()
print(s)
lines = ["we'll find a way we always have - Interstellar\n",
"I'll find you and I'll kill you - Taken\n",
"I'll be back - Terminator 2\n"]
with open('movie_quotes.txt', 'w') as file:
for line in lines:
file.write(line)
lines = ["we'll find a way we always have - Interstellar\n",
"I'll find you and I'll kill you - Taken\n",
"I'll be back - Terminator 2\n"]
with open('movie_quotes.txt', 'w') as file:
file.writelines(lines)
with open('movie_quotes.txt', 'r') as file:
line = file.readline()
while line != '': # readlne는 파일의 끝에 도달하면 ''를 반환하며 실제로 빈줄을 읽어 들인 경우엔 개행 문자를 반환한다
print(line, end='')
line = file.readline()
with open('movie_quotes.txt', 'r') as file:
lines = file.readlines()
line = ''
for line in lines:
print(line, end='')
lines = ['안녕하세요?\n',
'こんにちは\n',
'Hello.\n']
with open('greetings_utf8.txt', 'w', encoding='utf-8') as file:
for line in lines:
file.write(line)
with open('greetings_utf8.txt', 'r', encoding='utf-8') as file:
lines = file.readlines()
line = ''
for line in lines:
print(line, end='')
>>> import struct
>>> packed = struct.pack('i', 123) # 이 함수는 매개변수 i에 따라 4바이트 크기의 bytes 객체 packed를 준비하고 두번째 매개변수를
>>> for b in packed: # bytes에 복사해 넣는다
print(b) # bytes 객체 packed의 각 바이트에 있는 내용을 출력한다
123
0
0
0
>>> unpacked = struct.unpack('i',packed)
>>> unpacked
(123,)
>>> type(unpacked) #unpacke() 함수는 튜플 형식을 반환한다
<class 'tuple'>
>>> struct.pack("i",2)
b'\x02\x00\x00\x00' #10진수 2를 4바이트 크기의 int 타입으로 출력
>>> struct.pack("2i",1,2)
b'\x01\x00\x00\x00\x02\x00\x00\x00' #10진수 1 과 2를 int타입으로 각각 출력
>>> struct.pack("il",1,2)
b'\x01\x00\x00\x00\x02\x00\x00\x00' # int와 long타입으로 각기 다른 타입으로 혼용 가능
>>> struct.pack("<il",1,2)
b'\x01\x00\x00\x00\x02\x00\x00\x00' #리틀 엔디안(오른쪽->왼쪽순)
>>> struct.pack(">il",1,2)
b'\x00\x00\x00\x01\x00\x00\x00\x02' #빅 엔디안(왼쪽->오른쪽)
>>> struct.pack("!il",1,2)
b'\x00\x00\x00\x01\x00\x00\x00\x02' # 네트워크 방식(빅엔디안)
#그냥 "il" 의 경우는 사용하는 운영체제 따라 표현 방식이 정해진다 위에 방식들은 강제로 지정방법.
>>> u = struct.pack("il",1,2)
>>> struct.unpack("il",u) # 튜플 데이터로 변환
(1, 2)
struct.pack(fmt, v1, v2, ...)
struct.unpack(fmt, buffer)
>>> import struct
>>> packed = struct.pack('f', 123.456)
>>> unpacked = struct.unpack('f', packed)
>>> unpacked
(123.45600128173828,) #튜플이라 한개 요소만 있을 경우 뒤에 콤마 포함
>>> unpacked[0]
123.45600128173828
>>> packed = struct.pack('12s', '대한민국'.encode()) # str.encode/ str.decode함수는 매개변수를 생략하면 utf-8을 지정
>>> unpacked = struct.unpack('12s', packed) #문자열을 제대로 담을수 있을 정도로 충분한 크기 지정
>>> unpacked[0].decode()
'대한민국'
>>> type(unpacked[0])
<class 'bytes'>
>>> type(unpacked)
<class 'tuple'>
>>> import struct
>>> packed = struct.pack('2d2i', *(123.456, 987.765, 123, 456)) #*연산자가 튜플, 리스트의 요소를 하나씩 분리해서 매개변수로 입력
>>> unpacked = struct.unpack('2d2i',packed)
>>> unpacked
(123.456, 987.765, 123, 456)
#binary_write.py
import struct
struct_fmt = '=16s2fi' # char[16], float[2], int
city_info = [
#CITY, Latitude, Longitude, Population
('서울'.encode(encoding='utf-8'), 37.566535, 126.977969, 9820000),
('뉴욕'.encode(encoding='utf-8'), 40.712784, -74.005941, 8400000),
('파리'.encode(encoding='utf-8'), 48.856614, 2.352222, 2210000),
('런던'.encode(encoding='utf-8'), 51.507351, -0.127758, 8300000)
]
with open('cities.dat', 'wb') as file:
for city in city_info:
file.write(struct.pack(struct_fmt, *city)) # *연산자가 순서열의 요소를 하나씩 분리해서 매개변수로 입력해준다
#binary_read.py
import struct
struct_fmt = '=16s2fi' # char[16], float[2], int
struct_len = struct.calcsize(struct_fmt) # 16+(4*3) = 28
cities = []
with open('cities.dat', 'rb') as file:
while True:
buffer = file.read(struct_len)
if not buffer: break #파일의 끝에 도달하면 while 루프 탈출
city = struct.unpack(struct_fmt, buffer)
cities.append(city)
for city in cities:
name = city[0].decode(encoding='utf-8').replace('\x00', '') #pack()하는 과정에서 문자를 할당하고 남은 공간에 채워진,
print('City:{0}, Lat/Long:{1}/{2}, Population:{3}'.format( # \x00를 디코딩한 후 빈 문자열로 다시 바꿔 넣는다
name,
city[1],
city[2],
city[3]))
>>> f = open("C:\\Users\\ok\AppData\\Local\\Programs\\Python\\Python35-32\\lern\\test.txt", "r")
>>> f.readline()
'1. 햄버거\n'
>>> f.tell()
11
>>> f.readline()
'2. 돈가스\n'
>>> f.tell()
22
>>> f.readline()
'1. 햄버거\n'
>>> f.tell()
11
>>> f.seek(0)
0
>>> f.readline()
'1. 햄버거\n'
>>> f.tell()
11
>>> img1 = open("hack.png","rb") #원본을 바이너리, 읽기모드로 연다
>>> img2 = open("hack_2.png","wb") #복사할 파일을 바이너리, 쓰기 모드로 생성한다
>>> img2.write(img1.read()) #원본 사진의 데이터를 read로 읽어서 복사할 파일에 write시켜준다
432459
>>> img1.close() #작업후 꼭 닫아준다
>>> img2.close()
>>> x = "socket"
>>> type(x)
<class 'str'> #파이썬 언어에서 문자열 데이터는 유니코드로 이뤄졌다
>>> y = b"socket" #바이트 데이터는 문자열 앞에 b를 붙여 표현한다
>>> type(y)
<class 'bytes'> #문자열을 다루는 데이터 타입에는 바이트 데이터라는 타입도 있으며 아스키 코드로 이뤄진 데이터이다
>>> type(x.encode()) #문자열 데이터 -> 바이트 데이터
<class 'bytes'>
>>> type(y.decode("utf-8")) #바이트 데이터 -> 문자열 데이터
<class 'str'>
>>> z = bytearray(y) #바이트 데이터 타입을 바이트 배열 데이터 타입으로 변경 했다
>>> print(z)
bytearray(b'socket')
>>> type(z)
<class 'bytearray'> #문자열 데이터 타입이나 바이트 데이터 타입에서는 문자 변경이 불가능하지만 바이트 배열 타입
>>> z[0] = ord("S") #타입으로 변경하면 문자 변경이 가능해진다. ord는 영문자를 아스키코드로 변환해준다
>>> print(z)
bytearray(b'Socket')
>>> y = bytes(z) # 바이트 배열 데이터 타입을 바이트 데이터 타입으로 변경할 수 있다
>>> print(y)
b'Socket'
>>> type(y)
<class 'bytes'>
reference
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=jkf941&logNo=220740467538
'python > 기초' 카테고리의 다른 글
requirements.txt 만들기 (0) | 2022.11.04 |
---|---|
[Python] 인코딩된 JSON파일 디코딩하기 (0) | 2022.10.11 |
[기초] 파이썬 문자열 개념 정리 / Python 파이썬 (0) | 2022.05.13 |
[기초] 문자열에서 특정 문자 찾기 / find(), startswith(),endswith() / Python 파이썬 (0) | 2022.05.11 |
[기초] 객체와 클래스 / Python 파이썬 (0) | 2022.04.14 |