看来,一个write()
紧跟在read()
上打开的文件r+
(或r+b
)在Windows的权限不更新文件。
假设testfile.txt
当前目录中有一个文件,其内容如下:
This is a test file.
我执行以下代码:
with open("testfile.txt", "r+b") as fd:
print fd.read(4)
fd.write("----")
我希望代码可以打印This
并将文件内容更新为:
This----a test file.
至少在Linux上这可以正常工作。但是,当我在Windows上运行它时,该消息会正确显示,但文件没有更改-
就像write()
被忽略了一样。如果我tell()
在文件句柄上调用它,则表明位置已更新(4
在write()
和之前和8
之后),但文件没有更改。
但是,如果我fd.seek(4)
在该write()
行的前面放了一个明确的名称,那么一切都会按照我的预期工作。
有人知道Windows下这种行为的原因吗?
供参考,我在Windows NT 7分区上使用Python 2.7.3。
编辑
在回应的意见,我都尝试r+b
和rb+
-的官方Python文档似乎意味着前者是规范的。
我fd.flush()
在各个地方拨打了电话,并在read()
和之间放置了一个电话,write()
如下所示:
with open("testfile.txt", "r+b") as fd:
print fd.read(4)
fd.flush()
fd.write("----")
…产生以下有趣的错误:
IOError: [Errno 0] Error
编辑2
间接地,加入的flush()
帮助,因为它使我这个帖子描述了类似的问题。如果对此发表评论的人之一是正确的,那是底层Windows C库中的错误。
Python的文件操作应遵循libc
约定,因为它是在内部使用C文件IO函数实现的。
从fopen手册页或cplusplus中的fopen页引用
对于允许追加输入和输出操作而打开的要追加的文件(带有“
+”号的文件),应在写入操作和随后的写入操作之间对流进行刷新(fflush)或重新定位(fseek,fsetpos,rewind)。读取操作或未到达文件末尾的读取操作,然后进行写入操作。
总结一下,如果需要在写入后读取文件,则需要fflush
缓冲区,读取后的写入操作应以开头fseek
,如fd.seek(0,os.SEEK_CUR)
因此,只需将您的代码段更改为
with open("test1.txt", "r+b") as fd:
print fd.read(4)
fd.seek(0, os.SEEK_CUR)
fd.write("----")
该行为与类似的C程序的行为一致
#include <cstdio>
int main()
{
char buffer[5] = {0};
FILE *fp = fopen("D:\\Temp\\test1.txt","rb+");
fread(buffer, sizeof(char), 4, fp);
printf("%s\n", buffer);
/*without fseek, file would not be updated*/
fseek(fp, 0, SEEK_CUR);
fwrite("----",sizeof(char), 4, fp);
fclose(fp);
return 0;
}
问题内容: 我倾向于只对路径(’/’)使用正斜杠,而python在Windows上也很满意。在os.path.join的描述中,它说的是跨平台的正确方法。但是当我使用它时,我会得到混合的斜杠: 这个对吗?我应该稍后检查并更正它,还是有更好的方法? 谢谢 编辑:询问路径时,我也会得到斜杠 问题答案: 现在,您自己提供了一些斜线,让其他人选择。最好让python选择所有它们,或者自己提供它们。Pyth
问题内容: 我正在编写一个脚本,该脚本记录来自另一个程序的错误,并在遇到错误时从中断的地方重新启动该程序。不管出于什么原因,该程序的开发人员都没有必要默认将此功能放入其程序中。 无论如何,程序都会获取一个输入文件,对其进行解析,然后创建一个输出文件。输入文件采用特定格式: 当程序引发错误时,它会为您提供跟踪错误所需的参考信息- 即UI,哪个部分(标题或摘要)以及相对于标题或摘要开头的行号。我想使用
问题内容: 我一直在用Python开发一个库,我想做一些性能改进。 是否可以在Python中编写一些代码并在Go中编写一些代码,并在它们之间传递数据?如果可能的话,是否有任何有关此操作的示例? 像这样: 问题答案: 你需要一个 胶 之间,例如编程语言或通信通过网络。如果您将https://docs.python.org/2/extending/extending.html与http://golan
问题内容: 我有一个主要为UTF-8的文件,但是也发现了一些Windows-1252字符。 我创建了一个表,以将Windows-1252(cp1252)字符映射到对应的Unicode对应表,并希望使用它来修复编码错误的字符,例如 但是尝试以这种方式进行替换会导致引发UnicodeDecodeError,例如: 有关如何处理此问题的任何想法? 问题答案: 如您所知,如果您尝试将此字符串解码为utf-
问题内容: 我正在寻找解决上述问题的解决方案。 这是我的“无效代码”。charsInCurrentBuffer始终返回-1! 问题答案: 当你从FD中,“用户的定位缓冲区和文件偏移都必须是文件系统的逻辑块大小的倍数”(引自手册页在Linux上)。其他环境对此可能有不同的约束,并且实际上是依赖于文件系统的。 通常情况并非如此(除非您很幸运)。 如果平台具有该功能,则应考虑使用该功能,或者只是分配一个
问题内容: 如何在Windows上正确安装virtualenv? 我从这里下载virtualenv1.9.1并尝试使用以下命令安装它: 但它没有出现在MyPythonPath / Scripts中 我尝试以相同的方式安装virutalenvwrapper- win 并正确安装。但是我不能使用它,因为我没有virtualenv python.exe:无法打开文件“ MyPythonPath \ Sc