• 013.Python的文件操作


    一 文件操作

    • fp = open("打开的文件",mode="模式选择",encoding="编码集")
    • open 函数 返回一个文件io对象 (别名:文件句柄)
    • i => input 输入
    • o => output 输出

    1.1 写入文件内容

    #打开文件
    fp = open("0208.txt",mode="w",encoding="utf-8")
    #写入内容
    fp.write("今天是个好日子")
    #关闭文件
    fp.close()

    执行并查看

    [root@node10 python]# python3 test.py
    [root@node10 python]# ll
    total 8
    -rw-r--r--. 1 root root 21 Nov 24 03:50 0208.txt
    -rw-r--r--. 1 root root 93 Nov 24 03:50 test.py
    [root@node10 python]# cat 0208.txt
    今天是个好日子[

    1.2 读取文件内容

    #打开文件
    fp = open("0208.txt",mode="r",encoding="utf-8")
    #读取内容
    res = fp.read()
    #关闭文件
    fp.close()
    #打印值
    print(res)

    bytes模式

    1.3 二进制的字节流

    • 一堆字符放在一起 是字符串
    • 一堆字节放在一起 是字节流
    • 字节流用来传输数据,用来保存数据

    在ascii编码字符前加上b ,代表二进制字节流,其他所有字符都不能这样加(比如中文是不行的)

    strvar = b'123'
    print(strvar,type(strvar)) #b'123' <class 'bytes'>
    
    # 使用encode 和 decode 来把中文转化成二进制字节流
    # encode 把中文变成字节流 (编码)
    strvar = "非诚勿扰"
    res = strvar.encode("utf-8")
    print(res)
    # decode 把字节流变成中文 (解码)
    strvar = res.decode("utf-8")
    print(strvar)

    执行

    [root@node10 python]# python3 test.py
    b'123' <class 'bytes'>
    b'xe9x9dx9exe8xafx9axe5x8bxbfxe6x89xb0'
    非诚勿扰

    1.4 复制图片

    实际就是把图片中的二进制字节流拷贝相互来,放到另一个文件当中

    二进制的字节模式,不要指定编码集是utf-8

    #读取文件的内容
    fp = open("集合.png",mode="rb") res = fp.read() fp.close() # [写入]另外一个文件中 fp = open("集合2.png",mode="wb") res = fp.write(res) fp.close()

    执行

    -rw-r--r--. 1 root root    22 Nov 24 03:54 0208.txt
    -rw-r--r--. 1 root root   160 Nov 24 04:19 test.py
    -rw-r--r--. 1 root root 21962 Nov 24 06:27 集合2.png
    -rw-r--r--. 1 root root 21962 Nov 24 04:21 集合.png
    [root@node10 python]# rm -rf 集合2.png
    [root@node10 python]# ll
    total 32
    -rw-r--r--. 1 root root    22 Nov 24 03:54 0208.txt
    -rw-r--r--. 1 root root   160 Nov 24 04:19 test.py
    -rw-r--r--. 1 root root 21962 Nov 24 04:21 集合.png
    [root@node10 python]# python3 test.py
    [root@node10 python]# ll
    total 56
    -rw-r--r--. 1 root root    22 Nov 24 03:54 0208.txt
    -rw-r--r--. 1 root root   160 Nov 24 04:19 test.py
    -rw-r--r--. 1 root root 21962 Nov 24 06:27 集合2.png
    -rw-r--r--. 1 root root 21962 Nov 24 04:21 集合.png

    1.5 追加模式

    (utf-8编码格式下 默认一个中文三个字节 一个英文或符号 占用一个字节)
        #read()        功能: 读取字符的个数(里面的参数代表字符个数)
        #seek()        功能: 调整指针的位置(里面的参数代表字节个数)
        #tell()        功能: 当前光标左侧所有的字节数(返回字节数)

    1.5.1 r+可读可写(先读后写)

    fp = open("0208.txt",mode="r+",encoding="utf-8")
    res = fp.read()
    print(res)
    fp.write("ffzzz")
    
    # 读取所有字符串
    fp.seek(0)
    res = fp.read()
    print(res)
    fp.close()

    执行

    [root@node10 python]# python3 test.py
    今天是个好日子
    
    今天是个好日子
    ffzzz

    1.5.2 r+可读可写,先写后读

    fp = open("0208.txt",mode="r+",encoding="utf-8")
    # 先把光标移动到文件最后
    fp.seek(0,2)
    # 在最后追加abcd ,避免覆盖以前原有字符串
    fp.write("abcd")
    # 使用seek移动光标,把光标移动到文件开头
    fp.seek(0)
    res = fp.read()
    print(res)
    fp.close()

    执行

    [root@node10 python]# python3 test.py
    今天是个好日子
    ffzzzabcd

    1.5.3 w+可读可写(默认光标在文件的开头)

    fp = open("0208_1.txt",mode="w+",encoding="utf-8")
    fp.write("今天天气下了雨")
    
    # 可读
    fp.seek(0)
    res = fp.read()
    print(res)
    fp.close()

    执行

    [root@node10 python]# python3 test.py
    今天天气下了雨
    [root@node10 python]# ll
    total 60
    -rw-r--r--. 1 root root    21 Nov 24 06:40 0208_1.txt
    -rw-r--r--. 1 root root    31 Nov 24 06:37 0208.txt
    -rw-r--r--. 1 root root   144 Nov 24 06:40 test.py
    -rw-r--r--. 1 root root 21962 Nov 24 06:27 集合2.png
    -rw-r--r--. 1 root root 21962 Nov 24 04:21 集合.png
    [root@node10 python]# cat 0208_1.txt
    今天天气下了雨

    除了r模式不能够自动创建文件之外,w和a都可以

    1.5.4 a+ append 可读可写 (默认光标在文件的结尾) (在写入的时候,只能在末尾强制追加)

    fp = open("0208_2.txt",mode="a+",encoding="utf-8")
    fp.write("今天晚上要早走")
    
    fp.seek(0)
    res = fp.read()
    print(res)
    fp.close()

    执行

    [root@node10 python]# python3 test.py
    今天晚上要早走
    [root@node10 python]# ll
    total 64
    -rw-r--r--. 1 root root    21 Nov 24 06:40 0208_1.txt
    -rw-r--r--. 1 root root    21 Nov 24 06:43 0208_2.txt
    -rw-r--r--. 1 root root    31 Nov 24 06:37 0208.txt
    -rw-r--r--. 1 root root   135 Nov 24 06:43 test.py
    -rw-r--r--. 1 root root 21962 Nov 24 06:27 集合2.png
    -rw-r--r--. 1 root root 21962 Nov 24 04:21 集合.png
    [root@node10 python]# cat 0208_2.txt
    今天晚上要早走

    1.6 seek,read,tell语法

    fp = open("0208_3.txt",mode="a+",encoding="utf-8")
    fp.write("123456789")
    res = fp.tell() # 返回当前光标左边所有字符的字节
    print(res)
    fp.seek(4)       # 移动到第四个字节的位置
    res = fp.tell()  # 返回当前光标左侧所有的字节数
    print(res)
    
    res = fp.read(2) # read可以在括号里面指定读几个[字符]
    res = fp.tell()  # 获取当前光标左侧的字节数
    print(res)
    fp.close()

    执行

    [root@node10 python]# python3 test.py
    9
    4
    6
    [root@node10 python]# ll
    total 68
    -rw-r--r--. 1 root root    21 Nov 24 06:40 0208_1.txt
    -rw-r--r--. 1 root root    21 Nov 24 06:43 0208_2.txt
    -rw-r--r--. 1 root root     9 Nov 24 07:19 0208_3.txt
    -rw-r--r--. 1 root root    31 Nov 24 06:37 0208.txt
    -rw-r--r--. 1 root root   422 Nov 24 07:19 test.py
    -rw-r--r--. 1 root root 21962 Nov 24 06:27 集合2.png
    -rw-r--r--. 1 root root 21962 Nov 24 04:21 集合.png
    [root@node10 python]# cat 0208_3.txt
    123456789

    1.7 with语法

    with 语法 简化操作  可以省去fp.close() 这句代码,实现自动关闭
    # with + open(文件操作) as 为open的返回值起别名  fp 就是名称
    # 相当于 fp = open() 一样的

    示例

    with open("0404_6.txt",mode="a+",encoding="utf-8") as fp:
            fp.write("ceshidaima")
            fp.seek(0) # fp.seek(0,2) 移动到文件的末尾
            res= fp.read()
            print(res)
            # fp.close 这句话 with语法自动帮助我们完成

    执行

    [root@node10 python]# python3 test.py
    ceshidaima
    [root@node10 python]# ll
    total 72
    -rw-r--r--. 1 root root    21 Nov 24 06:40 0208_1.txt
    -rw-r--r--. 1 root root    21 Nov 24 06:43 0208_2.txt
    -rw-r--r--. 1 root root     9 Nov 24 07:19 0208_3.txt
    -rw-r--r--. 1 root root    10 Nov 24 07:26 0208_4.txt
    -rw-r--r--. 1 root root    31 Nov 24 06:37 0208.txt
    -rw-r--r--. 1 root root   219 Nov 24 07:26 test.py
    -rw-r--r--. 1 root root 21962 Nov 24 06:27 集合2.png
    -rw-r--r--. 1 root root 21962 Nov 24 04:21 集合.png
    [root@node10 python]# cat 0208_4.txt
    ceshidaima

    简化文件复制操作  open 之间 可以用逗号,隔开 为了简化操作

    with open("集合.png",mode="rb") as fp1,open("集合3.png",mode="wb") as fp2:
            res = fp1.read()
            strvar  = fp2.write(res)

    执行

    [root@node10 python]# python3 test.py
    [root@node10 python]# ll
    total 96
    -rw-r--r--. 1 root root    21 Nov 24 06:40 0208_1.txt
    -rw-r--r--. 1 root root    21 Nov 24 06:43 0208_2.txt
    -rw-r--r--. 1 root root     9 Nov 24 07:19 0208_3.txt
    -rw-r--r--. 1 root root    10 Nov 24 07:26 0208_4.txt
    -rw-r--r--. 1 root root    31 Nov 24 06:37 0208.txt
    -rw-r--r--. 1 root root   124 Nov 24 07:27 test.py
    -rw-r--r--. 1 root root 21962 Nov 24 06:27 集合2.png
    -rw-r--r--. 1 root root 21962 Nov 24 07:27 集合3.png
    -rw-r--r--. 1 root root 21962 Nov 24 04:21 集合.png

    二 文件操作的相关函数

    2.1 刷新缓冲区 flush

    • 当文件关闭的时候自动刷新缓冲区
    • 当整个程序运行结束的时候自动刷新缓冲区
    • 当缓冲区写满了 会自动刷新缓冲区
    • 手动刷新缓冲区
    fp = open("0208_5.txt",mode="w+",encoding="utf-8")
    fp.write("测试close操作")
     while True:
             pass
    fp.close()

    执行

    [root@node10 python]# python3 test.py

    会卡住,但是有文件,内容为空,是因为没有执行closed的操作,内容还没有存盘,另开终端查看:

     使用flush刷新缓冲区

    fp = open("0208_5.txt",mode="w+",encoding="utf-8")
    fp.write("测试close操作")
    fp.flush()
    while True:
            pass
    fp.close()

    执行,冰凌开终端查看

    [root@node10 python]# python3 test.py

    2.2 readline()

    功能: 读取一行文件内容
    readline(字符个数) 单位读的时字符的个数
    如果当前字符个数 > 实际个数 那就只读当前行
    如果当前字符个数 < 实际个数 那就按照给与的当前个数读取 

    写有个文件

    [root@node10 python]# cat 0208_6.txt

    寒蝉凄切,对长亭晚,骤雨初歇。
    都门帐饮无绪,留恋处,兰舟催发。
    执手相看泪眼,竟无语凝噎。
    念去去千里烟波,暮霭沉沉楚天阔。
    
    多情自古伤离别。
    更那堪,冷落清秋节。
    今宵酒醒何处?
    杨柳岸、晓风残月。
    此去经年,应是良辰好景虚设。
    便纵有千种风情,更与何人说?

    示例:

    fp = open("0208_6.txt",mode = "r+",encoding="utf-8")
    res = fp.readline()
    print (res)

    执行

    [root@node10 python]# python3 test.py
    寒蝉凄切,对长亭晚,骤雨初歇。

    读字符数

    fp = open("0208_6.txt",mode = "r+",encoding="utf-8")
    res = fp.readline(3)
    print (res)

    执行

    [root@node10 python]# python3 test.py
    寒蝉凄    #只读了前三个

    读出所有行数 每一行都读

    fp = open("0208_6.txt",mode = "r+",encoding="utf-8")
    res = fp.readline()
    # 判断res是不是为空,如果不是空,则进去打印该字符串
    while res:
            print(res)
            # 在继续向下读取一行
            res = fp.readline() # 读到最后是一个'' bool('') => False

    执行

    [root@node10 python]# python3 test.py
    寒蝉凄切,对长亭晚,骤雨初歇。
    
    都门帐饮无绪,留恋处,兰舟催发。
    
    执手相看泪眼,竟无语凝噎。
    
    念去去千里烟波,暮霭沉沉楚天阔。
    
    
    
    多情自古伤离别。
    
    更那堪,冷落清秋节。
    
    今宵酒醒何处?
    
    杨柳岸、晓风残月。
    
    此去经年,应是良辰好景虚设。
    
    便纵有千种风情,更与何人说?
    fp = open("0208_6.txt",mode = "r+",encoding="utf-8")
    res = fp.readline(3)
    # 判断res是不是为空,如果不是空,则进去打印该字符串
    while res:
            print(res)
            # 在继续向下读取一行
            res = fp.readline() # 读到最后是一个'' bool('') => False

    执行

    [root@node10 python]# python3 test.py
    寒蝉凄
    切,对长亭晚,骤雨初歇。
    
    都门帐饮无绪,留恋处,兰舟催发。
    
    执手相看泪眼,竟无语凝噎。
    
    念去去千里烟波,暮霭沉沉楚天阔。
    
    
    
    多情自古伤离别。
    
    更那堪,冷落清秋节。
    
    今宵酒醒何处?
    
    杨柳岸、晓风残月。
    
    此去经年,应是良辰好景虚设。
    
    便纵有千种风情,更与何人说?

    2.3 readlines() 

    功能:将文件中的内容按照换行读取到列表当中

    with open("0208_6.txt",mode = "r+",encoding="utf-8") as fp:
            res = fp.readlines()
            print (res)

    执行

    [root@node10 python]# python3 test.py
    ['寒蝉凄切,对长亭晚,骤雨初歇。
    ', '都门帐饮无绪,留恋处,兰舟催发。
    ', '执手相看泪眼,竟无语凝噎。
    ', '念去去千里烟波,暮霭沉沉楚天阔。
    ', '
    ', '多情自古伤离别。
    ', '更那堪,冷落清秋节。
    ', '今宵酒醒何处?
    ', '杨柳岸、晓风残月。
    ', '此去经年,应是良辰好景虚设。
    ', '便纵有千种风情,更与何人说?
    ']

    写道列表中

    listvar = []
    with open("0208_6.txt",mode = "r+",encoding="utf-8") as fp:
            res = fp.readlines()
            # 过滤数据
            for i in res:
                    # 过滤两边的空白符
                    res = i.strip()
                    # 把过滤好的数据直接插入到列表当中
                    listvar.append(res)
    print(listvar)

    执行

    [root@node10 python]# python3 test.py
    ['寒蝉凄切,对长亭晚,骤雨初歇。', '都门帐饮无绪,留恋处,兰舟催发。', '执手相看泪眼,竟无语凝噎。', '念去去千里烟波,暮霭沉沉楚天阔。', '', '多情自古伤离别。', '更那堪,冷落清秋节。', '今宵酒醒何处?', '杨柳岸、晓风残月。', '此去经年,应是良辰好景虚设。', '便纵有千种风情,更与何人说?']

    2.4 writelines() 

    • 功能:将内容是字符串的可迭代性数据写入文件中
    • 参数:内容为字符串类型的可迭代数据
    with open("0208_7.txt",mode = "w+",encoding="utf-8") as fp:
             strvar = "123456"
             fp.writelines(strvar)

    执行

    [root@node10 python]# python3 test.py
    [root@node10 python]# cat 0208_7.txt
    12345

    列表类型

    with open("0208_7.txt",mode = "a+",encoding="utf-8") as fp:
             strvar = ["aaa",'bbb','ccc']
             fp.writelines(strvar)

    执行

    [root@node10 python]# python3 test.py
    [root@node10 python]# cat 0208_7.txt
    123456
    aaabbbccc[

    int的不能写,必须强制格式化

    with open("0208_7.txt",mode = "w+",encoding="utf-8") as fp:
            res = str([1,2,3,4,5])
            fp.writelines(res)

    执行

    [root@node10 python]# python3 test.py
    [root@node10 python]# cat 0208_7.txt
    [1, 2, 3, 4, 5]

    2.5 truncate()

    功能: 把要截取的字符串提取出来,然后清空内容将提取的字符串重新写入文件中 (字节)

    with open("0208_6.txt",mode="r+",encoding="utf-8") as fp:
            fp.truncate(5)

    执行

    [root@node10 python]# python3 test.py
    [root@node10 python]# cat 0208_6.txt
    寒▒

    readable()  功能: 判断文件对象是否可读

    writable ()     功能: 判断文件对象是否可写

    [root@node10 python]# cat test.py
    fp = open("0208_6.txt",mode="w",encoding="utf-8")
    res1 = fp.readable()
    res2 = fp.writable()
    print(res1,res2)

    执行

    [root@node10 python]# python3 test.py
    False True

    遍历

    # 文件对象具有可迭代性  
    # 遍历fp对象 和 readline一行一行读取的操作是一样的.
    for i in fp:
        print(i)
  • 相关阅读:
    DOM
    JavaScript
    自定义特性的简单用法
    项目三--自主开发项目说明
    一维数组进行多位数算数运算-加减乘
    Vs2017发布可在线更新的Winform程序
    C#中使用WCF创建面向网络的服务程序
    datatable转layui表格v2[分页and带模板]【偏实例】
    datatable转layui表格【偏原理】
    MVC下通过jquery的ajax调用webapi
  • 原文地址:https://www.cnblogs.com/zyxnhr/p/12283545.html
Copyright © 2020-2023  润新知