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

    文件处理

    什么是文件处理

    修改存储的信息

    什么是文件

    操作系统提供的虚拟概念,存储信息(二进制)

    操作文件的流程

    1.打开文件

    语法格式: open ('文件路径','打开模式',encoding='编码格式')

    fw = open (r'相对/绝对路径','r',encoding='utf8')

    注意点

    1. r会让内部所有的失效;或者也可以在邪光前再加一个斜杠使第二个斜杠失效
    2. 建议更多使用相对路径

    2.修改/读取文件

    fr.write('''
    孩儿立志出乡关,学不成名誓不还
    埋骨何须桑梓地,人生无处不青山
    ,,,)
    

    3.保存文件

    fw.flush() #快速保存,类似于ctrl + s

    4.关闭文件

    del fw

    python通过操作系统操作文件,删除fw,只是删除变量fw所指向的文件对象的内存占用

    fw.close #告诉操作系统关闭文件

    文件的三种打开模式

    以文本数据模式打开文件的三种方式

    只读不可写:rt read_text

    #fr.read()	#读取所有文本内容
    fr = open ('mzd
    诗文.txt','rt',encoding='utf8')
    #fr.write('asdfasdf')	#报错不可写
    data = fr.read()	#读取所有文本内容
    print(data)
    print(fr.readable())	#判断是否可读
    
    #以下仅做了解
    print(fr.readline())	#读取一行,默认换行
    print(fr.readlines())	#读取所有行放入列表	
    #要循环读出文本内容
    for i in fr.read():	#循环读出一个个字符,文本中有换行符,print自带换行符,故部分字符换两行
        print(i)	
    for i in fr:
        print(i)	#循环读出一行行字符,换行原理同上,节省内存
    

    对同一个文件对象读取,光标会不断往后移不会刷新,要重新读,可以重新打开

    文本读一行少一行,每一行末尾默认有一个换行

    清空写入不可读:wt

    1. fw = open ('毛主席诗文.txt,'wt') #清空是只要使用'wt'模式就会做,而不管是否使用.write写入

    2. 仅做了解

      fw.writelines(['蔡','启','龙','宇宙','超级','无敌','帅']) #参数为列表是,将列表元素拼接成一行写入

    追加写入,不可读:at

    encode编码 decode解码

    乱码不可恢复,写文件encoding指定的是写入字符的编码格式,读文件encoding指定的是读取文件的解码格式

    以二进制数据模式打开文件

    b-->二进制模式,不单独使用一般与r/w/a联用,且以二进制模式打开不需要指定编码格式

    一般不使用wb/ab模式,因为不了解数据与二进制的具体映射关系

    一般只使用'rb'保存图片/音频/视频文件

    fr2 = open ('计算机组成补充.mp4','rb')

    print(fr2.read())

    w和a模式写入文件时,如果文件不存在则自动创建

    绝对路径和相对路径

    相对路径

    执行文件(当前运行的文件)和打开文件属于同一文件夹下

    未来写项目尽量用相对路径,因为代码放入不同操作系统(windows-->linux)绝对路径会发生变化)

    with管理上下文

    语法

    with提供一个自动关闭文件的功能(解除操作系统的占用)

    '''
    with open ('文件路径','打开模式',,encoding='编码格式') as fr3:
    	data = fr3.read()	#在缩进内不会关闭文件
    code2	#跳出缩进关闭文件
    print(fr3)	#只涉及python中的变量,变量指向的文件对象依然存在,不报错
    print(fr3.read)	#涉及操作系统中文件占用,已经关闭,报错
    print(data)	#data放入到python内存且存储了打开文件的数据,打印不报错
    '''
    

    文件的高级应用

    全部仅做了解

    打开文件的三种新模式(可读可写,尽量不使用)

    可读可写无法保证读写同步

    假设一个文件既可读又可写,假设写需要10s,读需要5s

    针对一个文件内有一个'中'字,需要在'中'字后面写入一个'国'字,需要10s

    过了1s,我们读了这个文件,又5s过后,我们看到文件只有一个'中'字

    感觉自己没写入,你会再次写入一个'国'字(基于前面一个字是'中'字)

    又4s过后,第一个的写入成功了,文件变成'中国'了

    又6s过后,第二次写入一定失败

    以前发生过,现在的电脑牛逼了,所以这种情况很少发生,但还是有一定概率

    可读可覆盖写:"r+t"/"r+b"

    光标在文件头部,覆盖写入

    可清空写可读:"w+t"/"w+b"

    等价于"w",使用"w+t"时即清空,先读再写读取内容一定为空

    先写再读毫无意义

    可追加写可读:"a+t"/"a+b"

    with open ('毛主席诗文.txt','a+t',encoding='utf8') as fr4:
    	fr4.write('asdfg')
    	print(fr4.read())	#无法读取内容,写入后光标默认在尾部
    

    综上:如果真的既有读的需求又有写的需求,用两种不同的模式打开两次文件

    光标的高级应用(移动光标)

    字节与字符

    8个二进制位为一个字节,中文3个字节为1个字符,英文一个字节为1个字符

    00000000 一个字节

    00000000 00000000 00000000 一个中文字符

    下一种移动光标以字符文单位

    read

    with open('mzd诗文.txt','rt',encoding='utf-8') as fr:
    	print(fr.read(3))	#n表示n个字符,不加默认读取所有,一个中文和一个英文都属于分别属于一个字符
    

    下三种移动光标以字节为单位,因此必须用'rb'模式打开

    seek

    0/1/2/默认 四种参数

    with open('mzd诗文.txt','rb') as fr:
        #fr.seek(setoff,whence)		setoff为光标偏移量,whence为光标开始位置
        fr.seek(3,0)	#'0'表示光标从头部开始,'3'表示偏移量为3,read默认从光标往后读取所有字节
        print(fr.read().decode('utf8'))	
        #'rb'模式下读取的是二进制数据,此时read内参数读取的是以字节为单位,需解码才能显示成字符
        
        fr.seek(3,1)
        print(fr.read().decode('utf8'))	
        #'1'表示光标从当前位置开始,如果中文字节读取发生断码会报错
        
        fr.seek(-8,2)
        print(fr.read().decode('utf8'))
        #'2'表示光标从尾部开始,'-8'表示光标向左偏移8个字节
        
        fr.seek(6)
        print(fr.read().decode('utf8'))
        #seek内只有一个参数时表示的是setoff光标偏移距离,光标开始位置默认值为whence:int=0
    

    tell

    输出光标当前所在字节位置,以左端为0界基准

    print(fr.tell())

    truncate:截断

    fr.truncate(3) #截断就要作修改,必须用"ab"模式打开文件,以字节为单位,"3"表示光标从头部向右移动三个字节,从此处截断,后面字节舍去,切记不能使用"wb"模式,因为会使文件情况,截断就变得没有任何意义

    文件的修改

    文件没有修改一说,只有覆盖

    with open ('毛主席诗文.txt','r+',encoding='utf8') as fr:
        data = fr.read()
        print(data)
        fr.seek(3,0)
        fr.write('干')
        #可追加写可读模式:“a+t“光标固定在尾部字节,不可调控
    

    缓存文件原理

    with open ('毛主席诗文.txt','r',encoding='utf8') as fr,open ('swap.txt','w',encoding='utf8') as fw:
               data = fr.read()
               data = data.replace('中国','全世界')
               fw.write(data)
    import os
    os.remove('毛主席诗文.txt')
    os.rename('swap.txt','毛主席诗文.txt')
    
    
    with open ('毛主席诗文.txt','r',encoding='utf8') as fr,open ('swap.txt','w',encoding='utf8') as fw:
            #改进:一行一行读取修改,再大文件都能修改
            for i in fr:   
                   i = i.replace('中国','全世界')
                   fw.write(i)
    import os
    os.remove('毛主席诗文.txt')
    os.rename('swap.txt','毛主席诗文.txt')           
    
  • 相关阅读:
    英文词频统计
    字符串练习
    第八周
    第七周
    第五周
    第六周
    第三周
    第四周
    第二周
    第一周作业
  • 原文地址:https://www.cnblogs.com/-406454833/p/11552244.html
Copyright © 2011-2022 走看看