[Python자동화처리] 파일처리:CSV파일 읽고쓰기

전보·2020년 5월 29일
1

파일처리

기본적인 파일 읽고 쓰기에 대한 내용은 링크참고

특히 파일읽고쓰기 할 때에는 with문을 쓰는 것을 권장한다.

f = open("C:/doit/새파일.txt", 'w')
f.close()

이렇게 open함수로만 처리하면 f.close()를 해주어야한다.
f.close()는 열려 있는 파일 객체를 닫아 주는 역할을 하는데, 사실 프로그램을 종료할 때 파이썬 프로그램이 열려 있는 파일의 객체를 자동으로 닫아주기 때문에 이 문장은 생략해도 되지만, 쓰기모드로 열었던 파일을 닫지 않고 다시 사용하려고 하면 오류가 발생하기 때문에 close()를 사용해서 닫아 주는 것이 좋다.

그러나 with문은 파일을 열고 닫는 것을 자동으로 처리 해 준다.
그러므로 오류가 발생하는 것을 최대한 막기 위해서는 with문으로 사용하는 것이 좋다.

with open("foo.txt", "w") as f:
    f.write("Life is too short, you need python")

1. CSV파일읽기

CSV파일은 엑셀파일처럼 테이블형식으로 파일을 저장하는 형식이다.
한 줄이 한 개의 행이고, 열 사이에는 쉼표(,)를 넣어 구분한다.
............................................
인덱스, 이름, 반, 번호
0, 정석, 1, 56
1, 범준, 2, 51
2, 미도, 2, 43
.............................................

1.1 배열로 변환

파이썬으로 csv파일을 읽을 때는 한줄을 배열로 저장한다.

import csv
read_list = []
with open('/Applications/Python 3.8/test.csv', 'r') as file:
    file_read = csv.reader(file)
    for line in file:
    	read_list.append(line)	
print(read_list)

1.2 딕셔너리로 변환

with open('/Applications/Python 3.8/test.csv', 'r') as f:
	reader = csv.DictReader(f)
	for c in reader:
		print(c)

2. CSV파일쓰기

2.1 배열을 csv로

import csv

file_list = [[0, "정석", 1, 56],[1, "범준", 2, 51],[2, "미도", 2, 43]]
with open('write_test.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(["인덱스","이름","반","번호"])
    for i in file_list:
        writer.writerow(i)

2.2 딕셔너리를 csv로

import csv

with open('write_test.csv', 'w', newline='') as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames = ['인덱스','이름','반','번호'])
    writer.writeheader()
    writer.writerow({'인덱스': '0', '이름': '정석', '반': '1', '번호': '56'})
    writer.writerow({'인덱스': '1', '이름': '범준', '반': '2', '번호': '29'})
    writer.writerow({'인덱스': '2', '이름': '창모', '반': '1', '번호': '34'})

3. CSV파일처리 코드

import csv

#CSV읽기
def csv_read(address:str) -> list:
    read_list = []
    with open(address, 'r') as f:
        file_read = csv.reader(f)
        for line in file_read:
            read_list.append(line)
    return read_list

#CSV파일 2개의 데이터의 시리얼넘버를 비교해서 일치하면 관련 데이터를 추가하는 함수
def insert_data(name, output_list, compare_list):
    compare_list[0].insert(3,'S/N')
    for i in range(1,len(compare_list)):
        count = 0
        for j in range(1,len(output_list)):
            if compare_list[i][0] == output_list[j][3]:
                compare_list[i].insert(3,output_list[j][2])
                count += 1
                break
        if count == 0:
            compare_list[i].insert(3, 'Not')
    file_write(name, compare_list)

#CSV쓰기
#새로 데이터가 추가된 데이터로 다시 새로운 CSV를 만듬.
def file_write(name, new_list):
    with open(name, 'w', newline='') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(new_list[0])
        for i in new_list[1:]:
            writer.writerow(i)
profile
엉망진창

0개의 댓글