복붙노트

[PYTHON] 초심자 파이썬 : 동일한 파일 읽기 및 쓰기

PYTHON

초심자 파이썬 : 동일한 파일 읽기 및 쓰기

일주일 전 Python을 시작했고 동일한 파일을 읽고 쓰는 것에 대해 몇 가지 질문을했습니다. 나는 온라인 튜토리얼을 보았지만 아직도 혼란 스럽다. 단순한 읽기 및 쓰기 파일을 이해할 수 있습니다.

openFile = open("filepath", "r")
readFile = openFile.read()
print readFile 

openFile = open("filepath", "a")
appendFile = openFile.write("\nTest 123")

openFile.close()

그러나 다음을 시도해 보면 필자가 쓰고있는 텍스트 파일에 알려지지 않은 텍스트가 많이 있습니다. 누구나 왜 그런 오류가 발생하는지 설명 할 수 있으며 아래에 표시된 것과 같은 openFile 객체를 사용할 수없는 이유는 무엇입니까?

# I get an error when I use the codes below:       
openFile = open("filepath", "r+")
writeFile = openFile.write("Test abc")

readFile = openFile.read()
print readFile

openFile.close()

나는 나의 문제를 명확히하려고 노력할 것이다. 위의 예에서 openFile은 파일을 여는 데 사용되는 객체입니다. 나는 처음 쓰기를 원한다면 아무런 문제가 없습니다. 같은 openFile을 사용하여 파일을 읽거나 파일에 추가하려고합니다. 그것은 발생하지 않거나 오류가 주어집니다. 동일한 파일에 다른 읽기 / 쓰기 작업을 수행하기 전에 동일한 / 다른 열린 파일 객체를 선언해야합니다.

#I have no problems if I do this:    
openFile = open("filepath", "r+")
writeFile = openFile.write("Test abc")

openFile2 = open("filepath", "r+")
readFile = openFile2.read()
print readFile

openFile.close()

누구든지 내가 잘못한 것을 말할 수 있다면 그것은 감사 할 것입니다. 아니면 단지 Pythong 일뿐입니다. 파이썬 2.7을 사용하고 있습니다. 감사!

