首页 文章

被python文件模式“w”困惑

提问于
浏览
156

来自doc

模式'r','w'和'a'打开文件进行更新(注意'w'截断文件) . 将“b”附加到模式以在二进制模式下打开文件,在区分二进制文件和文本文件的系统上;在没有这种区别的系统上,添加'b'没有效果 .

here

w:打开文件进行写入和读取 . 如果文件存在,则覆盖现有文件 . 如果该文件不存在,则创建一个用于读写的新文件 .

但是,如何用 w+ 读取文件?

6 回答

  • 320

    以下是打开文件的不同模式列表:

    r

    打开文件以供阅读 . 文件指针位于文件的开头 . 这是默认模式 .

    rb

    打开文件以仅以二进制格式读取 . 文件指针位于文件的开头 . 这是默认模式 .

    r

    打开文件进行读写 . 文件指针将位于文件的开头 .

    rb

    以二进制格式打开文件进行读写 . 文件指针将位于文件的开头 .

    w

    打开文件仅供写入 . 如果文件存在,则覆盖文件 . 如果该文件不存在,则创建一个用于写入的新文件 .

    wb

    打开文件,仅以二进制格式写入 . 如果文件存在,则覆盖文件 . 如果该文件不存在,则创建一个用于写入的新文件 .

    w

    打开文件进行书写和阅读 . 如果文件存在,则覆盖现有文件 . 如果该文件不存在,则创建一个用于读写的新文件 .

    wb

    以二进制格式打开文件进行写入和读取 . 如果文件存在,则覆盖现有文件 . 如果该文件不存在,则创建一个用于读写的新文件 .

    a

    打开要附加的文件 . 如果文件存在,则文件指针位于文件的末尾 . 也就是说,文件处于追加模式 . 如果该文件不存在,则会创建一个用于写入的新文件 .

    ab

    打开一个文件,以二进制格式附加 . 如果文件存在,则文件指针位于文件的末尾 . 也就是说,文件处于追加模式 . 如果该文件不存在,则会创建一个用于写入的新文件 .

    a

    打开文件以进行追加和阅读 . 如果文件存在,则文件指针位于文件的末尾 . 该文件以追加模式打开 . 如果该文件不存在,则会创建一个用于读写的新文件 .

    ab

    打开一个文件,以二进制格式附加和读取 . 如果文件存在,则文件指针位于文件的末尾 . 该文件以追加模式打开 . 如果该文件不存在,则会创建一个用于读写的新文件 .

  • 1

    让's say you'用你应该的 with 语句重新打开文件 . 然后你会做这样的事情从你的文件中读取:

    with open('somefile.txt', 'w+') as f:
        # Note that f has now been truncated to 0 bytes, so you'll only
        # be able to read data that you write after this point
        f.write('somedata\n')
        f.seek(0)  # Important: return to the top of the file before reading, otherwise you'll just read an empty string
        data = f.read() # Returns 'somedata\n'
    

    注意 f.seek(0) - 如果忘记了这一点, f.read() 调用将尝试从文件末尾读取,并返回一个空字符串 .

  • 123

    Python中的所有文件模式

    • r 供阅读

    • r+ 打开以进行读写(不能截断文件)

    • w 写作

    • w+ 用于写入和读取(可以截断文件)

    • rb 用于读取二进制文件 . 文件指针位于文件的开头 .

    • rb+ 读取或写入二进制文件

    • wb+ 写一个二进制文件

    • a+ 打开以进行追加

    • ab+ 打开一个文件,用于追加和读取二进制文件 . 如果文件存在,则文件指针位于文件的末尾 . 该文件以追加模式打开 .

    • x 打开以进行独占创建,如果文件已存在则失败(Python 3)

  • 2

    该文件被截断,因此您可以调用 read() (没有异常引发,与使用'w'打开时不同)但是您将获得一个空字符串 .

  • 97

    我怀疑有两种方法可以处理我认为你想要实现的目标 .

    1)很明显,只打开文件进行读取,将其读入内存然后用t打开文件,然后写下你的更改 .

    2)使用低级文件处理例程:

    # Open file in RW , create if it doesn't exist. *Don't* pass O_TRUNC
     fd = os.open(filename, os.O_RDWR | os.O_CREAT)
    

    希望这可以帮助..

  • 0

    实际上,关于 r+ 模式的所有其他答案都有问题 .

    test.in 文件的内容:

    hello1
    ok2
    byebye3
    

    和py脚本:

    with open("test.in", 'r+')as f:
        f.readline()
        f.write("addition")
    

    执行它, test.in 的内容将更改为:

    hello1
    ok2
    byebye3
    addition
    

    但是,当我们将脚本修改为:

    with open("test.in", 'r+')as f:
        f.write("addition")
    

    test.in 也做出回应:

    additionk2
    byebye3
    

    因此,如果我们不进行读取操作, r+ 模式将允许我们从头开始覆盖内容 . 如果我们进行一些读取操作, f.write() 将只附加到该文件 .

    顺便说一句,如果我们 f.write(write_content) 之前,write_content将从位置(0,0)覆盖它们 .

相关问题