【问题标题】:Please explain the output of the following code in Python请用 Python 解释以下代码的输出
【发布时间】:2020-09-28 03:55:33
【问题描述】:
file=open("data.txt", "w+")
txt="James\n"
file.writelines(txt)
file.seek(0,0)
s='Bond\n007'
file.write(s)
myList=[]
for line in file:
     myList.append(line)
print(myList)
file.close()

我所期望的是文件将写为:

James
Bond
007

这就是我在执行文件后检查文件时实际包含的内容,但问题在于读取部分,即程序的输出:

期待

['James\n','Bond\n', '007']

现实

['James\n']

那么为什么我会得到这种输出呢?

============

编辑部分

============

以下是我观察到的,据我说可以解释这个意外的输出。 我观察到 seek() 函数会自动清除内部缓冲区。这是对这一事实的验证:

file=open("d.txt", "w+")
txt="James\n"
file.writelines(txt)
file.seek(0)
file.write("yo")
while True:
    print("This is a test.")

在上面的程序中我没有使用flush(),我在最后执行了一个无限循环,这样执行就不会结束,所以内部缓冲区不会被python清除。 当我在执行仍在进行时打开由该程序创建的文件时会发生什么,我预计该文件将为空,因为所有内容仍将在内部缓冲区中,但事实并非如此。我发现该文件包含文本“James”,而文本“yo”仍在内部缓冲区中,因为程序仍在运行。这证明了我的观点,我尝试了其他几个程序也给出了类似的结果。 One more user 经历过这种情况并在这里询问过,但不幸的是,他的问题被一个声誉很高的用户不负责任地关闭为重复项(这对于声誉较低的用户来说很常见。)

利用上述事实,我们可以将上述输出解释如下:

首先 open 函数创建一个文件句柄,然后在同一目录中创建一个名为 'data.txt' 的文件,然后 writelines 函数将字符串“James\n”存储在内部缓冲区中。然后 seek 函数清除内部缓冲区并在文件中写入“James”[注意:现在文件指针在开头]。现在 for 循环开始并将唯一的行 'James\n' 存储到 mylist 变量中,然后显示为输出。

【问题讨论】:

    标签: python


    【解决方案1】:
    file=open("data.txt", "w+")
    txt="James\n"
    file.writelines(txt)
    # file.seek(0,0)
    s='Bond\n007'
    file.write(s)
    file.seek(0,0)
    myList=[]
    for line in file:
         myList.append(line)
    print(myList)
    file.close()
    

    解释: 在阅读输出之前放置file.seek(0, 0)

    【讨论】:

    • 但为什么一开始它会给出 ['James\n'] 作为输出?它不应该用其他值覆盖它吗?
    【解决方案2】:

    这可能是因为您打开的方法处于写入模式。当您读回文件时,它会给出所需的结果。

    file=open("data.txt", "r")
    txt = file.read()
    txt.split('\n')
    
    #['James', 'Bond', '007']
    

    【讨论】:

    • 啊,是的,你是对的。我没有意识到这就是“+”的意思。
    【解决方案3】:

    使用seek 方法,您将指针设置在开头。

    如果您在写完这些行之后反转这些行并使用seek,它可以解决问题。

    file=open("data.txt", "w+")
    txt="James\n"
    file.writelines(txt)
    s='Bond\n007'
    file.write(s)
    file.seek(0,0)
    myList=[]
    for line in file:
         myList.append(line)
    print(myList)
    file.close()
    

    奇怪的是你在写 James 之后将光标设置在开头。所以在你的例子中,James 应该在Bond007 之后。但我没能找到为什么不是输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 2020-05-29
      • 1970-01-01
      • 2017-01-15
      相关资源
      最近更新 更多