해결법

  1. ==============================

    1.업데이트 된 응답 :

    업데이트 된 응답 :

    이것은 Windows 고유의 버그 인 것처럼 보입니다 - http://bugs.python.org/issue1521491.

    http://mail.python.org/pipermail/python-bugs-list/2005-August/029886.html에 설명 된 해결 방법을 인용하십시오.

    읽기 ()와 쓰기 () 사이.

    필자의 원래 응답은 추가 작업을 위해 연 파일과 동일한 파일에서 읽기 / 쓰기 작업을 수행하는 방법을 보여줍니다. Windows를 사용하는 경우에는 사실이 아닙니다.

    최초 대응 :

    'r +'모드에서 write 메소드를 사용하면 포인터가있는 위치에 따라 문자열 객체가 파일에 기록됩니다. 귀하의 경우에는 "Test abc"라는 문자열을 파일의 시작 부분에 추가합니다. 아래 예를 참조하십시오.

    >>> f=open("a","r+")
    >>> f.read()
    'Test abc\nfasdfafasdfa\nsdfgsd\n'
    >>> f.write("foooooooooooooo")
    >>> f.close()
    >>> f=open("a","r+")
    >>> f.read()
    'Test abc\nfasdfafasdfa\nsdfgsd\nfoooooooooooooo'
    

    포인터가 이미 파일의 끝에 있기 때문에 "foooooooooooooo"라는 문자열이 파일 끝에 추가되었습니다.

    바이너리와 텍스트 파일을 구별하는 시스템을 사용하고 있습니까? 이 경우 모드로 'rb +'를 사용하는 것이 좋습니다.

  2. ==============================

    2.모든 열린 파일에는 데이터를 읽고 쓰는 위치를 나타내는 암시 적 포인터가 있습니다. 일반적으로 이것은 파일의 시작을 기본값으로하지만, (append) 모드를 사용하면 기본값은 파일의 끝입니다. 또한 모드에 +를 추가하더라도 w 모드가 파일을 자르 (즉, 모든 내용을 삭제합니다) 유의해야합니다.

    모든 열린 파일에는 데이터를 읽고 쓰는 위치를 나타내는 암시 적 포인터가 있습니다. 일반적으로 이것은 파일의 시작을 기본값으로하지만, (append) 모드를 사용하면 기본값은 파일의 끝입니다. 또한 모드에 +를 추가하더라도 w 모드가 파일을 자르 (즉, 모든 내용을 삭제합니다) 유의해야합니다.

    N 문자를 읽거나 쓸 때마다 읽기 / 쓰기 포인터가 파일 내에서 그 양만큼 앞으로 이동합니다. 나는 이것을 오래된 카세트 테이프처럼 생각하는 것이 도움이된다고 생각합니다. 따라서 다음 코드를 실행 한 경우

    fd = open("testfile.txt", "w+")
    fd.write("This is a test file.\n")
    fd.close()
    
    fd = open("testfile.txt", "r+")
    print fd.read(4)
    fd.write(" IS")
    fd.close()
    

    ... 이것은 인쇄를 끝내야하고 파일 내용을이 파일을 테스트 파일로 남겨 두어야합니다. 이것은 포인터가 파일의 시작 부분에 있기 때문에 파일의 처음 4자를 반환하기 때문에입니다. 파일. 포인터는 다음의 write ( "IS")가 공백 문자 (이미있는 것과 동일 함)를 덮어 씁니다. IS 다음에 기존 문자를 바꿉니다.

    파일의 seek () 메서드를 사용하여 특정 지점으로 이동할 수 있습니다. 위의 예에서 다음을 실행 한 경우 :

    fd = open("testfile.txt", "r+")
    fd.seek(10)
    fd.write("TEST")
    fd.close()
    

    ... 그러면 파일에 이제 This is TEST file이 있음을 알게 될 것입니다.

    이 모든 것은 유닉스 시스템에 적용되며,이 예제들을 테스트하여 확신 할 수있다. 그러나 Windows 시스템에서 read () 및 write ()를 혼합하는 데 문제가있었습니다. 예를 들어, Windows 컴퓨터에서 첫 번째 예제를 실행하면 올바르게 인쇄되지만 나중에 파일을 검사하면 write ()가 완전히 무시됩니다. 그러나 두 번째 예제 (seek () 사용)는 Windows에서 제대로 작동하는 것 같습니다.

    요약하면 Windows에서 파일의 중간에서 읽고 쓰기를 원한다면 항상 읽기 / 쓰기 포인터의 위치에 의존하지 않고 명시 적 seek ()을 사용하는 것이 좋습니다. 읽기만하거나 쓰기 만하고 있다면 꽤 안전합니다.

    마지막으로, Windows에서 리터럴 문자열로 경로를 지정하는 경우 백 슬래시를 이스케이프 처리해야합니다.

    fd = open("C:\\Users\\johndoe\\Desktop\\testfile.txt", "r+")
    

    또는 시작 부분에 r을 입력하여 원시 문자열을 사용할 수 있습니다.

    fd = open(r"C:\Users\johndoe\Desktop\testfile.txt", "r+")
    

    또는 가장 이식 가능한 옵션은 os.path.join ()을 사용하는 것입니다.

    fd = open(os.path.join("C:\\", "Users", "johndoe", "Desktop", "testfile.txt"), "r+")
    

    파일 IO에 대한 더 많은 정보는 공식 파이썬 문서에서 찾을 수 있습니다.

  3. ==============================

    3.읽기 및 쓰기는 현재 파일 포인터가있는 곳에서 일어나며 각 읽기 / 쓰기와 함께 진행됩니다. 특정 경우 openFile에 쓰면 파일 포인터가 파일의 끝을 가리 킵니다. 끝에서 읽으려고하면 EOF가 발생합니다. 파일 포인터를 다시 읽기 전에 seek (0)을하기 전에 파일의 시작 부분을 가리 키도록 파일 포인터를 재설정해야합니다.

    읽기 및 쓰기는 현재 파일 포인터가있는 곳에서 일어나며 각 읽기 / 쓰기와 함께 진행됩니다. 특정 경우 openFile에 쓰면 파일 포인터가 파일의 끝을 가리 킵니다. 끝에서 읽으려고하면 EOF가 발생합니다. 파일 포인터를 다시 읽기 전에 seek (0)을하기 전에 파일의 시작 부분을 가리 키도록 파일 포인터를 재설정해야합니다.

  4. from https://stackoverflow.com/questions/14271216/beginner-python-reading-and-writing-to-the-same-file by cc-by-sa and MIT license