【问题标题】:How to read from file opened in "a+" mode?如何读取以“a+”模式打开的文件?
【发布时间】:2013-01-16 09:21:21
【问题描述】:

根据定义,“a+”模式打开文件以进行追加和读取。追加作品,但阅读的方法是什么?我做了一些搜索,但找不到任何地方澄清。

f=open("myfile.txt","a+")
print (f.read())

试过了,它打印空白。

【问题讨论】:

    标签: python windows io


    【解决方案1】:

    依赖于操作系统的较新版本的 Python 仍然存在一些怪癖,这是由于 stdio 中 fopen() 函数的实现存在差异。

    Linux 的man fopen:

    a+ - 打开以进行读取和附加(在文件末尾写入)。如果文件不存在,则创建该文件。读取的初始文件位置在文件开头,但输出始终附加到文件末尾。

    操作系统:

    ``a+'' - 打开用于读写。如果文件不存在,则创建该文件。流位于文件的末尾。对文件的后续写入将始终在文件的当前末尾结束,而与任何干预 fseek(3) 或类似内容无关。

    MSDN 并没有真正说明指针最初设置的位置,只是它在写入时移动到末尾。

    当使用“a”或“a+”访问类型打开文件时,所有写操作都发生在文件末尾。文件指针可以使用 fseek 或 rewind 重新定位,但总是在执行任何写操作之前移回文件末尾。因此,现有数据无法被覆盖。

    使用.open .tell 可以非常简单地使用 Python 2.7.x 和 3k 复制各种系统上的差异

    通过操作系统处理任何事情时,采取预防措施(例如使用显式.seek(0))会更安全。

    【讨论】:

      【解决方案2】:

      使用f.seek() 将文件偏移设置到文件的开头。

      注意:在 Python 2.7 之前,有一个 bug 会导致某些操作系统不让文件位置始终指向文件末尾。这可能会导致某些用户使用您的原始代码。例如,在 CentOS 6 上,您的代码会按照您的意愿运行,但不会按预期运行。

      f = open("myfile.txt","a+")
      f.seek(0)
      print f.read()
      

      【讨论】:

      • 谢谢,它有效。如果我在我的问题中添加“windows”标签可能会很好,因为它似乎与操作系统相关。
      • 不,正确的行为是您看不到任何输出。在某些运行 2.7 之前的 python 版本的操作系统上,可能会看到输出,因为文件位置设置不正确。
      • 抱歉,您是在告诉我,当我在 Win7 机器上用 Python3 执行该代码时,我不应该看到文件的内容?
      • 运行问题中发布的代码时,您不应该看到文件的内容。运行此答案中的代码时,您应该会看到输出。
      • 这就是我的意思,您的代码有效。:) 再次感谢您。
      【解决方案3】:

      模式 r+ 读写 从文件开头开始 r 只读 从文件开头开始 a+ 读取/追加。通过写入文件末尾来保留文件内容

      祝你好运! 伊莎贝尔·鲁伊斯

      【讨论】:

        【解决方案4】:

        当您使用f=open(myfile.txt,"a+") 打开文件时,可以读取和写入文件。

        默认情况下,文件句柄指向文件的开头,

        这可以由f.tell() 确定,这将是0L

        In [76]: f=open("myfile.txt","a+")
        
        In [77]: f.tell()
        Out[77]: 0L
        
        In [78]: f.read()
        Out[78]: '1,2\n3,4\n'
        

        不过,f.write 会在写入前将指针移至最后一行。

        【讨论】:

        • 这真的很奇怪。在 OS X 上,它将指向文件的末尾,在 Linux 上,它将指向前面。
        • 是的。而已。该错误已在 2.7 Alpha 1 中修复。我的 Linux 运行的是 2.6.2。
        • 我也得到了空白输出。
        猜你喜欢
        • 1970-01-01
        • 2012-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多