GVKun编程网logo

在Windows中的Python文件上混合read()和write()(在windows下编写的python)

6

对于在Windows中的Python文件上混合read感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍和write,并为您提供关于Android中Thread.currentThread()ge

对于在Windows中的Python文件上混合read感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍和write,并为您提供关于Android中Thread.currentThread()getId()和Process.myTid()之间的区别、Android中Thread.currentThread()。getId()和Process.myTid()之间的区别、file.canWrite(); file.canRead(); file.canExceute(); 总是返回true,虽然我的文件/目录没有访问权限、Java中的PrintWriter write()vs print()方法的有用信息。

本文目录一览:

在Windows中的Python文件上混合read()和write()(在windows下编写的python)

在Windows中的Python文件上混合read()和write()(在windows下编写的python)

看来,一个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()在文件句柄上调用它,则表明位置已更新(4write()和之前和8之后),但文件没有更改。

但是,如果我fd.seek(4)在该write()行的前面放了一个明确的名称,那么一切都会按照我的预期工作。

有人知道Windows下这种行为的原因吗?

供参考,我在Windows NT 7分区上使用Python 2.7.3。

编辑

在回应的意见,我都尝试r+brb+-的官方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库中的错误。

答案1

小编典典

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;}

Android中Thread.currentThread()getId()和Process.myTid()之间的区别

Android中Thread.currentThread()getId()和Process.myTid()之间的区别

众所周知

myTid() - 返回调用线程的标识符,该标识符与setThreadPriority(int,int)一起使用。

但是我发现Thread.currentThread().getId()不等于Process.myTid()。因此,我猜前者是JVM版本的线程ID,后者是Linux版本的线程ID。

我对吗?如果是这样,为什么Java会创建自己的线程ID而不使用Linux线程ID?

更新:

经过进一步研究并阅读了android的源代码,我有了新的认识:

Process.myTid()是与平台(OS)相关的操作,Process.setThreadPriority()在android的本机级别源中也是如此,它们都调用系统调用来实现目标。

但是java是一种与平台无关的语言,java并不强制主机os需要“
tid”或getTid()方法,因为另一个os可以通过字符串键(仅作为示例,:)来标识其线程。然后,java用自己的方式标识其线程,在java作用域中分配一个唯一的线程ID,如果Java提供了像这样的静态api
Process.setThreadPriority(),则Java作用域ID肯定是一个参数,但是我们不需要,因为我们可以通过调用来实现线程对象方法setPriority(int priority)

欢迎任何评论。

更新:

答案都是正确的。但是法登的评论使我更加清楚。谢谢你们。

Android中Thread.currentThread()。getId()和Process.myTid()之间的区别

Android中Thread.currentThread()。getId()和Process.myTid()之间的区别

众所周知

myTid() - 返回调用线程的标识符,该标识符与setThreadPriority(int,int)一起使用。

但是我发现Thread.currentThread().getId()不等于Process.myTid()。因此,我猜前者是JVM版本的线程ID,后者是Linux版本的线程ID。

我对吗?如果是这样,为什么Java会创建自己的线程ID而不使用Linux线程ID?

更新:

经过进一步研究并阅读了android的源代码,我有了新的认识:

Process.myTid()是与平台(OS)相关的操作,Process.setThreadPriority()在android的本机级别源中也是如此,它们都调用系统调用来实现目标。

但是java是一种与平台无关的语言,java并不强制主机os需要“
tid”或getTid()方法,因为另一个os可以通过字符串键(仅作为示例,:)来标识其线程。然后,java用自己的方式标识其线程,在java作用域中分配一个唯一的线程ID,如果Java提供了像这样的静态api
Process.setThreadPriority(),则Java作用域ID肯定是一个参数,但是我们不需要,因为我们可以通过调用来实现线程对象方法setPriority(int priority)

欢迎任何评论。

更新:

答案都是正确的。但是法登的评论使我更加清楚。谢谢你们。

file.canWrite(); file.canRead(); file.canExceute(); 总是返回true,虽然我的文件/目录没有访问权限

file.canWrite(); file.canRead(); file.canExceute(); 总是返回true,虽然我的文件/目录没有访问权限

@H_301_0@需要检查我使用的文件/目录的权限

@H_301_0@//filePath = path of file/directory access denied by user ( in windows ) File file = new File(filePath); file.canWrite(); file.canRead(); file.canExecute();

@H_301_0@三个都返回true,但不能删除任何文件/目录

@H_301_0@Java – 应用程序在rt.exec调用WinXP 32位的c ++程序后随机挂起

@H_301_0@将按键从Web应用程序发送到Windows应用程序

@H_301_0@peekmessage(创build窗口循环)

@H_301_0@是否可以将现有的Windows Phone 8应用程序更新到Windows Phone Store 8.1

@H_301_0@运算符“新”返回一个非本地堆指针只有一个类?

@H_301_0@你必须检查:

@H_301_0@SecurityManager.checkDelete(filepath);

@H_301_0@正如在JavaDoc中所说的那样

@H_301_0@你有没有尝试过使用java.nio.file.Files#isWritable方法?

Java中的PrintWriter write()vs print()方法

Java中的PrintWriter write()vs print()方法

Java类中的write()print()方法之间有什么区别PrintWriter

答案1

小编典典

print()格式化输出,而write()仅打印给出的字符。print()处理许多参数类型,使用String.valueOf()将它们转换为可打印的字符串,而write()仅处理单个字符,字符数组和字符串。

为了说明区别,write(int)将参数解释为要打印的单个字符,而print(int)则将整数转换为字符串。write(49)打印“
1”,而print(49)打印“ 49”。

今天关于在Windows中的Python文件上混合read和write的讲解已经结束,谢谢您的阅读,如果想了解更多关于Android中Thread.currentThread()getId()和Process.myTid()之间的区别、Android中Thread.currentThread()。getId()和Process.myTid()之间的区别、file.canWrite(); file.canRead(); file.canExceute(); 总是返回true,虽然我的文件/目录没有访问权限、Java中的PrintWriter write()vs print()方法的相关知识,请在本站搜索。

本文标签: