akxltmzk
2/14/2020 - 8:22 AM

파일조작과 시스템

//파일 컨트롤
test_string="""\
AAA
BBB
CCC
DDD
"""
#------------------------- 파일 쓰기---------------------------------#

with open('test.txt','w') as f:  #text 파일을 생성하고 로드하라. 없으면 생성!
    f.write(test_string) #텍스트 파일 안에 내용 입력(위의 테스트 스트링 쓰기)

    """ 
    <print로 텍스트 파일에 write하는 방법>
        
    # 콘솔에 찍히는게 아니라, 텍스트 파일에 글을 쓰는 다른 방법이다(file f가 붙으면 텍스트 파일에 프린트 하겠다는 뜻)    
    print('I am print',file=f)    
    
    # -> My#name#is#Mike! 을 텍스트 파일에 추가    
    print('My','name','is','Mike',sep='#',end='!',file=f)
    """
#------------------------- 파일 읽기---------------------------------#

with open('test.txt','r') as f:
    # print(f.read()) #텍스트 전체 읽기
    while True:
        line = f.readline()
        print(line) #print를 하면 줄바꿈을 알아서 해준다
        if not line:
            break

#------------------------- 파일 읽고 쓰기----------------------------#

with open('test.txt','w+') as f: #w+는 읽고 쓰기가 둘다 가능하다는 뜻(무조건 처음에 써야지 읽기도 가능,먼저읽기불가능)
    f.write(test_string)
    f.seek(0) #파일을 다 쓰고난 후에 제일 처음 으로 돌아가서
    print(f.read()) #읽는다

with open('test.txt','r+') as f: #r+는 읽고 쓰기가 둘다 가능하다는 뜻(text.txt파일이 있을때는 먼저 읽을수있음)
    print(f.read()) #읽는다
    f.seek(0) #파일을 다 쓰고난 후에 제일 처음 으로 돌아가서
    f.write(test_string)
    
===============================================================================
//csv 컨트롤 

import csv

#----------------csv 쓰기(엑셀 만들기)---------------------#
# with open('test.csv','w') as csv_fi:   ->맥은 이렇게
with open('test.csv','w',newline="") as csv_file:
    fieldnames = ['Name','Count']
    writer = csv.DictWriter(csv_file,fieldnames=fieldnames)
    writer.writeheader()
    writer.writerow({'Name':'A','Count':1})
    writer.writerow({'Name':'B','Count': 2})

#----------------csv 쓰기(엑셀 읽기)---------------------#
with open('test.csv','r') as csv_file:
    reader = csv.DictReader(csv_file)
    for row in reader:
        print(row['Name'],row['Count'])
        
===============================================================================
//os 컨트롤 
import os
import pathlib
import glob
import shutil

print(os.path.exists('test.txt')) # True.(test.txt가 있습니까?)
print(os.path.isfile('test.txt')) # True.(test.txt는 파일입니까?)
print(os.path.isdir('test.txt')) # False.(test.txt는 폴더입니까?)
os.rename('test.txt','renamed.txt') # test.txt 이름 변경
os.symlink('renamed.txt','symlink.txt') #renamed.txt를 복사하고, 둘을 연결
                                        #renamed.txt를 병경하면 symlink.txt도 자동변경된다.
os.mkdir('test_dir') #test_dir이란 폴더를 만들어주세요
os.rmdir('test_dir') #test_dir이란 폴더를 지워주세요

pathlib.Path('empty.txt').touch() #empty.txt파일을 만들어주세요
os.remove('empty.txt') #empty.txt파일을 지워주세요

os.mkdir('test_dir')
os.mkdir('test_dir/test_dir2')
print(os.listdir('test_dir')) #[test_dir2] test_dir폴더안에는 어떤게 있습니까

pathlib.Path('test_dir/test_dir2/empty.txt').touch()
print(glob.glob('test_dir/test_dir2/*'))#test_dir2안에 있는 것들을 전부 보여주세요
shutil.copy('test_dir/test_dir2/empty.txt',
            'test_dir/test_dir2/empty2.txt') #파일 복사하기
shutil.rmtree('test_dir') #test_dir폴더를 삭제해주세요
print(os.getcwd()) #현재 파이썬폴더의 디렉터리를 알려주세요
===============================================================================
// datetime

import datetime

now = datetime.datetime.now()
print(now) # 2020-02-17 11:42:14.088238
print(now.isoformat()) # 2020-02-17T11:42:14.088238 ->iso 국제규격
print(now.strftime('%d/%m/%y-%H%M%S')) #17/02/20-114415

