Home Python 15 - File 2
Post
Cancel

Python 15 - File 2

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는

    methoddisc
    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해야함.

    printend 를 신경써야함.
    보통 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도는건 무조건인듯.

참고

fileinput

This post is licensed under CC BY 4.0 by the author.

Python 14 - File 1

Virtualization

Comments powered by Disqus.