zoukankan      html  css  js  c++  java
  • 文件操作

    1. r模式

    1.1 全部读取

    我们先来建一个文件,放到D盘根目录下,文件内容如图

    我们需要把它的内容读出来,怎么操作呢,来看一段代码

    1 f = open("d:元旦.txt", encoding="utf-8", mode="r")
    2 content = f.read()
    3 print(content)
    4 f.close()

    输出

    大海啊好多水
    兔子啊四条腿
    你是谁
    你从哪里来
    你要到哪里去

    我们详细看一下代码,第一行的意思是调用操作系统的open函数获取文件句柄,句柄顾名思义就是像勺子的柄一样,用句柄来对文件的内容进行操作。获取句柄需要指定三个参数:文件路径,编码方式和打开模式。第二行f.read()是通过句柄获取文件的全部内容赋值给变量content,然后打印输出,最后关闭文件句柄,文件句柄会占用资源,使用完成之后要记得关闭。总结一下,文件读取的步骤:

    1. 打开文件,产生句柄(参数:路径,编码方式,打开模式)
    2. 对文件句柄进行操作
    3. 关闭文件

    上面的read()里面可以传入参数n,表示一次读取n个字符

    1 f = open("d:元旦.txt", encoding="utf-8", mode="r")
    2 content = f.read(5)   # 按字符读取
    3 print(content)
    4 f.close()

    输出结果

    大海啊好多

    1.2 读取一行

    一行一行地读取(readline)

    1 f = open("d:元旦.txt", encoding="utf-8", mode="r")
    2 content1 = f.readline()
    3 content2 = f.readline()
    4 content3 = f.readline()
    5 print(content1)
    6 print(content2)
    7 print(content3)
    8 f.close()

    执行结果

    大海啊好多水
    
    兔子啊四条腿
    
    你是谁

    可以看到readline是从当前位置往后读一行,这里每行中间空一行是因为python的print函数会自动换行,再加上文件里卖弄的换行符就有两行了。readline()也可以加上参数n,表示读取n个字符,如readline(3)表示读取3个字符

    1.3 读取所有行(readlines)

    readlines(0表示读取所有行,以列表的形式返回结果,列表的每个元素表示一行

    1 f = open("d:元旦.txt", encoding="utf-8", mode="r")
    2 content = f.readlines()
    3 print(content)
    4 f.close()

    执行结果

    ['大海啊好多水
    ', '兔子啊四条腿
    ', '你是谁
    ', '你从哪里来
    ', '你要到哪里去
    ', '
    ', '
    ']

    1.4 循环读取(for)

    这里大家可能就有一个问题:如果我要逐行读取整个文件,怎么做呢?用for循环!来看代码:

    1 f = open("d:元旦.txt", encoding="utf-8", mode="r")
    2 for line in f:
    3     print(line, end="")   # end=""表示将print函数结尾位置默认的换行符改成空字符
    4 f.close()

    执行结果

    大海啊好多水
    兔子啊四条腿
    你是谁
    你从哪里来
    你要到哪里去

    2. rb模式

    rb模式操作的是非文字类的文件,图片,视频,音频等

    2.1 读取全部(read)

    1 f = open("D:元旦.txt", mode="rb")    # 注意rb模式不能声明编码
    2 content = f.read()   # 读取全部
    3 print(content)
    4 f.close()

    执行结果

    b'xe5xa4xa7xe6xb5xb7xe5x95x8axe5xa5xbdxe5xa4x9axe6xb0xb4
    xe5x85x94xe5xadx90xe5x95x8axe5x9bx9bxe6x9dxa1xe8x85xbf
    xe4xbdxa0xe6x98xafxe8xb0x81
    xe4xbdxa0xe4xbbx8exe5x93xaaxe9x87x8cxe6x9dxa5
    xe4xbdxa0xe8xa6x81xe5x88xb0xe5x93xaaxe9x87x8cxe5x8exbb
    
    
    '

    可以看到rb模式读取的是一大段bytes类型的数据, read()也可以传入参数n, 表示读取n个字节

    2.2 读取一行(readline)

    1 f = open("D:元旦.txt", mode="rb")
    2 content1 = f.readline()
    3 content2 = f.readline()
    4 content3 = f.readline()
    5 print(content1)
    6 print(content2)
    7 print(content3)
    8 f.close()

    执行结果

    b'xe5xa4xa7xe6xb5xb7xe5x95x8axe5xa5xbdxe5xa4x9axe6xb0xb4
    '
    b'xe5x85x94xe5xadx90xe5x95x8axe5x9bx9bxe6x9dxa1xe8x85xbf
    '
    b'xe4xbdxa0xe6x98xafxe8xb0x81
    '

    rb模式下readline()也可以传入参数n,表示读取n个字节

    2.3 读取所有行(readlines)

    1 f = open("D:元旦.txt", mode="rb")
    2 content = f.readlines()
    3 print(content)
    4 f.close()

    返回一个列表。元素是bytes类型的数据

    [b'xe5xa4xa7xe6xb5xb7xe5x95x8axe5xa5xbdxe5xa4x9axe6xb0xb4
    ', b'xe5x85x94xe5xadx90xe5x95x8axe5x9bx9bxe6x9dxa1xe8x85xbf
    ', b'xe4xbdxa0xe6x98xafxe8xb0x81
    ', b'xe4xbdxa0xe4xbbx8exe5x93xaaxe9x87x8cxe6x9dxa5
    ', b'xe4xbdxa0xe8xa6x81xe5x88xb0xe5x93xaaxe9x87x8cxe5x8exbb
    ', b'
    ', b'
    ']

    2.4 循环读取所有行(for)

    1 f = open("D:元旦.txt", mode="rb")
    2 for i in f:
    3     print(i)
    4 f.close()

    输出

    b'xe5xa4xa7xe6xb5xb7xe5x95x8axe5xa5xbdxe5xa4x9axe6xb0xb4
    '
    b'xe5x85x94xe5xadx90xe5x95x8axe5x9bx9bxe6x9dxa1xe8x85xbf
    '
    b'xe4xbdxa0xe6x98xafxe8xb0x81
    '
    b'xe4xbdxa0xe4xbbx8exe5x93xaaxe9x87x8cxe6x9dxa5
    '
    b'xe4xbdxa0xe8xa6x81xe5x88xb0xe5x93xaaxe9x87x8cxe5x8exbb'

    3. r+模式

    先读后写(后追加)

    1 f1 = open('D:元旦.txt', encoding='utf-8', mode='r+')
    2 content1 = f1.read()
    3 print(content1)
    4 f1.write('
    天生我材必有用')
    5 content2 = f1.read()
    6 print(content2)
    7 f1.close()

    执行结果

    大海啊好多水
    兔子啊四条腿
    你是谁
    你从哪里来
    你要到哪里去

    没有打印写入的内容,为什么呢?因为写入内容后光标已经移到文件末尾了,再读取就都不到内容了,打开文件看看改了没

    大海啊好多水
    兔子啊四条腿
    你是谁
    你从哪里来
    你要到哪里去
    天生我材必有用

    小结

    (1)read()读取全部;read(n)读取n个字符或字节;readline()读取一行

    (2)r模式按字符读取;rb模式按字节读取

    4. w模式

    (1)没有文件创建文件写入;有文件清空原文件内容写入新内容

    (2)注意w模式必须是以字符串的形式写入

    文件file1内容

    让我们荡起双桨
    小船儿推开波浪

    执行代码

    1 f1 = open("file1", encoding="utf-8", mode="w")
    2 f1.write("666")    # 会写入三个666
    3 f1.close()

    结果

    666

    新建一个文件写入

    1 f1 = open("明月.txt", encoding="utf-8", mode="w")
    2 f1.write("海上升明月
    天涯共此时")    # 会写入三个666
    3 f1.close()

    执行结果

    海上升明月
    天涯共此时

    如果打开一个句柄后不关闭,再在当前文件上创建一个句柄对其进行写入操作,可以吗?一般不可以(有时候会出错)

    1 f1 = open("明月.txt", encoding="utf-8", mode="w")
    2 f1.write(”666“)     # 这里必须是字符串,不能是数字
    3 f1.write("abc")
    4 
    5 f2 = open("明月.txt", encoding="utf-8", mode="w")
    6 f2.write("哈哈哈")

    文件内容

    海上升明月
    天涯共此时

    执行结果

    哈哈哈

    5. wb模式

    下面来看一个实例,运用rb和wb实现图片的复制

    1 f1 = open("妹子.jpg", mode="rb")
    2 content = f1.read()   # 获取内容
    3 f1.close()   # 关闭文件句柄
    4 f2 = open("妹子1.bmp", mode="wb")   
    5 f2.write(content)             # 将内容写入新文件
    6 f2.close()

    视频也一样可以

    6. w+模式

    1 f1 = open("明月.txt", encoding="utf-8", mode="w+")
    2 f1.write("天涯")
    3 f1.write("明月")
    4 f1.write("")
    5 f1.seek(0)    # 把光标移到最前面,括号里参数以字节为单位
    6 content = f1.read()
    7 print(content)

    执行结果

    天涯明月刀

    如果把seek里面的参数改为2就会报错,因为中文在utf-8里占3个字节,截断2个字节会出错

    7. a模式

    追加:没有文件时创建新文件写入,有文件时把内容追加到末尾

    1 f1 = open("明月.txt", encoding="utf-8", mode="a")
    2 f1.write("天地入杯")
    3 f1.close()

    执行结果

    天涯明月刀天地入杯

    8. a+模式

    追加和读

    1 f1 = open("明月.txt", encoding="utf-8", mode="a+")
    2 f1.write("谁的歌声轻轻淌")
    3 f1.seek(0)
    4 data = f1.read()
    5 print(data)

    执行结果

    天涯明月刀天地入杯谁的歌声轻轻淌

    9. 其他操作方法

    (1) flush强制刷新到硬盘
    (2)readable判断是否可读
    (3)writable判断是否可写

    (4)seek(n)  把光标引动到n个字节的位置;tell()返回当前光标的位置

    (5)truncate  截断,truncate() 可以在r+, w+模式下截取原文件。只能从头截取,不能调整光标截取一部分。

    1 f1 = open("明月.txt", encoding="utf-8", mode="w+")
    2 f1.write("天涯明月刀")
    3 f1.truncate(9)   # 按字节截取,如果参数不是3的倍数会乱码
    4 f1.close()

    执行结果

    天涯明

    with open

     好处:

    (1)自动关闭文件句柄
    (2)可以一个语句打开多个文件句柄

    用法:

    1 with open("file1", encoding="utf-8", mode="r+") as f1,
    2     open("file2", encoding="utf-8", mode="r+") as f2:
    3     data1 = f1.read()
    4     data2 = f2.read()
    5     print(data1)
    6     print(data2)

    执行结果

    海上升明月
    天涯共此时
    哈喽

    文件的修改

    文件修改步骤:
    1. 以读的模式打开原文件,产生文件句柄f1
    2. 以写的模式打开新文件,产生文件句柄f2
    3. 读取原文件,将原文件的内容改写成新文件内容写入新文件
    4. 删除原文件
    5. 把新文件重命名为原文件

    1 import os
    2 with open("log", encoding="utf-8", mode="r") as f1,
    3     open("log.bak", encoding="utf-8", mode="w") as f2:
    4     for line in f1:
    5         old_line = line
    6         new_line = old_line.replace("hello", "hi")
    7         f2.write(new_line)
    8 os.remove("log")  # 删除原文件
    9 os.rename("log.bak", "log")  # 将新文件命名为原文件
  • 相关阅读:
    基础DP(初级版)
    UVA-816.Abbott's Tevenge (BFS + 打印路径)
    1044: 数圈
    1049: 打牌
    1047: 小A的计算器
    1046: 最小的K个数
    1045: 愚人节的礼物
    1044: 数圈
    1043: 绩点计算
    1042: 小丑排序
  • 原文地址:https://www.cnblogs.com/zzliu/p/10187159.html
Copyright © 2011-2022 走看看