2012-12-13 5 views
4

현재 Python을 가르치고 기존 파일에 텍스트를 읽고 텍스트를 추가하는 스크립트를 작성하여 파일 I/O를 학습합니다.Python 비 특정 쓰기 예외

  File "test.py", line 13, in <module> 
       f.write(txt) 
      IOError: [Errno 0] Error 

내 코드 :

  from sys import argv 

      script, filename = argv 

      f = open(filename, 'a+') 

      print("The contents of %s are:") % filename 

      print f.read() 

      txt = raw_input("What would you like to add? ") 

      f.write(txt) 

      print("The new contents are:") 

      print f.read() 

      f.close() 

내 환경은 - 내가하는 것이 아닌 특정 예외를 발생 포인트, 쓰기() 메서드를 호출 할 때까지 스크립트가 실행이 역 추적입니다 Win7, PowerShell, Notepad ++의 Python 2.7.3.

이 문제의 원인은 무엇입니까? 내가 어떻게 고칠 수 있니? 내 이해에서 a+ 액세스 모드를 사용하면 파일을 읽고 추가 할 수 있습니다. 액세스 모드를 r+으로 변경하면 동일한 예외가 발생합니다.

부연 설명 :

  • 나는 내가 지금처럼, 스크립트에 인수로 전달합니다 거기에 하나의 단어로 기존의 텍스트 파일 (a.txt이)이 있습니다

     python test.py a.txt 
    
  • Windows의 관리자 계정을 사용하고 있습니다.

결과 : 최소한

, 두 seek() 명령을 추가하여 문제를 해결 - 응답 이후에 설명.

+1

사용자에게 쓰기 권한이 있습니까? – Colleen

+0

또한 'txt'의 예가 도움이 될 것입니다. – Colleen

+0

멀티 스레드를 사용합니까? – lucemia

답변

1

작은 크기의 텍스트를 추가하려고 할 때 문제가 발생합니다. 더 많은 데이터를받은 후 실제 쓰기가 완료되기 전에 텍스트를 유지하는 버퍼에 남아 있습니다.
그래서, 그것은 그런데

os.fsync()flush()에 관한 문서에 설명 된대로, 정말 쓰기 할 확실하게, with 문을 사용하는 것이 좋습니다.

그리고 여전히 바이너리 모드를 사용하는 것이 더 좋습니다. 귀하의 경우, 단지 독서 후에 텍스트를 추가하고 단지 seek(o,o)을 사용하기 때문에 문제가 없어야합니다.하나는 파일의 바이트로 올바르게 파일의 포인터를 이동하고자 할 때, 그것은 내가 'a+'를 사용하지 않을 PERSONNALY 바이너리 모드 [open(filename, 'rb+')에서 'b']

를 사용하는 것이 절대적으로 필요하다, 나는 그것의 효과는 무엇인가 이해 적이 없어요 .

from sys import argv 
from os import fsync 

script, filename = argv 

with open(filename, 'rb+') as f: 
    print("The contents of %s are:") % filename 
    print f.read() 

    f.seek(0,2) 
    txt = raw_input("What would you like to add? ") 
    f.write(txt) 
    f.flush() 
    fsync(f.fileno()) 

    f.seek(0,0) 
    print("The new contents are:") 
    print f.read() 
+0

이 코드는 불행히도이 질문과 동일한 오류를 보여줍니다. – jgritty

+0

확인할 수 있습니다. 제공된 코드는 여전히 동일한 문제를 발생시킵니다. – interloper

+0

@jgritty 당신 말이 맞아요, 내 컴퓨터에서 작동하지 않았어요. 나는''seek (0,2)''를 추가했고 이제는 작동한다. 나는 파일을 읽은 후에 포인터가 EOF 바로 뒤에 있고''seek (0,2)''가 그것을 바로 앞에있는 EOF (파일 끝) 바로 앞의 장소. 누군가가 stackoverflow에서 EOF가 실제로 존재하지 않는다고 (!!). 어쨌든 "seek (0,2)"를 추가하면 work – eyquem

1

a+ 모드에서 파일을 연 경우 어떤 이유로 인해 OS X에서 나를 위해 작동하지 않습니다.

최대 OS X에서 열린 모드를 r+으로 변경 한 다음 두 번째 읽기 전에 f.seek(0) 행을 추가하면 작동합니다. 슬프게도,이 창문을 도움이되지 않습니다.

from sys import argv 

script, filename = argv 

f = open(filename, 'r') 

print("The contents of %s are:") % filename 

print f.read() 
f.close() 

txt = raw_input("What would you like to add? ") 

f = open(filename, 'a') 
f.write(txt) 
f.close() 
f = open(filename, 'r') 

print("The new contents are:") 

print f.read() 

f.close() 

슈퍼 해키 보인다

from sys import argv 

script, filename = argv 

f = open(filename, 'r+') 

print("The contents of %s are:") % filename 

print f.read() 

txt = raw_input("What would you like to add? ") 

f.write(txt) 

print("The new contents are:") 

f.seek(0) 
print f.read() 

f.close() 

이 나는 ​​그것이 윈도우 7에서 작동하도록 얻을 수있는 유일한 방법은 다음과 같습니다

이 맥 OS에서 작동 코드입니다. 이것은 Mac OS X에서도 역시 작동합니다.

+0

분명히하기 위해, 나는 한 단어로 된 기존 텍스트 파일을 가지고 있습니다. 그 안에 내가 대본에 대한 논증으로 전달합니다. 쓰기 액세스 확인 방법은 어떻게됩니까? Win7의 일반 사용자 권한 설정과 동일합니까? (그렇다면 관리자 계정을 사용하고 있고 볼 수있는 적절한 권한이 있습니다.) – interloper

+0

지금은 문제가 아닌 것 같아요. – jgritty

+0

Win7 코드 주셔서 감사합니다.하지만 기본적으로 그 점을 무시하지는 않습니다. 화합물 읽기 + 쓰기 모드가 있습니까? 나는 책임이 뭔지 궁금해. – interloper