Python非特定写异常

Python非特定写异常,python,file-io,python-2.7,ioerror,Python,File Io,Python 2.7,Ioerror,目前,我正在自学Python,并通过编写脚本从现有文件中读取文本和向现有文件中添加文本来学习文件I/O。脚本一直运行,直到我调用write()方法,此时它抛出一个非特定异常-这是回溯: File "test.py", line 13, in <module> f.write(txt) IOError: [Errno 0] Error 我的环境是Win7、PowerShell和Notepad++中的Pyt

目前,我正在自学Python,并通过编写脚本从现有文件中读取文本和向现有文件中添加文本来学习文件I/O。脚本一直运行,直到我调用write()方法,此时它抛出一个非特定异常-这是回溯:

            File "test.py", line 13, in <module>
                f.write(txt)
            IOError: [Errno 0] Error
我的环境是Win7、PowerShell和Notepad++中的Python 2.7.3

这是什么原因造成的?我该怎么修?据我所知,
a+
访问模式应该允许我读取和附加文件。将访问模式更改为
r+
会产生相同的异常

澄清:

  • 我有一个现有的文本文件(a.txt),其中有一个单词,我将其作为参数传递给脚本,如下所示:

            python test.py a.txt
    
  • 我在Windows中有一个管理员帐户

结果:


至少,添加两个
seek()
命令可以解决此问题-详细信息请参见回复帖子。

由于某种原因,当您在
a+
模式下打开文件时,在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。

当您尝试添加较小大小的文本时会出现问题:文本保留在缓冲区中,在接收到更多数据后,在真正写入之前保留文本。
因此,为了确保真正的写作,请按照文档中关于
os.fsync()
flush()

顺便说一下,最好使用
with
语句

使用二进制模式更好。在您的情况下,应该没有问题,因为您只需在阅读后添加文本,然后使用
seek(o,o)
。但是,如果要将文件指针正确地移动到文件的字节中,则绝对有必要使用二进制模式[code>open中的
'b'
(filename'rb+)]

我从来没有使用过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()

您的用户是否具有正确的写入权限?另外,举一个
txt
的例子会很有帮助。您是否使用多线程?我已经测试过将“txt”(在PowerShell中)作为字母数字字符串或纯字符输入。如何检查我的写入权限?我在Win的一个管理员帐户下(如果有帮助的话。)@lucemia-你说的“使用多线程”是什么意思?试试
.writelines(txt)
而不是
.write(txt)
只是一个简单的想法:)澄清一下,我有一个现有的文本文件,其中有一个单词,我将其作为参数传递给脚本。我将如何验证写访问权限?它是否与Win7中的常规用户权限设置相同?(如果是这样的话,我在和管理员帐户下,并且拥有我所能看到的适当权限。)我认为现在这不是问题所在,感谢Win7代码,但这根本不违背复合读写模式的意义吗?我不知道是什么原因造成的。它完全违背了它,我也不知道为什么第一个代码在windows上不起作用。事实并非如此。这好像是某个地方的错误。@jgritty使用
close()
与我的代码中的
flush()
fsync()
具有相同的效果:在执行关闭之前,将强制写入缓冲区中剩余的内容。不幸的是,此代码显示出与问题中相同的错误。我可以确认;提供的代码仍然会产生相同的问题。@jgritty您是对的,它在我自己的计算机上不工作。我已经添加了
seek(0,2)
,现在它可以工作了。我认为在读取之后,文件的指针正好在EOF之后,
seek(0,2)
将其移动到EOF(文件结尾)之前的正确位置。尽管有人在stackoverflow上对我说EOF实际上不存在(!!)。无论如何,添加
seek(0,2)
使代码能够正常工作,并且似乎能够修复它。谁会猜到
搜索(0,2)
是必要的。@jgritty肯定是一个与IO处理做了很多斗争的人:)
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()