使用python写文件时,如何做到写入文件由于外力删掉了之后可以新创建一个同名文件并继续写入?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用python写文件时,如何做到写入文件由于外力删掉了之后可以新创建一个同名文件并继续写入?相关的知识,希望对你有一定的参考价值。

使用python是发现,如果直接使用pfile=open('test.txt'),并循环执行pfile.write('hello'),当自己手动将正在写入的test.txt重命名为test.txt.bak,那么python会继续向test.txt.bak写'hello'串,可见pfile实际指向的是一个物理地址,而不管文件名字如何。
同样,将test.txt手动删除掉之后,python程序依然会继续执行而不会出现异常,但是删掉test.txt之后'hello'串写在什么地方去了?我怀疑仍然是写在原来test.txt文件对应的地址内,不过我现在的问题是如何控制python程序,使得python在写入'hello'串的时候,能够感知test.txt文件名的变化和是否存在,
即:当python在循环执行写入的时候,一旦文件名字发生变化或者被删掉了,程序会创建一个新的同名文件,并向新的文件写'hello'串。
PS:一个笨拙的方法是每次写'hello'串都open和close文件,但是如果需要写入的数据很大的时候,效率会受到影响,python有没有这种写文件的安全机制?

你的试验很详细。不过这个现象在linux下可能与windows下不一样。 通常改名或者是删除后文件就失效了。写入操作也是无效的。

为了防止别人修改你的文件,通常在写入时,会加上一个锁。使用操作系统特有的open方法才可以加锁。

可以使用portalocker,filelock 也可以使用posixfile,
os.open能不能成呢?按理可以。不过C语言里使用fopen没有这个功能,不过使用fcntl里的open可以。

你加了锁后,别人就不能写。文件处于占用状态。

另外操作系统都有一种文件监控机制的消息通知。具体忘记了。在unix与windows都有这个功能。当别人程序修改了某个文件,你会立刻得到消息通知。

补充一些教程。os.open还是可以用的。
os.open(file, flags[, mode]);
Parameters

file -- File name to be opened.

flags -- This is the following constants are options for the flags. They can be combined using the bitwise OR operator |. Some of them are not available on all platforms.
os.O_RDONLY: open for reading only
os.O_WRONLY: open for writing only
os.O_RDWR : open for reading and writing
os.O_NONBLOCK: do not block on open
os.O_APPEND: append on each write
os.O_CREAT: create file if it does not exist
os.O_TRUNC: truncate size to 0
os.O_EXCL: error if create and file exists
os.O_SHLOCK: atomically obtain a shared lock
os.O_EXLOCK: atomically obtain an exclusive lock
os.O_DIRECT: eliminate or reduce cache effects
os.O_FSYNC : synchronous writes
os.O_NOFOLLOW: do not follow symlinks

mode -- This work in similar way as it works for chmod() method.
参考技术A 可以参考一下这个

自动关闭文件
try..finally也行。但是with更好
with... as
eg:
>>>with open('./Makefile','r+', encoding = locale.getpreferredencoding()) as file:
... file.readline()
...
'#Put some miscellaneous rules here\n'
这段代码调用了open()函数,但是它却一直没有调用file.close()。with语句引出一个代码块,就像if语句或者for循环一样。在这个代码块里,你可以使用变量file 作为open()函数返回的流对象的引用。read(),无论你想要调用什么。当with块结束时,Python自动调用a_file.close()。
参考技术B with open(文件名)
通过这种方式python自行处理关闭文件的

python怎么将0写入文件?

也许我是傻逼吧
首先我试了
f = open("i.txt","w")
f.write(str(0))
但文件中什么内容也没有
然后我又试了
import os
os.system("echo 0>i.txt")
这时候显示"ECHO处于打开状态"
我该如何将0写入文件呢
(我是小白)

采用上下文模式打开文件

或者强制刷入文件

参考技术A 要将数字0写入文件,可以使用Python内置的文件对象的write()方法将字符串"0"写入文件中。以下是一个示例代码:

with open("file.txt", "w") as f:
f.write("0")
在这个示例中,使用了一个名为"file.txt"的文件,并将其以写入模式打开。然后,使用文件对象的write()方法将字符串"0"写入文件中。最后,使用with语句来自动关闭文件对象。

请注意,write()方法只接受字符串作为参数,因此需要将数字0转换为字符串"0"。如果要将其他数字写入文件,也需要先将其转换为字符串。
参考技术B 注意是字符串!!!!请采纳

可以使用Python的内置函数open()和write()来将0写入文件:
```
with open('filename.txt', 'w') as f:
f.write('0')
```
参考技术C 你的问题在于 str(0) 这个是 NULL呀。
f.write("0") 这样就可以了。
参考技术D f.write("0")
然后记得把文件关闭掉

以上是关于使用python写文件时,如何做到写入文件由于外力删掉了之后可以新创建一个同名文件并继续写入?的主要内容,如果未能解决你的问题,请参考以下文章

我如何使用python写入大型txt文件的每个字符?

python如何写入文本的最末行?

在使用 python 写入时从日志文件中读取

python怎么做到在写入的TXT中换行

如何使用python 2.7通过变量写入文本文件[重复]

c语言如何将printf产生的数据写到txt文件中