2012-12-13 20 views
4

目前自学Python,并通过编写脚本来读取文本并将文本添加到现有文件来学习文件I/O。脚本运行,直到我调用write()方法,此时它抛出一个非特定的例外 - 这是回溯: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)即可。但是,当一个人想该文件的指针正确地移动到文件的字节数,这是绝对必要使用二进制模式[中'b'open(filename, 'rb+')]

我personnaly从来没有使用'a+',我从来没有明白什么是它的效果。

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)''使得代码工作 – eyquem

1

由于某种原因,当您在a+模式下打开文件时,print f.read()在OS X上不起作用。

在Max OS X上,将打开模式更改为r+,然后在第二次读取前添加f.seek(0)行使其工作。可悲的是,这并没有帮助Windows。

这是Mac OS的工作代码:

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() 

这是我能得到它在Windows 7上运行的唯一方法:这似乎超级哈克

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() 

。这也应该适用于Mac OS X。

+0

为了澄清,我有一个现有的文本文件,在那里,我作为参数传递给脚本。我将如何去核实写入权限?它是否与Win7中的常规用户权限设置相同? (如果是这样,我在和管理员帐户,并具有适当的权限,据我所见)。 – interloper

+0

我不认为这是现在的问题 – jgritty

+0

感谢您的Win7代码,但不是基本上无视这一点具有复合读取+写入模式?我不知道什么是负责任的。 – interloper