在python中显示更新的文本文件

在python中显示更新的文本文件,python,Python,下面是我的python代码: filename = 'ToDo.txt' def preview(): temp = open(filename, 'r') print temp.read() print '\n' temp.close def new_task(): temp = open(filename, 'a') while True: new_entry = raw_input('Enter New Task: ')

下面是我的python代码:

filename = 'ToDo.txt'
def preview():
    temp = open(filename, 'r')
    print temp.read()
    print '\n'
    temp.close

def new_task():
    temp = open(filename, 'a')
    while True:
        new_entry = raw_input('Enter New Task: ')
        if new_entry == 'exit' or new_entry == 'quit':
            break
        if new_entry == 'preview':
            print '\n'
            preview()
            break
        temp.write(new_entry + '\n')
        temp.close

我认为如果输入是“预览”,它应该显示修改过的文件并保存新的条目,但它不是。有没有同样的想法。

EDIT2:看到其他答案,我意识到你的问题可能会有很多不同的解释。我的答案的第一部分可能是正确的,也可能不是正确的,但第二部分是解释中立的


此答案假设您试图将“预览”视为文件中的最后一行

它将无法工作,因为您正在加载和打印文件,然后再保存它。尝试用以下内容替换代码的相关部分:

    if new_entry == 'preview':
        temp.write(new_entry + '\n')
        temp.close()        
        print '\n'
        preview()
        break

编辑:如果您正在对文件进行大量的读/写/打印/预览,您可能有兴趣查看。从文档中:

该模块实现了一个类似文件的类StringIO,该类读取和写入字符串缓冲区(也称为内存文件)

在这种情况下,您可以在内存中处理所有文件,在退出程序之前,只需将整个“内存文件”保存到“磁盘文件”中即可。选择这种方法的原因是磁盘上的I/O操作非常昂贵,因此如果您经常这样做,您的程序可能会陷入困境[我知道ToDo程序可能不是这样,但我认为值得一提


HTH!

您实际上没有调用任何函数:

filename = 'ToDo.txt'
def preview():
    temp = open(filename, 'r')
    print temp.read()
    print '\n'
    temp.close

def new_task():
    temp = open(filename, 'a')
    while True:
        new_entry = raw_input('Enter New Task: ')
        if new_entry == 'exit' or new_entry == 'quit':
            break
        if new_entry == 'preview':
            print '\n'
            preview()
            break
        temp.write(new_entry + '\n')
        temp.close


new_task() //adding this line will call the new_task() function

在python中,要调用函数,您需要在py文件的底部显式声明它。程序具有
temp.close
。这不是调用close()的正确方法;因此temp.write不会立即完成。您需要。

您应该将代码更改为:

def new_task():
    while True:
        temp = open(filename, 'a')
        new_entry = raw_input('Enter New Task: ')
        if new_entry == 'exit' or new_entry == 'quit':
            break
        if new_entry == 'preview':
            print '\n'
            preview()
            break
        temp.write(new_entry + '\n')
        temp.close()
这里有两个变化:

  • 不是
    temp.close
    ,而是
    temp.close()
  • temp=open(filename,'a')
    在每次执行的循环中移动

它们实际上是函数,不是方法!;)挑Java的家伙,我明白了。我不想挑你的毛病!:)只是在python中,常规方法看起来是
new\u task(self)
,而不是
new\u task()
,鉴于OP似乎是我想提到的初学者。我知道,从我的背景来看,函数是返回值的东西,而方法可能返回值,也可能不返回值。这就是为什么我称它为方法的原因,我将在上面进行编辑。我小时候学过Pascal:对我来说,函数返回值,而过程不返回值!是的……它会如果有一个跨语言的命名约定就好了!;)(1)很好的阿凡达双关语!:o-(2)要学究的话,应该是“…调用close的方式”,而不是“close()”,因为这已经是一个调用了!(但我写这篇文章只是因为我需要更多的字符才能获得我对阿凡达的评论足够长!)您的解决方案根本不起作用,因为
ValueError:I/O操作在关闭的文件上
@RomanBodnarchuk-哪一行抛出了该错误?可能您也离开了循环的最后一部分(在
if
案例之后的那一部分)?这对我来说很有用…愚蠢的错误,但是为什么
temp.close
没有通过任何错误?@Alinwndrld因为没有错误-
temp.close
返回函数对象,这是有效的表达式。