使用python写文件时,如何做到写入文件由于外力删掉了之后可以新创建一个同名文件并继续写入?
使用python是发现,如果直接使用pfile=open('test.txt'),并循环执行pfile.write('hello'),当自己手动将正在写入的test.tx...
使用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有没有这种写文件的安全机制? 展开
同样,将test.txt手动删除掉之后,python程序依然会继续执行而不会出现异常,但是删掉test.txt之后'hello'串写在什么地方去了?我怀疑仍然是写在原来test.txt文件对应的地址内,不过我现在的问题是如何控制python程序,使得python在写入'hello'串的时候,能够感知test.txt文件名的变化和是否存在,
即:当python在循环执行写入的时候,一旦文件名字发生变化或者被删掉了,程序会创建一个新的同名文件,并向新的文件写'hello'串。
PS:一个笨拙的方法是每次写'hello'串都open和close文件,但是如果需要写入的数据很大的时候,效率会受到影响,python有没有这种写文件的安全机制? 展开
3个回答
展开全部
你的试验很详细。不过这个现象在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.
为了防止别人修改你的文件,通常在写入时,会加上一个锁。使用操作系统特有的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.
展开全部
可以参考一下这个
自动关闭文件
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()。
自动关闭文件
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()。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
with open(文件名)
通过这种方式python自行处理关闭文件的
通过这种方式python自行处理关闭文件的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询