文件处理

文件处理

什么是文件

操作系统给用户提供的操作硬盘的简单接口

为什么要用文件

永久保存数据

怎么用文件

相对路径:a.txt # 必须与当前py文件在同一级目录

绝对路径:E:\Python\练习代码\文件处理\a.txt

操作文件流程

打开

1、open(需要结尾close关闭,否则占用内存)

f = open('a.txt')
f = open(r"E:\Python\练习代码\文件处理\a.txt")# 注意需要要用r防止转义
f.close()# 回收操作系统的资源

f:文件句柄

2、with open (不需要用close结尾关闭文件)(上下文管理)

可以同时打开多个文件,with未执行完前读取文件读不出

with open(r'th.jpg',mode='rb')as rf,open('lixiaoran.png',mode='wb')as wf:
with open("a.txt") as f:# as 的作用是将赋值给f
with open(r'E:\Python\练习代码\文件处理\a.txt') as f:# 注意需要要用r防止转义

打开文件需指定的参数

1、文件路径

2、指定处理模式

3、指定操作文本的字符编码encoding=“ ”

with open("a.txt", mode='rt',encoding='utf8') as f:    
    print(f.writable())    
    print(f.readable())    
    print(f.read())

打开文件的模式

纯净模式

1、r:(默认)只读模式

​ 1、默认mode = "rt"时要指定操作文本的字符编码encoding=“ utf-8”

​ 2、读出二进制字节mode = "rb" ,不要指定encoding

​ 3、读取文件如果文件不存在,会报错

r模式下的内置方法:

f .read() :全部一次性读出来

f.readable():判断是否可读

f.readline() :执行一次读一行

f.readlines() :全部读出来,按照列表的形式把每一行作为元素读出来,并且把\n换行符也会一并读出

with open(r"E:\Python\练习代码\文件处理\as.txt", "r", encoding='utf-8') as f:    		     print(f.read())
    # print(f.readline())# 执行一次读一行
    # print(f.readline())
    # print(f.readline())
    # print(f.readline())
    # print(f.readline())
    print(f.readlines())# 全部读出来,按照列表的形式把每一行作为元素读出来
with open("a.txt","rb") as f1:
    print(f1.read())

2、w:(慎用)只写模式

​ 1、如果文件不存在则建立一个新的文件,如果文件存在则清空文件内容重新写入

​ 2、只写一个"w"默认是”wt",写成二进制字节为"wb"

f.write():只能写一个字符串,并且会清空之前的文件内容

f.writable():判断是否可写

f.writelines():按照列表的形式,加数据到原文件中,也会清空原文件中数据 ,for + f.write()

with open("a.txt", "w", encoding='utf-8') as f:    
	# f.write("你好,上海")    
	f.writelines(["你好\n",'上海'])

3、a:只追加写

​ 1、如果文件存在则在数据后追加数据

​ 2、如果文件不存在会新建一个文件写入数据

with open("a.txt", "a", encoding='utf-8') as f:
    f.write("\n hello,上海")# \n是表示换行

+模式(了解)

都是可读可写的,并且保留自身原有的特性

1、r+:可读可写,但是写时没有文件不会创建新文件

2、w+:可读可写,无文件时会创建新的文件

3、a+:光标永远在最后追加读写

处理模式

必须结合r,w,a模式下使用

1、t:text文本模式

​ 只能针对文本文件,读写文件只能以字符串为单位,一定要指定encoding

2、b:bytes二进制模式

​ 可以读写任意文件,是以bytes二进制为单位,不要指定encoding

with open(r"timg.jpg",mode="rb") as f1,open(r"小黄人.png",mode="wb") as f2:
#    xiao = f1.read()
#    f2.write(xiao)
    for xiao in f1:
        f2.write(xiao)

读写文本文件时,使用t模式自动帮我们编码和解码了,但是其他格式的文件,必须要用b模式,需手动解码编码

文件的光标移动

f.seek(光标移动的位数相对偏移度,指定光标从何开始)

f.seek(offset,whence)
offset: 相对偏移度 (光标移动的位数)针对的是字节
whence:指定光标位置从何开始
    0:从文件开头(t模式下只能是0)
    1:从当前位置
    2:从文件末尾

t模式下只能指定0,如果指定1、2那光标移动位数只能是0,从文件头开始,

b模式下可以是0,1,2都可以使用

b模式下需要解码才能正常读出来

gbk中一个中文字符是2个字节,一个英文字符半角是1个字节,全角是2个字节

utf-8中一个中文字符是3个字节,一个英文字符是1个字节

with open(r'a.txt', mode="rb") as f:
    f.seek(6,0)
    print(f.read(3).decode("utf-8"))
    f.seek(6,1)
    print(f.read(6).decode("utf-8"))
    f.seek(-8,2)
    print(f.read(6).decode("utf-8"))

with open(r'a.txt', mode="r",encoding="utf-8") as f:
    f.seek(6,0)
    print(f.read(1))
    f.seek(0,1)
    print(f.read(1))

修改文件内容

硬盘中的数据没法修改,更新都是新内容覆盖旧内容,内存中的数据可以修改

所以我们修改数据都是将硬盘中的数据读到内存中进行修改

具体的两种方式:

1、将文件数据全部读到内存然后修改

​ 优点:同一份数据只有一份进行修改

​ 缺点:过多的占用内存空间

with open(r"a.txt",mode="rt",encoding="utf-8") as f1:
    data = f1.read()
with open(r"a.txt",mode="wt",encoding="utf-8") as f2:
    data2 = data.replace("上海","DSH")
    f2.write(data2)

2、以读的模式打开,以临时文件写入,写入后将原文件删除,临时文件重命名

需调用os模块

​ 优点:不会占用过多内存

​ 缺点:文件修改中同一份数据存了两份

import os
with open(r"a.txt",mode="rt",encoding="utf-8") as f1,\
        open(r"b.txt",mode="wt",encoding="utf-8") as f2:
    for i in f1:
        f2.write(i.replace("DSH","大上海"))
os.remove("a.txt")
os.rename("b.txt","a.txt")
posted @ 2019-11-08 20:06  Mr沈  阅读(174)  评论(0编辑  收藏  举报