today = datetime.date.today()
print(today) #2020-02-17
print(today.strftime('%d/%m/%y')) #17/02/20


print(now) #2020-02-17 11:48:41.991667
d = datetime.timedelta(weeks=-1)
print(now + d) #2020-02-10 11:48:41.991667 (1주일 전)
print(now - d) #2020-02-24 11:49:18.742851 (1주일 후)

"""
d = datetime.timedelta(weeks=-1) 1주일전
d = datetime.timedelta(days=-1) 하루전
d = datetime.timedelta(days=-365) 일년전
d = datetime.timedelta(hours=-1) 한시간 전
d = datetime.timedelta(minutes=-1) 1분전
d = datetime.timedelta(second=-1) 1초전
"""

import time
print('#####')
time.sleep(2) #2초뒤에 다음함수를 실행해주세요!마치 코루틴
print('#####')

#백업파일 만들기
import os
import shutil

#text.txt
file_name = 'test.txt'

#테스트용 test.txt 파일을 만든다!
with open(file_name,'w') as f :
    f.write('test')
#test.txt파일이 있다면 날짜 함수를 이용해 백업파일을 만든다
if os.path.exists(file_name):
    shutil.copy(file_name,"{}{}".format(file_name
                                        ,now.strftime('%Y_%m_%d')))

===============================================================================
// collection.namedtuple

import csv
import collections

p = (10,20)
print(p[0]) #10
# p[0] = 100 ->10(튜플은 읽기전용이다)

Point = collections.namedtuple('Title','x , y')
p = Point(10,y=20) #namedtuple로 만든 Point는 클래스처럼 사용가능
print(p) #Title(x=10, y=20)
print(p.x) #10
#p.x=100 ->값을 못넣는다!.즉, namedtuple은 튜플처럼 값을 못넣는 클래스를 간단하게 만들어주는 라이브러리!!!!!

p1 = Point._make([100,200]) #_make -> []형을 튜플화 해준다(namedtuple에서만 사용)
print(p1) #Title(x=100, y=200)
print(p1._asdict()) #OrderedDict([('x', 100), ('y', 200)])
p1._replace(x=500)
print(p1) #Title(x=100, y=200)->replace로 해서 p1이 변경된것은 아니다!!!!
p2 = p1._replace(x=500)
print(p2) #Title(x=500, y=200)->replace는 p1의 오브젝트를 값을 바꿔서 쉽게 복사할때 사용한다.

#-----------------------------------#

class SumPoint(collections.namedtuple('Point',['x','y'])):
    @property
    def total(self):
        return self.x + self.y

p3 = SumPoint(2,3)
print(p3.x , p3.y , p3.total) # 2 3 5

#-----------------------------------#
with open('names.csv' , 'w' , newline="") as csvfile:
    fieldnames = ['first','last','address']
    writer = csv.DictWriter(csvfile,fieldnames=fieldnames)
    writer.writeheader()
    writer.writerow({'first':'Mike' , 'last':'Jackson' , 'address':'A'})
    writer.writerow({'first':'Jun' , 'last':'Sakai' , 'address':'B'})
    writer.writerow({'first':'Nancy' , 'last':'Mask' , 'address':'C'})

with open('names.csv','r') as f:
    csv_reader = csv.reader(f)
    print('csv_reader : ',csv_reader) #csv_reader :  <_csv.reader object at 0x0000028871645978>
    print('next(csv_reader) : ',next(csv_reader)) #next(csv_reader) :  ['first', 'last', 'address']
    for row in csv_reader:
        print(row)
    """
    ['first', 'last', 'address']
    ['Mike', 'Jackson', 'A']
    ['Jun', 'Sakai', 'B']
    ['Nancy', 'Mask', 'C']
    """


with open('names.csv','r') as f:
    csv_reader = csv.reader(f)
    Names = collections.namedtuple('Names', next(csv_reader))
    for row in csv_reader:
        names = Names._make(row)
        print(names.first, names.last, names.address)
    """
    Mike Jackson A
    Jun Sakai B
    Nancy Mask C
    """

===============================================================================
// collection.OrderedDict

import collections

#사전형의 순서를 무조건 지키고 싶을때 사용한다.
#OrderedDict를 사용하지 않아도 지켜지기는 하지만, 어느 상황에서는 완벽히 지켜지지 않을 때도 있다.

d = collections.OrderedDict({'banana' : 3, 'apple' : 4, 'pear' : 1, 'orange' : 2})
#출력 : OrderedDict([('banana', 3), ('apple', 4), ('pear', 1), ('orange', 2)])
print(d)