• 文件操作


    基本的文件处理

    什么是文件

    • 文件是操作系统提供的虚拟的单位,有了文件我们可以读取数据,没有文件的话应该去硬盘上扣动机械手臂然后寻找数据.

    如何使用文件

    1. 打开文件()
    2. 读写数据
    3. 保存
    4. 关闭文件

    使用Python写一个小程序控制文件

    open(打开文件)

    • 格式:open('文件名', mode='模式', encoding='编码格式')
    • 模式默认为r,编码格式默认为读取软件的编码格式
    • 如果在txt中写编码格式则为gbk,在Pycharm或者Python中写则为utf-8, word编码格式不是gbk也不是utf-8,不懂可以参考上一篇文章
    fr = open('test1.txt', mode='r', encoding='utf-8')
    

    read:

    • 默认一次性全部读取,里面的参数可以设置从第几个字符开始看,按字符算,其他都是按字节算

    • 读取完了后,再进行读取,则为空

    data = fr.read()       # 用data去接收返回值,也就是文本的内容
    print(data)            # 输出文本内容
    

    readline:一次性读取一行

    • 一次性读取一行,会读取
    • 如果读完所有数据,继续读取为空
    print(fr.readline())
    

    del:删除

    • 只是删除了变量名,但是文件对于操作系统来讲,还是打开状态的
    del fr
    

    close:关闭

    • 不仅删除了变量名fr,而且也关闭了文件,这个时候文件对于操作系统来说是关闭状态的
    fr.close()
    
    • 打开文件时操作的是硬盘和内存
    • 而Python3只是软件,无法操控硬件,所以也是由操作系统在进行交互
    • 所以当你用del删除变量名时,只是删除了变量名的内存占用,并没有让操作系统关闭文件

    write(写入)

    • 会清空当前文件的内容,再写
    fw = open('test1.txt', mode='w', encoding='utf-8')
    fw.write('12345')
    

    flush 快速刷入硬盘

    提高写入优先级,写完write习惯性加一个flush

    绝对路径

    • 文件在电脑上的路径
    fr = opne(‪'C:UsersYDesktop123.txt', mode = 'r', encoding = 'utf-8')
    

    相对路径

    • 文件相对于工作文件夹的路径

    • 注意打开的文件夹和运行的py文件需要是同文件夹下的,不然需要修改相对路径的一些信息

    文件的三种打开方式

    mode = 'r' , 只读, 默认模式

    fr = open('test.txt', mode = 'r', encoding = 'utf-8')  # 默认r,和rt相同
    

    mode = 'w' , 只写,会清空之前的内容

    fw = open('test.txt', mode = 'w', encoding = 'utf-8') 
    

    mode = 'a' , 追加,在后面追加写入文件

    fa = open('test.txt', mode = 'a', encoding = 'utf-8') 
    

    mode = 'rt' , 打开的text文本类型

    • 和r相同
    fr = open('test.txt', mode = 'rt', encoding = 'utf-8') 
    

    mode = 'rb' ,打开的bytes类型,(二进制)

    • 没有encoding,因为本身就是二进制不需要编码
    frb = open('test.txt', mode = 'rb') 
    

    'wt', 'at'和'w', 'a'相同,而'wb', 'ab'用不上,你不会写二进制

    在字符串前面加r,告诉接下来的字符串,里面所有特殊字符(如)都毫无意义
    在字符串前面加b,是告诉print字符串里面是二进制数,不要再用终端的编码进行编译了,原生打印就可以了

    with open()

    • 比open()好用,会自动关闭,不需要写close
    • 里面的写法和open一样,只是变量名用as写到后面,下面的内容要缩进
    with open('test.txt', mode='r', encoding='utf-8') as 变量名:
    

    文件高级应用

    • r+:可读可写,会替换写

    • w+:可读可写,但是会清空写)

    • a+:可读可写,追加写

    • 以上三种方式不推荐使用,可以先读再写,没必要同时

    指针

    • 需要有一个文件,并且打开,指针就是光标所处的位置
    • 不推荐使用
    with open('test.txt', mode='r+', encoding='utf-8') as fr:
        fr.seek(3)            # 三个字节
        fr.write('123')
        fr.flush()
    

    原文件: 999999

    修改后:999123

    • 文件的写没有插入一说,只有替换,覆盖

    • 而电脑word或者txt文本中的可以直接插入其实是

    • 一个中文是3个字节,一个英文是1个字节,一般都是字节,只有read中是字符

    seek(a,b)

    • a是指针移动的字节数

    • b如果是0是文件开头,1是指针当前位置,2是末尾,但如果要1或者2,那么只能使用2进制

    tell

    • 告诉光标当前的位置

    read

    • read中有一个参数,是光标移动的字符个数,只有这次用的是字符

    truncate

    • 清空文本,如果有参数,则光标会跳到指定字节数后,然后把后面的文件全部清空,无视之前用seek移动的光标位置

    文件的拷贝

    • 修改文件时,为了防止两个应用程序同事修改同一份文件,而导致报错,因为你书写是一个修改的过程,而当第一个程序修改了一个字符后,如果第二个程序也要修改这个字符,那么就会报错
    • 为了避免这种情况,会在修改时新建一个拷贝文件,然后都在拷贝文件中进行修改,最后删掉原有的,把拷贝后的文件改名放进去

    文件修改的过程(示例)

    # 把文件读出来,替换内容
    with open('test.txt', mode='r', encoding='utf-8') as fr:
        data = fr.read()
        data = data.replace('a', 'b')
    
    # 另外用一个文件,写入替换后的内容    
    with open('test_swap.txt', mode='w', encoding='utf-8') as fw:
        fw.write(data)
    
    
    # 用os模块删除test文件,再把test_swap文件改名成test
    import os
    
    os.remove('test.txt')
    os.rename('test_swap.txt', 'test.txt')
    
    # 简便版
    # 把文件读出来,替换内容,再写入一个文件中
    with open('test.txt', mode='r', encoding='utf-8') as fr,
    		open('test_swap.txt', mode='w', encoding='utf-8') as fw:
        data = fr.read()
        data = data.replace('a', 'b')
    	fw.write(data)
    
    
    # 用os模块删除test文件,再把test_swap文件改名成test
    import os
    
    os.remove('test.txt')
    os.rename('test_swap.txt', 'test.txt')
    

    修改文件内容的两种方式

    • 第一种,上面写的,把文件全部读出来,然后一起替换
    • 第二种,下面写的,对文件进行逐行修改,节省内存空间(推荐)
    import os
    with open('test.txt', mode='r', encoding='utf-8') as fr,
    		open('test_swap.txt', mode='w', encoding='utf-8'):
        # 循环读取内容,逐行修改
        for line in fr:     	# 和for line in fr.read():效果一样
            line = line.replace('a', 'b')
      	 	# 新文件写入原文件修改后的内容,之所以不会每次写入都清空之前的数据,是因为清空这个过程并不是write造成的,而是在open文件时,mode='w'造成的.所以循环写入不会有影响
            fw.write(line)
    

    enumerate

    会在原有的值前面加一个下标值,用k,v 去接受,类似于items

  • 相关阅读:
    052-90
    052-89
    052-88
    052-87
    052-86
    html5的manifest
    js中数字转金钱格式
    CSS复合样式
    资料
    异步
  • 原文地址:https://www.cnblogs.com/lucky75/p/10940098.html
Copyright © 2020-2023  润新知