python3 전화번호 파일 만들고 자르기

세벌의 이미지

전화번호만 죽 있는 파일에 형식을 몇개 넣고 커다란 파일을 여러개로 자르는 예제

제가 필요해서 여러분의 도움과 인터넷 검색을 통해 만든 것 정보 공유합니다. 초보라 어설픈 부분도 있지만 누군가에게 도움이 되리라 생각해서 올립니다. 더 깔끔한 방법 아시면 댓글로 알려주시며 감사.

전화번호만 있는 파일에 형식 넣기

def f(f_in, f_out):
    for line in f_in:
        stripped_line = line.strip()
        print("name" + "," + "name2" + "," + stripped_line, file=f_out)
 
 
fin=open("tel000.csv","r")
fout=open("formtel.csv","w")
 
f(fin, fout)

커다란 파일을 여러개로 자르기

myfile='formtel.csv'
 
lsline=[]
with open(myfile,'r') as rf:
    for row in rf:
        lsline.append(row)
 
outCount=1
lCnt=0
LPF=1000 # line per file
LeftLine=True
 
while LeftLine:
    cnt=0
    incr=(outCount-1) * LPF
    left= len(lsline) - incr
#    fName="mtel" + str(outCount*LPF) + ".csv"
    fName="mtel" + str(outCount) + ".csv"
    newLine=[]
    if left < LPF:
        while cnt< left:
            newLine.append(lsline[lCnt])
            cnt +=1
            lCnt+=1
        LeftLine=False
    else:
        while cnt< LPF:
            newLine.append(lsline[lCnt])
            cnt +=1
            lCnt+=1
    outCount+=1
    with open(fName,'w') as wf:
        wf.write("name1,name2,tel\n")
        for row in newLine:
            wf.write(row)
Forums: 
 의 이미지

만족스러울 만큼 깔끔한지 아닌지는 보는 사람 기준에 따라 다르겠지요.
저도 한 번 해 봤습니다.

그런 그렇고, "커다란 파일을 여러개로 자르기"를 최대한 파일 전체를 한번에 읽어들여 리스트로 만들지 않고 해 보려고 했는데, 생각대로 잘 됐는지 모르겠네요.
게다가 라인 수를 미리 세고 시작할 수가 없어서 empty라는 변수를 도입한데다가, 맨 뒤에 빈 파일이 하나 생기는 걸 막을 방법이 마땅치 않습니다. -_-;;

#!/usr/bin/python3
 
def f(f_in, f_out):
    for line in f_in:
        print("name", "name2", line, sep=',', end='', file=f_out)
 
def g(f_in, f_out_template, LPF):
    import itertools
    def slice_file(f):
        while True:
            yield itertools.islice(f, LPF)
 
    for no, lines in enumerate(slice_file(f_in), start=1):
        with open(f_out_template.format(no=no), "wt") as f_out:
            print("name1", "name2", "tel", sep=',', file=f_out)
            empty = True
            for line in lines:
                empty = False
                print(line, end='', file=f_out)
            if empty:
                return
 
if __name__ == "__main__":
    with open("tel000.csv","rt") as f_in, open("formtel.csv","w") as f_out:
        f(f_in, f_out)
    with open("formtel.csv", "rt") as f_in:
        g(f_in, "mtel{no:03d}.csv", 1000)