2017-08-17 87 views
2

我正在做一个项目,我不得不制作一个多色滑板。这是它会做的:为什么read()函数删除我的文件中的所有数据?

这个multiclipboard将贯穿终端。它将创建一个名为的剪贴板并将所有复制的文本保存在那里。该人可以添加尽可能多的复制文本,如果他愿意,他也可以清除多滑脚板。

下面的代码:

import pyperclip 
import sys 

jim=open('multiclipboardd','w') 

#This will copy text to the multiclipboard 
if len(sys.argv)==2 and (sys.argv[1].lower())=='save': 
    jim=open('multiclipboardd','a') 
    jim.write(pyperclip.paste()) 
    jim.write('\n') 
    print('The text has been pasted to the multiclipboard!') 
    jim.close() 


#This will read text from the multiclipboard 
elif len(sys.argv)==2 and (sys.argv[1].lower())=='list': 
    kk=open('multiclipboardd') 
    print(kk.read()) 


#This will delete the text of the multiclipboard 
elif len(sys.argv)==2 and (sys.argv[1].lower())=='delete': 
    jim=open('multiclipboardd','w') 
    jim.write('') 
    print('The clipboard has been cleared!') 
#jim and kk are just variables 

该文件的名称是Panda.py

在调用终端python panda.py save应了短路电流复制的文本保存到一个文件夹命名为clipboardd它确实!当我尝试调用它时,这很好。

但是,当我尝试在终端中运行python panda.py list时,预计它会在屏幕上打印所复制的文字,但会将其全部删除!假设在致电python panda.py list之前,剪贴板有110个字母。然后在拨打python panda.py list后,它有0个字母!

为什么read()删除文件中的所有字符clipboardd

+2

'阅读()'不截断你的文件替换'w'。文件顶部的无条件'jim = open('multiclipboardd','w')'是。 – Amadan

+0

'jim = open('multiclipboardd','w')'预计将删除数据!而且,只有当一个人调用'python panda.py delete'时,Python才会到达'jim = open('multiclipboardd','w')'' –

+0

代码的第三行是什么?在两个'import'语句之后? – Amadan

回答

6

你打开你的文件,“W”模式每一次,它会覆盖文件中的所有现有数据。 read()没有这样做。为防止出现这种情况,请每次以'a'模式打开文件。 希望这有助于。

5

当您在程序的顶部执行jim=open('multiclipboardd','w')时,它会截断原始文件并将其擦除。这就是为什么你的文件被擦除。

此外,当你打开文件,你应该.close(),或用context manager.

+0

我在编写代码时考虑过这个问题。但你认为这真的很有用吗?我们在终端上运行它!不在IDLE中。它完美的没有.close()!无论如何,谢谢你的答案:) –

+1

@ M.Hamel是的,它的工作原理,但你从长远来看避免了问题。在更长的代码或多个访问同一文件的程序中,您可以避免竞争状况和其他I/O错误。真正值得习惯使用'。close()' – SH7890

+0

@ M.Hamel另外,在终端或IDLE或任何IDE中运行它并不重要。文件对象仍然应该关闭。 – SH7890

1

正如Amadan所说,read()不会截断您的文件。

无条件jim=open('multiclipboardd','w')位于文件顶部。

如果你不希望它删除您的内容,与'a'

相关问题