【问题标题】:Append data to the end of a file in python在python中将数据附加到文件的末尾
【发布时间】:2017-03-26 11:56:44
【问题描述】:

我正在尝试将数据附加到文件中。每一行都写在一个函数中。以下是基于我的实际代码的示例代码:

a = 0

def data():
    global a
    a = int(raw_input('Enter value for a\n>'))
    write()

def write():
    f = open('path\\to\\file.txt', "a")
    f.write('%s\n' % a)
    f.close
    proceed()

def proceed():
    should = raw_input('Please press enter to continue or type in 0 to stop\n>')
    if should == '0':
        return
    else:
        data()

data()

当我运行代码并给出例如 1, 2 and 3 作为 a 的值时,这就是它被写入文件的方式:

3
2
1

但我希望它以这种方式写入文件:

1
2
3

这样做的正确方法是什么?每次运行write 函数时,如何在文件末尾追加一个新行?

【问题讨论】:

  • f.close 不会关闭文件!并且不推荐使用全局变量来传递数据。使用参数。最后,我真的不明白为什么你会得到这个输出。追加模式不能恢复行的顺序,没有意义。
  • @Jean-FrançoisFabre 非常感谢。让它工作。
  • @Jean-FrançoisFabre 这也是我不明白的。即使文件没有关闭也不应该总是追加写入数据到文件末尾?

标签: python function file append


【解决方案1】:

您的程序结构引起了可能非常深的递归(问题)。因为在data()中调用write(),在write()中调用proceed(),在proceed()中再次调用data()。尽量避免这种结构。下面的代码避免了这个问题,而且更短:

def data():
    while True:
        a = int(raw_input('Enter value for a\n>'))
        f.write(str(a) + '\n')

        should = raw_input('Please press enter to continue or type in 0 to stop\n>')
        if should == 0:
            break


f = open('path\\to\\file.txt', "a")
data()
f.close()

【讨论】:

  • 我提供的示例代码只是为了展示我的实际代码的结构。只需获取输入并将其写入文件,您的代码就可以很好地工作。但是在我的原始代码中,我有很多函数,并且每个连续的函数都能正常运行,前一个函数应该运行没有任何错误。这就是我以这种方式构建代码的原因。但是,您能否解释为什么附加的行为方式与文件未正确关闭时的行为方式相同?谢谢。
  • 实际代码的结构可能会导致递归错误。这意味着您只能调用 data() 多次,然后解释器将抛出错误,因为它调用的函数调用了再次调用 data() 的函数。这个链中的调用必须由解释器跟踪,并且只有这么多的存储空间可以这样做。所以最后,你将用完堆栈空间 - 欢迎来到 Stackoverflow :) 我不知道为什么当你没有正确关闭文件时这些值是自上而下写的。我想它可能是在 close() 语句之前没有刷新的文件缓冲区。
  • 非常感谢@Ukimiku。我会尝试重组我的程序以避免递归错误:)
【解决方案2】:

@Ukimiku 给出了实现您的要求的正确方法。 至于你的代码为什么会这样,我的意见就在这里。 实际上,使用open('path','a') 打开文件会将文件指针移动到您打开的文件的末尾,这样当您使用write() 时,您会追加一些内容。

f = open('path\\to\\file.txt', "a")
print f.tell() #get the position of current file pointer
f.write('%s\n' % a)

在打开 file.txt 后添加 print f.tell()。你会发现每次打开它,指针位置总是0,这表明你的write()操作在那个文件的开头插入了这些数字。这是因为没有关闭。这些更改发生在内存中,尚未写入磁盘。

【讨论】:

  • 非常感谢您的解释:)
猜你喜欢
  • 2015-01-25
  • 2015-04-09
  • 2017-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-25
相关资源
最近更新 更多