• day09 文件操作


    文件操作

    什么是文件

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

    如何使用文件

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

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

    read一次性读取所有数据

    f = open(r'C:Users
    ickcDesktop	est.txt',encoding='gbk')  # 相当于你打开的文件
    print(f.read())  # 一次性读取所有的内容
    print(1,f.read())
    

    readline读取一行,如果读完了所有数据,继续读取为空

    f = open(r'C:Users
    ickcDesktop	est.txt',encoding='gbk')  # 相当于你打开的文件
    print(f.readline())
    print(f.readline())
    print(f.readline())
    print(f.readline())
    print(1,f.readline())
    
    fr = open(r'C:Users
    ickcDesktop	est.txt',encoding='gbk')  # 相当于你打开的文件
    print(fr.read())  # 一次性读取所有的内容
    fr.close()
    
    1. 打开文件的那一瞬间是在操作硬盘和内存
    2. python3能操控硬盘和内存吗?一定不能,因为他是应用程序
    3. 看到的python3打开文件并操控,都是基于操作系统的
    4. 然后你只是使用了del f,只是在删除f这个变量名的内存占用
    5. 但是我们从来都没有告诉操作系统关闭文件
    6. 所以我们必须使用close()关闭文件

    绝对路径和相对路径

    追加,在文件尾追加文本
    mode = "a"

    打开的text文本类型
    mode = "rt"

    打开的bytes类型,二进制
    mode = "rb"

    可读可写

    绝对路径

    从根目录开始,一直到你需要的文件路径

    相对路径

    从当前文件夹开始,到你需要的文件路径,只需要输入文件路径,要打开的文件必须和运行的py文件必须得在一个文件夹下

    文件的三种打开方式

    mode='r',只读

    fr = open('test.txt',mode='r',encoding='utf8')  # 默认r=rt
    data = fr.read()
    print(data)
    

    mode ='w',只写,清空文件在写入

    fr = open('test.txt',mode='r',encoding='utf8')  # 默认r=rt
    data = fr.read()
    print(data)
    

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

    fr = open('test.txt',mode='a',encoding='utf8')  # 默认r=rt
    data = fr.write('nick 全裸写真集')
    print(data)
    

    mode= 'rt' # 打开的text文本类型 # nick 很帅(utf8) utf8 nick 很帅 -->

    fr = open('test.txt', mode='rt', encoding='gbk')  # 默认r=rt
    text_data = fr.read()
    print(text_data)
    

    mode = 'rb' # 打开的bytes类型,二进制 # 010101010110010

    fr = open(r'D:Python视频Python9期视频day 09	est.txt', mode='rb')  # 默认r=rt
    print(fr)
    bytes_data = fr.read()
    print(bytes_data)
    

    r,r告诉接下来的字符串,里面所有的特殊字符都变得无意义

    print('1\t2')
    print('1	2')
    print(r'1
    	2')  # '1\n\t2'
    

    b表示,你写的字符串为二进制,在打印的时候不需要使用终端的编码处理,直接打印原生的二进制即可

    print(b'xe5xbex88xe8xa1xb0')
    

    t和b不能单独使用,必须得和r/w/a一起使用,r/w/a能单独使用

    with管理上下文

    with open(文件路径,打开模式(rt/wt/at/rb/wb/ab),编码格式) as 变量名:
    # 变量名.read/write

    with open('test.txt','r',encoding='utf8') as fr:
        data = fr.read()
        print(data)
    
    name = 'nick'
    print(name)
    

    r只读/w只写/a追加,可读可写(不推荐使用)r+,w+,a+

    with open('test.txt','r',encoding='utf8') as fr:
        print(fr.readable())
        print(fr.writable())
        data = fr.readline()
        print(data)
    
    
    with open('test.txt', 'w', encoding='utf8') as fw
        print(fw.readable())
        print(fw.writable())
        fw.write('nick handsome245234234')
        fw.flush()
    
    
    
    with open('test.txt','r+',encoding='utf8') as fr:
        print(fr.readable())
        print(fr.writable())
        data = fr.readline()
        fr.write('nick handsome245234234')
        fr.flush()
    

    指针(不要使用指针)

    with open('test.txt','rt+',encoding='utf8') as fa:
        # 3个字节,
        # fa.readline()
        fa.seek(5, 0)  # 字节算的
        # fa.seek(3, 1)
        print(fa.tell())  # 告诉你光标当前的位置
        print(fa.read(3))  # 光标后的字符个数,一个中文1个字符,3个字节;一个英文一个字符,一个字节
        fa.truncate(3) # 如果它有参数,则光标会跳到指定字节数后,然后把后面的文件全部清空
        fa.flush()
    

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

    文件的拷贝

    文件不能插入,但是有需求要修改文件,插入.

    with open('test.txt', 'r', encoding='utf8') as fr:
        data = fr.read()
        data = data.replace('sb', '帅逼')
        print(data)
    
    with open('test_swap.txt', 'w', encoding='utf8') as fw:
        fw.write(data)
    
    import os
    
    os.remove('test.txt')
    os.rename('test_swap.txt', 'test.txt')
    

    qq想修改这个程序,微信也想修改这个程序,两者都已经读取文件成功,都拿到了tank dsb

    qq想修改tank dsb中的sa,微信想把s修改成b,这两个修改一定有先后顺序,假设qq先修改,
    那么s已经变成了a,但是微信找的到s吗?,找不到了,报错.

    qq想修改tank dsb中的sa,微信想把s修改成b,所以我给qq一份拷贝文件,我给微信一份拷贝文件,
    然后让他们各自修改,修改成功后,删除原文件,修改替换后的文件名为原文件

    with open('test.txt', 'r', encoding='utf8') as fr, 
            open('test_swap.txt', 'w', encoding='utf8') as fw:
        data = fr.read()
        data = data.replace('sb', '帅逼')
        fw.write(data)
        print(data)
    
    import os
    
    os.remove('test.txt')
    os.rename('test_swap.txt', 'test.txt')
    
    with open('test.txt', 'r', encoding='utf8') as fr, 
            open('test_swap.txt', 'w', encoding='utf8') as fw:
        data = fr.read()
        data = data.replace('sb', '帅逼')
        fw.write(data)
        print(data)
    
    import os
    
    os.remove('test.txt')
    os.rename('test_swap.txt', 'test.txt')
    

    更省内存的读方法

    with open('test.txt', 'r',encoding='utf8') as fr:
        print(fr.readlines())
            for i in fr.readlines():
                 print(i)
            print('*'*50)
            for i in fr:   # 这样获取更省内存
                print(i)
            print(fr)
    

    更省内存的写方法

    with open('test.txt', 'r', encoding='utf8') as fr, 
            open('test_swap.txt', 'w', encoding='utf8') as fw:  # w在清空文件,而不是write清空文件
        '''
        tank dsb
        tank dsb
        tank dsb
        tank dsb
        '''
        for i in fr:
            i = i.replace('sb', '帅逼')
            fw.write(i)
    
    import os
    os.remove('test.txt')
    os.rename('test_swap.txt', 'test.txt')
    

    总结

    文件只需要记住

    1. with open(filename,mode,encoding) as file:
      file+操作
    2. rt/rb/wt/at
    3. 文件的复制
  • 相关阅读:
    leetcode-23-DynamicProgramming-1
    perl-basic-数组操作
    R-data.table
    perl-basic-分支&循环
    neo4j3.0多数库切换
    Neo4j下载与使用
    python中导入模块的注意点
    python 一个.py文件如何调用另一个.py文件中的类和函数
    理解Python中的类对象、实例对象、属性、方法
    flowable+tomcat部署flowable项目,在线画流程图
  • 原文地址:https://www.cnblogs.com/wsxiaoyao/p/10940427.html
Copyright © 2020-2023  润新知