python在另一个编辑器中保存后无法写入文件

python在另一个编辑器中保存后无法写入文件,python,file,output,Python,File,Output,我有一个连续运行的python文件,偶尔会接受键盘输入,然后写入文件 但是,如果我在另一个编辑器中编辑该文件(使用sed或head或gedit),然后再次保存它,我的python程序将不再写入该文件,即使(使用gedit时)我退出了编辑器 继续写入文件的正确方法是什么? 这里有一个例子 import sys f = open('tmp.txt', 'ab') while 1: raw_input() f.write('this is a test\n') f.flush()

我有一个连续运行的python文件,偶尔会接受键盘输入,然后写入文件

但是,如果我在另一个编辑器中编辑该文件(使用sed或head或gedit),然后再次保存它,我的python程序将不再写入该文件,即使(使用gedit时)我退出了编辑器

继续写入文件的正确方法是什么? 这里有一个例子

import sys
f = open('tmp.txt', 'ab')
while 1:
   raw_input()
   f.write('this is a test\n')
    f.flush()
f.close()
例如:

python tmp.py
(enter input) #writes line to file
[ in a separate terminal ] sed -i '$ d' tmp.txt #deletes last line in file
(enter input to python in terminal) #no longer writes to file

您的操作系统管理对文件的读/写访问。当您第一次在循环外部获得对文件的写入访问权限时,一旦文件被另一个进程或线程占用,您将永远无法将其返回到循环内部。因此,在循环中设置文件对象

import sys

while True :
    raw_input()
    with open('tmp.txt', 'ab') as f :
        f.write('this is a test\n')

对于文件对象,建议使用上下文管理器(
-Statement)。它将自动打开和关闭对象。

也许您需要在写入之前查找到底
f.seek(0,os.seek_END)
也许你需要现实一点,表明你没有在
(输入…
(输入…)之间运行
sed-i…
但是在另一个终端中。或者你正在停止脚本并重新启动它。抱歉没有说清楚,我确实在另一个终端中运行了我的文件编辑。彼得:这可能也是问题的一部分,我明天将调查最终原因。谢谢!我们几乎在同一时刻回答。我是l快一点;)。。。你忘了
raw\u input()
…我不知道为什么会被否决,但感谢你们两位将我从深夜的“毒品”中解救出来。否决可能是因为你们没有包括任何描述。只有代码的答案有点不受欢迎。如果没有描述,初学者将不知道“秘方”是否是您使用了
while True
而不是
while 1
,或者
with
而不是正常调用
open
,或者在循环中移动
open
,或者是因为您删除了对
flush
的调用。很多问题对你来说是显而易见的,但对那些首先需要问这个问题的人来说可能不是。哇,是的,这可能就是问题所在,尽管我明天必须进去测试一下。现在回想起来,我感觉到一个“doh!”——简化它肯定会让它在回顾中变得明显(当时正在使用线程和Tkinter)。昨天我只是用
“$n=4
$tac tmp.txt | sed“1,$n{d}”| tac>out.txt;cat out.txt>tmp.txt”
解决了这个问题,它不会以某种方式干扰文件,就像我的脚本能够一直写入文件一样(你知道区别是什么吗?)@orangenarwhals:那里的命令行永远不会更改与文件名关联的inode(
>somefile
截断现有的
somefile
然后写入新数据,它不会删除所述文件,然后创建新文件)。大多数编辑器使用崩溃安全的编辑形式,即完全写入新文件,然后执行原子重命名操作,将新文件重命名为旧文件名(隐式删除旧文件)。但这意味着每次保存操作后inode编号都会更改,这意味着来自其他程序的打开文件句柄将无效。“写入新文件,重命名以替换旧文件”的优点是,如果在重命名之前的任何时间断电(或蓝屏,或程序崩溃),原始文件数据将保持完整。在任何情况下,最终文件都只保存完整的旧数据或完整的新数据。如果您的计算机在
cat out.txt>tmp.txt
步骤中崩溃,或者您在处理过程中中途将其杀死,
tmp.txt
可能包含部分写入的垃圾,或者根本不包含任何内容,并且可能无法判断
out.txt
tmp.txt
是否是“正确的”数据。@orangenarwhals欢迎接受我的答案,如果它按照您的意愿工作的话。
import sys

while True :
    with open('tmp.txt', 'ab') as f :
        f.write('this is a test\n')