【问题标题】:What's the Python's file logic when reading vs writing or appending?读取与写入或附加时 Python 的文件逻辑是什么?
【发布时间】:2021-10-02 15:18:01
【问题描述】:

这里可能是一个愚蠢的问题,但这是我的好奇心。

我首先认为当使用“a”时,方法 .append() 会自动合并到其中,这是有道理的,因为添加“a”应该已经向程序表明我们的最终目标,但我真的不明白为什么使用“r”时情况并非如此,相反,我们还必须在行尾添加 .read()。

这是一个例子:

file1 = open("test.txt", "a")    #no .append() or something needed here
file1.write("Hello")
file1.close()

var_lecture = open("test.txt", "r").read()    #.read() necessary
print(var_lecture)

谁能让我更好地理解这一点?

【问题讨论】:

  • 你正在使用.write
  • 为什么您希望或需要 write() 在打开追加时使用不同的名称? O_APPEND 的方式记录在底层 UNIX 文件系统 API 中,它使所有 写入 自动结束。这些操作仍称为写入; O_APPEND 只是为它们的行为提供了额外的保证,因此您可以让多个程序写入同一个日志文件而不会覆盖彼此的内容(因为,使用该标志,它们不再各自在文件中拥有自己的独立位置他们正在写信给)。
  • 请参阅man 2 open 以了解 Python 将前端置于其之上的 API。
  • 顺便说一句,您可能会看到 Are language specs and their developments on-topic? 了解为什么关于语言设计的“为什么”问题在这里通常不受欢迎。 Stack Overflow 最适合用于解决问题的狭窄、实用答案的问题。争论应该如何设计很快就会演变成对立的意见,我们不允许基于意见的问题。
  • 无论您使用哪种模式,文件API都是相同的。问题是,如果模式不正确,某些 API 将无法工作。以“r”模式打开,.write 在那里......但如果你使用它会引发错误。这是从 C 中基于函数的 API 建模的,其中使用了“读取”和“写入”等函数。这些函数在 C 库中可用,但您只能在正确的时间使用它们。

标签: python python-3.x file


【解决方案1】:

该选项正在更改方法“write”写入文件的方式。如果您使用选项“w”,它将覆盖整个文件。如果您使用的是“a”,它会将文本附加到文本中,该文本已经在文件中

def read_test():
    content = open("test.txt", "r").read()
    print(content)

def write_test():
    file = open("test.txt", "w")
    file.write("test")
    file.close()

def append_test():
    file = open("test.txt", "a")
    file.write("test")
    file.close()

write_test()
read_test()
# output: test
write_test()
read_test()
# output: test
append_test()
read_test()
# output: testtest

【讨论】:

  • w 不会总是覆盖整个文件,这只是在使用 O_TRUNC 时(不包括 + 标志)。是否使用O_TRUNC和是否使用O_APPEND是正交决策;可以同时打开带有 both 的文件! (在 Python 中,使用 os.open() 最容易做到这一点,允许显式传递各个标志)。
  • 很好的答案,简洁的解释和很好的例子。一个建议的改进:如果您直接打印输出作为示例的一部分,而不是包含说明您期望的情况的注释,它会更清晰一些。
  • @JonKiparsky 感谢您的建议。我加了。
【解决方案2】:

当你使用 mode 时,这意味着指针编辑器在页面上的最后一个字母之后 例如

text.txt  contain "my name is name"
f=open("text.txt",mode="a",encoding="utf-8")
f.write("  ggg  ")
f.close()
#result "my name is name  ggg  "

当您阅读时,您会阅读从指针位置到最后一个字母的字母,例如 text.txt 包含“我的名字是名字”

  f=open("text.txt",mode="a+",encoding="utf-8")
    print(f.read()) 
    f.seek(5) # to set it in poition 5
    print(f.read())
    f.close()  
#""      # so when you read it  is empty
#me is name

在写入模式下,如果文件不存在,您将创建一个新文件并从位置 0 写入,如果存在,将使用 truncate 函数,这意味着指针(位置 0)之后的所有字母都将被删除

如果你想在特定位置追加 例如 text.txt 包含“我的名字是名字”

f=open("text.txt",mode="r+",encoding="utf-8")
f.seek(7)
f.write("ggg")
f.close()
#result : my nameggg name 

但这会覆盖文件

f=open("text.txt",mode="r+",encoding="utf-8")

f.seek(7) # set poistion at 7
R = f.read() # "  is name"
f.truncate() # delate all letters after pointer 
#========================
f.seek(0) 
print(f.read()) #result: my name
#========================
f.seek(7) 
# we should reset pointer
f.write("ggg"+R)
print(f.read())
f.close()
# text.text contain: my nameggg is name

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    相关资源
    最近更新 更多