intro
- 전에 그냥 넘어갔는데
file1에서 쓴 내용을 토대로하면
file내용 수정하는 과정이 쉽지 않다. write는 덮어쓴다.
이게 제일 불편한데1 2 3 4 5 6
f = open('test.txt', 'w+', encoding='utf-8') f.write('Hello, world!\n') f.seek(0) f.write('new') f.seek(0) print(f.read())
1
newlo, world!
이런식.
길이가 안맞으면 어그러짐.이 때문에 중간 내용을 수정할 수가 없음.
1 2 3
name : Anonymous age : 1190 address : seoul
이 경우 그냥 age를 25로 바꿀수가 없음.
readlines로 읽고 해당 line를 수정하고
파일을 다시 쓰는 식이 될듯함.- 결국엔 수정을 위해
파일을 처음부터 다시쓰게됨.
언제나 이런경우 파일이 커지면,
수정이 잦으면 문제임. - 아무튼 이런경우
fileinput를 쓴다함
fileinput
- 이 모듈은 표준 입력이나
파일 목록에 대한 루프를
빠르게 작성하기 위해 쓰임 - 하나의 파일을 읽거나 쓰려면
open()을 쓰래.
init
찾아보면서 많이 나온건
fileinput.input/fileinput.fileinput
이렇게 있는데 둘은 같음.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
def input(files=None, inplace=False, backup="", *, mode="r", openhook=None, encoding=None, errors=None): class FileInput: def __init__(self, files=None, inplace=False, backup="", *, mode="r", openhook=None, encoding=None, errors=None):
실제로
fileinfo.input()안에서
fileinput을 생성함.- 그렇다 치고, parameter가 많은데
그리 자주 쓰는것같지 않아 넘어감 기본적으로
1 2 3 4
import fileinput f = fileinput.FileInput("test.txt", inplace=True, backup=".bak") # f = fileinput.input("test.txt", inplace=True, backup=".bak")
요정도?
inplace는 뒤에 다시.
backup은 수정이 될 경우
원본 저장 정보.
method
쓸 수 있는 method는
method disc filename() 현재 읽고 있는 파일의 이름 fileno() 현재 파일의 정수 “파일 기술자” lineno() 방금 읽은 줄의 누적 줄 번호 filelineno() 현재 파일의 줄 번호 isfirstline() 파일의 첫 번째 줄이면 True isstdin() 마지막 줄을 sys.stdin에서 읽었으면 True nextfile() 다음 파일을 읽도록 현재 파일을 닫음 close() 시퀀스를 닫음. 귀찮아서 간추렸기 때문에
정확한건 직접.
inplace
- 쓰다보니까 이상해서.
- 일단, 단순히 읽고 쓰는게 아니기도하고
처음에 생각했던거랑 좀 다르기도하고. - 암튼 이상한점들은 option에
inplace때문인듯함.
read
read는 단순하게 보면
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
import fileinput import sys origin = open('test.txt', 'w') origin.write("subject\n") origin.write("some test file line 1\n") origin.write("some test file line 2\n") origin.write("some test file line 3\n") origin.write("some test file line 4\n") origin.write("some test file line 5\n") origin.close() # print(dir(fileinput)) f = fileinput.FileInput("test.txt", inplace=True, backup=".bak") for line in f: pass
for을 보면 딱히 한게 없는데
test.txt내용을 보면 암껏도 없음.test.txt.bak을 보면
1 2 3 4 5 6
subject some test file line 1 some test file line 2 some test file line 3 some test file line 4 some test file line 5
- fileinput은 읽으면서
해당 line를 지우는듯하다.
이건 inplace가True라서 그렇다함. - 암튼
inplace=True의 경우
세 가지 효과가 있는데print출력이 console에서
해당 파일로 고정되고- 파일을 읽음과 동시애 해당 line를 지우고
- 수정이 가능해진다.
False일 경우1 2 3 4 5 6
subject some test file line 1 some test file line 2 some test file line 3 some test file line 4 some test file line 5
결과는 당연히 아무일도 안일어남.
write
- 쓰기는
print또는sys.stdout.write로 가능하다. inplace=False는 수정이 불가능하니 생략한다.for안에서pass대신1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
import fileinput import sys origin = open('test.txt', 'w') origin.write("subject\n") origin.write("some test file line 1\n") origin.write("some test file line 2\n") origin.write("some test file line 3\n") origin.write("some test file line 4\n") origin.write("some test file line 5\n") origin.close() # print(dir(fileinput)) f = fileinput.FileInput("test.txt", inplace=True, backup=".bak") for line in f: print(line, end = '') sys.stdout.write(line)
주의할점은
write는 그대로 써주는데
sys를 import해야함.print는end를 신경써야함.
보통 line끝은\n으로 끝나고
print도\n을 자동으로 붙여줘서
빈줄 하나씩 생성됨.1 2 3 4 5 6 7 8 9 10 11 12
subject subject some test file line 1 some test file line 1 some test file line 2 some test file line 2 some test file line 3 some test file line 3 some test file line 4 some test file line 4 some test file line 5 some test file line 5
암튼 결과는 이렇게됨.
method도 출력을 해보면
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
import fileinput import sys origin = open('test.txt', 'w') origin.write("subject\n") origin.write("some test file line 1\n") origin.write("some test file line 2\n") origin.write("some test file line 3\n") origin.write("some test file line 4\n") origin.write("some test file line 5\n") origin.close() f = fileinput.FileInput("test.txt", inplace=True, backup=".bak") # f = fileinput.input("test.txt", inplace=True, backup=".bak") print(f'filename : {f.filename()}') print(f'fileno : {f.fileno()}') print(f'lineno : {f.lineno()}') print(f'filelineno : {f.filelineno()}') print(f'isfirstline : {f.isfirstline()}') print(f'isstdin : {f.isstdin()}') print(f'nextfile : {f.nextfile()}') for line in f: print(line , end='') print(f'filename : {f.filename()}') print(f'fileno : {f.fileno()}') print(f'lineno : {f.lineno()}') print(f'filelineno : {f.filelineno()}') print(f'isfirstline : {f.isfirstline()}') print(f'isstdin : {f.isstdin()}') print() # print(f'nextfile : {f.nextfile()}')
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
# in console filename : None fileno : -1 lineno : 0 filelineno : 0 isfirstline : False isstdin : False nextfile : None # in test.txt subject filename : test.txt fileno : 3 lineno : 1 filelineno : 1 isfirstline : True isstdin : False some test file line 1 filename : test.txt fileno : 3 lineno : 2 filelineno : 2 isfirstline : False isstdin : False some test file line 2 filename : test.txt fileno : 3 lineno : 3 filelineno : 3 isfirstline : False isstdin : False some test file line 3 filename : test.txt fileno : 3 lineno : 4 filelineno : 4 isfirstline : False isstdin : False some test file line 4 filename : test.txt fileno : 3 lineno : 5 filelineno : 5 isfirstline : False isstdin : False some test file line 5 filename : test.txt fileno : 3 lineno : 6 filelineno : 6 isfirstline : False isstdin : False
print의 출력이 달라지는걸 볼수있고,
파일을 읽기 전에는 별 다른 값이 없음.
파일을 읽은 다음부터는
line마다 각 method return값이 달라짐.
example
- 물론 위에서도
파일을 수정한거긴하지만. 조건에 따라 하려면
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
import fileinput import sys origin = open('test.txt', 'w') origin.write("subject\n") origin.write("some test file line 1\n") origin.write("some test file line 2\n") origin.write("some test file line 3\n") origin.write("some test file line 4\n") origin.write("some test file line 5\n") origin.close() # print(dir(fileinput)) f = fileinput.FileInput("test.txt", inplace=True, backup=".bak") # f = fileinput.input("test.txt", inplace=True, backup=".bak") for line in f: # sys.stdout.write(line) if line.__contains__('3'): print(line.replace(line, 'new line 3')) # break else: print(line, end='')
1 2 3 4 5 6
subject some test file line 1 some test file line 2 new line 3 some test file line 4 some test file line 5
훠—–ㄹ씬 간단해 졌는데
break로 빠져나오면 뒷 내용이 다 날아감.
끝까지 loop도는건 무조건인듯.
Comments powered by Disqus.