一.文本文件和二进制文件
1)文本文件:存储普通的‘字符’文本,默认为unicode字符集(两个字节表示一个字符,最多表示65536个)
2)二进制文件:把数据内容用“字节”进行存储。
*在创建时,如果我们没有增加模式“b”,则默认创建的是文本文件对象,处理基本单元是”字符“。
二.文件操作模块:
io模块-------文件流的输入和输出操作 input output
os模块-------基本操作系统功能,包括文件操作
glob模块------查找符合特定规定的文件路径
fumatch模块--------使用模式来匹配文件路径名
fileinput模块--------处理多个输入文件
filecmp模块---------用于处理文件的比较
csv模块----------用于csv文件处理
pickle和CPickle-------用于序列化和反序列化
xml包---------用于XML数据处理
bz2,gzip,zipfile,zlib,tarfile-------用于处理压缩文件和解压缩文件(分别对于不同的算法)
三.创建文件对象 open()
1.基本语法格式:
open(文件名[,打开方式])
如果只有文件名------表示在当前目录下的文件(文件名可以录入全路径)
示例:f=open(r"d:\b.txt","a") ==>等同于f=open("D:\a\b.txt","a")
2.判断文件名是否存在
语法:import os #使用此操作之前必须先调用模块os
if os.path.isfile(文件名):
<语句>
3.文件路径
1)相对路径:
从当前文件所在的文件夹开始的路径
【文件名.txt】和【./文件名.txt】都是从当前文件夹寻找 【文件名.txt】。
【../文件名.txt】从文件夹的上一级文件夹里查找 【文件名.txt】。
【文件名1/文件名.txt】,在当前文件夹里查找"文件名1"这个文件夹,并在里面查找"文件名.txt".
2)绝对路径:
是指绝对位置,完整地描述了目标所在地,以及文件目录层级关系。
*打开文件的模式(mode):默认rt,以文本模式打开,只读
r-----读模式
w------写模式,如果文件不存在则创建;存在则重写新内容。
a------追加模式,如果文件不存在则创建;如果文件存在则在文件末尾处追加内容。
b------二进制模式(可与其他模式组合使用)
rb------以二进制格式打卡一个文件,用于只读(wb只写,ab用于追加,)。
t-------文本形式打卡
+-------读、写模式(可与其他模式组合使用)
r+-------打开一个文件用于读写,文件指针在文件开头(w+ 覆盖原文件,不存在时创建文件;a+ 文件指针放在文件结尾,不存在时,创建后用于读写;rb+文件指针在文件开头,wb+、ab+、)
U------通用换行符支持
四.文件对象方法
*file.close()------关闭文件
*file.read(x)------从文件中读取x个字符,当未给定x或者给定负值时,读取剩余的所有字符,然后作为字符串返回。
*file.readline()-----以写入模式打开,如果文件存在,则在末尾追加写入
*file.wrinte()-----将字符串写入文件
*file.wrintelines()-----向文件写入字符串序列seq,seq应该时一个返回字符串的可迭代对象
*file.seek(offset,from)------在文件中移动文件指针,从from(0代表文件起始位置,1代表当前位置,2代表文件末尾)偏移offiset个字节。
*file.tell()------返回当前文件的位置
五.常用编码 encoding:用指文件的编码方式
1.语法:
file=open('文件名','w',encoding='utf8')
2.编码:
window默认GBK,linux默认UTF-8
ASCII------7位表示,只能表示128(2**7)个字符。
ISO8859-1-----8为表示一个字符,能表示256个字符,兼容ASCII
GB2312,GBK,GB18030-------兼容ISO,英文1一个字符,汉字两个字符
Unicode--------定长编码,2个字节表示一个字符,与ISO不兼容
UTF-8---------变长编码,1-4个字节表示一个字符,英文1个字节,汉字3个字节,兼容ISO
3.转码
在文件以二进制读取的时候,使用encode('utf8')转回汉字
*一般使用二进制读取,同样使用二进制写入,并不必使用这种方式*
'你'.encode('utf8')----->b'\xe4\xbd\xa0' #你这个字的二进制形式
语法:file=open('sss.txt','rb')
print(file.encode('utf8'))
六.关闭文件 close()
一般在文件进行操作之后都要关闭
语法:file.close()
七.文件写入数据 write()
1.步骤:
创建文件对象--->写入数据write()--->关闭文件对象close()
*先打开文件,再进行写入。*
*在进行写入操作时,打开文件要以 'w'等相关方式打开*
2.使用write()可以向文件写入数据。
语法:file.write('数据') #write输入的数据必须时字符串而非其他数据类型
3.写入规则:
1)如果文件不存在,先创建,如果文件存在则先清空,后写入数据。
2)*write时,只能写入字符串或二进制,列表、字典、数字都不能之间写入文件。*
3)将数据转成字符串:repr/str, 或者使用json模块
4)将数据转成二进制:使用pickle模块
八.文件读取数据(read)
1.步骤:
同文件打开操作相同,*先打开文件,再进行读取。*
2.使用read()可以从文件中读取数据
语法1:file.read(num)#将所有数据都读取出来 ,这里的num是指读取的长度,不写时默认为-1
#从文件读取num个字符,当为给定num或给定负值的时候,读取剩余的所有字符,然后作为字符串返回。
语法2:file.readline()#只读取一行
语法3:file.readlines()#读取所有数据,保存到一个列表中,有几行保存成几个元素(在列表)
注意: *.在下次调用读操作时一般是从上次读取的位置继续读取
*.在对文件进行读操作时,要在打开文件操作上转换“r”等相关的方式。
十.文件拷贝
1.思想:
先打开被拷贝文件--->以读'w'的方式打开新文件--->读取被拷贝文件--->将内容写入新文件--->关闭所有文件
2.文件备份
思想:先生成备份文件名----->将文件中内容拷贝到备份文件中
语法:name=file_name.rpartition('.') #会将文件以从右边数第一个点分成三个'xxx.txt'--->'xxx','.','txt'
new_file_name=name[0]+'.bak.'+name[2]#结果为'xxx.bak.txt'
语法2:os.path.splitext(文件名) #使用此模块之前必须先调用os模块(import os)会将文件从右数第一个点分成两段 'xxx.txt'------>'xxx','.txt'
new_file_name=name[0]+'.bak'+name[1]#结果为'xxx.bak.txt'
十一.指针定位 tell() seek()
1.tell()方法用来显示当前指针的位置
语法:file.tell()
2.seek(offset,whence)方法用来重新设定指针的位置。
·offset表示偏移量
·whence表示只能传入0、1、2中的一个数字。
0:表示从文件头开始
1:表示从当前位置开始
2:表示从文件的末尾开始
十二.csv文件的读写
1.csv文件(又叫逗号分隔值或字符分隔值)
1)概念:
其文件以纯文本的形式存储表格数据,单元格之间默认使用逗号分隔,每行数据之间使用换行进行分隔。
2.文件写入
1)需要先调用csv模块
语法: import csv
2)打开文件
语法:file=open('文件名','w',newline=' ') #以写的方式打开,newline=' ' 是将两行数据之间得空行删除。
3)writer方法
语法:writer=csv.writer(file) #传入一个csv文件对象,得到一个CSVWriter对象
4)witerow方法
语法:writer.writerow([数据列表]) #调用CSVWriter对象的writerow方法,实现一行行的写入数据。数据以列表的形式写入。
5)writerows方法
语法:writer.writerows([数据列表],[数据列表],......)#写入几行数据用几个列表,中间以逗号间隔,列表中要元素为字符串型。
3.文件读取
*与csv文件的写操作一样,都需要调用csv模块,然后打开文件,最后关闭文件。
语法:变量名A=csv.reader(file) #调用csv模块的reader方法,得到一个可迭代对象A,可对其进行遍历得到每行数据(*这里的变量名是指使用变量命名格则来命名,A实质上是一个可迭代对象。*)
for row in A:
print(row)
十三.将数据写入内存(StringIO类,BytesIO类)
1.StringIO类
语法:form io import StringIO #导入StringIO类
变量A=StringIO()
A.write(数据内容) #将数据内容写入到内存
print(A.getvalue()) #读取内存中写入的数据内容
A.close() #使用完后要记得关闭
语法2:print('数据内容',file=open('文件名','w'))
语法3:form io import StringIO #导入StringIO类
变量A=StringIO()
print('数据内容',file=A) #将数据内容写入到内存
print(A.getvalue()) #读取内存中写入的数据内容
*写入到内存的数据内容在程序运行结束后,自动销毁*
2.BytesIO类
使用格式与StringIO一样,但BytesIO是二进制写入内存,当写入为中文是,要使用encounde('utf8'),在读取时也是二进制读取,可以使用decode('utf8')进行解码。
for io import BytesIO
b_io=BytesIO()
b_io.write('你好'.encode('utf8'))
print(b_io.getvalue().decode('utf8'))
3.两个类可以同时导入
for io import (StringIO,BytesIO)