python中文件操作

1 文件
1.1 定义
          文件是用于数据存储的单位,通常用于长期存储数据


1.2 文件分类
linux/unix下文件可分为普通文件和设备文件


   普通文件是由文件名和文件中的数据两部分组成的(通常文件名和文件数据是分开的)


1.3 文件的打开和关闭
文件需要在使用时先打开才能读写


在不需要读写文件时,应及时关闭文件以释放系统资源(内存和硬盘)


任何操作系统,打开文件数有最大限制


1.3.1 打开文件函数
open(file,mode=’r’) 


用于打开一个文件,返回此文件的操作对象,如果打开失败会触发错误,抛出异常 FileNotFoundError


1.3.2 打开文件的模式mode
   ‘r’ 以只读方式打开文件(默认)


   ‘w’ 以只写方式打开文件,删除原有文件内容(如果文件不存在,则创建文件并以只写方式打开文件),打开之后的文件可以一直写入,直到关闭


   ‘x’ 创建 一个新的文件,并以写模式打开文件,如果文件存在则会产生FileExistsError错误


   ‘a’以追加写方式打开一个文件,如果有原有文件则追加到原有文件末尾


   ‘b’用二进制模式打开


   ‘t’用文本文件模式打开(默认)


   ‘+’为更新内容打开一个磁盘文件(可读可写)


注:缺省模式是‘rt’(reading text)


   ‘w+b’可以实现二进制的随机读写


‘r+b’以二进制只读形式打开文件,打开文件时不会清空文件内容


‘r+’ 以文本模式打开文件,打开文件时不清空文件内容,可以对文件进行写操作


1.3.3 关闭文件方法:
   F.close()    #关闭文件,释放系统资源


1.4 文本文件常用方法:
f.readline()


读取一行数据,如果到达文件末尾则返回空行,字符串包含行尾


f.readlines([n])


返回每行字符串的列表,n代表最大字符数(字节数),一般不采取此种方法


f.write(x)


将数据(字符/字节)写入文件中


f.writelines(lines)


把字符列表写入文件,列表是一个元素或者多个元素


f.flush()


把写入文件对象的缓存内容写入磁盘


(磁盘存数据是按照4k空间存数据,每次哪怕写一个字符也是占用4k空间,所以要用flush方法,把一堆东西写入磁盘)


1.4.1 读文件示例
   date.txt文件


张某  1333333333333


李某  155555555555


王某  130888889999


f = open('date.txt')


while True:


    s = f.readline().strip()


    if s == '':


        break


    l = s.split("  ")


    print('姓名:',l[0],'电话:',l[1])


f.close()


执行结果


姓名:张某电话: 1333333333333


姓名:李某电话: 155555555555


姓名:王某电话: 130888889999


f = open('date.txt')


 


L = f.readlines()


for x in L:


    s = x.strip()


    l = s.split()


    print('姓名:',l[0],'电话:',l[1])


f.close()


执行结果


姓名:张某电话: 1333333333333


姓名:李某电话: 155555555555


姓名:王某电话: 130888889999


2 二进制文件
   bytes类型 和 bytearray类型


   二者可以相互转换


   汉字编码


2.1 bytes类型
2.1.1作用:
以字节为单位存储数据,每个字节的值为0~255


字节串可以看做是序列


字节串是不可变的


2.1.2 bytes常量的表达方式:
          bytes是ASCII编码


b’’  空字节串


b’ABCD’ 有四个字节的字节串


b’\x41\x42’ 有2个字节的字节串(ASCII显示为我们看的懂得)


2.2 算术运算
+,+=,*,*=


2.3 比较,in/not inindex slice运算
<,>,<=,>=,==,!=


b”\xfe” < b”\xFF” 大小写无关,且通常都是十六进制,方便


in/not in


index


slice


>>> B = b'ABCD'


>>> b'D' in B


True


注意 b开头


‘\0’ 表示十进制的0


2.4 bytes相关的函数:
len(x)


max(x)


min(x)


sum(x)


any(x)


all(x)


2.5 创建字节串的函数
bytes() 创建空的字节串


bytes(整数)


bytes(整型可迭代对象)


bytes(字符串,encoding=‘utf-8’)


 


>>> bytes()


b''


>>> bytes(10)


b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'


>>> bytes([0x41,0x62,99,100])


b'Abcd'


>>> bytes(range(65,65+26))


b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'


>>> bytes('ABCD','utf-8')


b'ABCD'


>>> bytes('ABC中','utf-8')


b'ABC\xe4\xb8\xad'


2.6 bytes和str的转换
2.6.1  str--------> bytes 
   str.encode(encoding=’utf-8’)方法来转换


  


>>> string = 'ABC中'


>>> B = string.encode(encoding='utf-8')


>>> B


b'ABC\xe4\xb8\xad'


2.6.2 bytes------------>str
B.decode(encoding=’utf-8’)


>>> B=b'ABC\xe4\xb8\xad'


>>> B.decode(encoding='utf-8')


'ABC中'


3 二进制文件的读写
3.1 定义
文件中以字节为单位存储,不以换行符(\n)为单位分隔内容的文件


3.2 二进制文件操作方法
   F代表文件


F.read(size=-1) 从一个文件流中最多读取size个字符


          方法的返回类型:


                 对于文本文件,返回字符串


                 对于二进制文件,返回字节串(字节序列)


F.write(字符串/字节串) 写入一些数据到文件流中,返回写入的字节数(字符数)(返回字节数/字符数是为了防止部分写入)


F.tell() 返回当前文件流的绝对位置


F.seek(cookie,whence=0) 改变数据流的位置,返回新的绝对值


          F.seek(‘偏移量’,whence=相对位置)


                 偏移量:


大于0的数代表向文件尾方向移动


小于0代表向文件头移动


                        相对位置:


                               0代表从文件头开始偏移


                               1代表从当前位置开始偏移


                               2代表从文件尾开始偏移


  


mytell.bin文件中


ABCDEFGHIJ1234567890


 


f = open('mytell.bin','rb')


print('f.tell返回',f.tell())


 


f.seek(10,0)     #从头开始,向右偏移10个位置


f.seek(5,1)     #从当前位置向右偏移5个位置


f.seek(-10,2)   #从文件的结尾向头偏移10个位置


b = f.read(5)


 


print(b)


 


print('f.tell返回',f.tell())


f.close()


执行结果


f.tell返回 0


b'12345'


f.tell返回 15


 


F.readable() 判断这个文件是否可读,可读返回True


F.writable()  判断这个文件是否可写  可写返回True


 


3.3 示例
示例1


f = open('stu_infos.txt', 'r')


s = f.read()


 


print(s)


print('length:',len(s))


 


f.close()


 


name:bob age:30 score:90


name:lucy age:25 score:99


length: 50


 


示例2


f = open('stu_infos.txt', 'rb')


s = f.read()


 


print(s)


print('length:',len(s))


 


f.close()


 


# b'name:bob age:30 score:90\nname:lucy age:25 score:99'


# length: 50


4 bytearray类型
bytes类型为不可变类型


bytearray类型为可变的数据类型


4.1 操作
+,+=,*,*=


<,>,<=,>=,!=,==


in /not in


index


slice


 


4.2 bytearray方法
增 append


删 remove  clear


改slice index


查find


反转  reverse


bytearray转 str decode


B.append(n)


追加一个字节(n为0~255的整数)


B.remove(value)


删除第一次出现的字节,如果没有出现,则产生valueError错误


B.clear()


清空


B.find(sub[,start[,end]])


  bytearr.find(bytearray(b’3c’))


查找sub子字节


B.reverse()


字节顺序进行反转


B.decode(encoding=’utf-8’)


将字节码转换给字符串


4.3 创建bytearray的函数
   bytearray()  创建空的字节串


bytearray (整数)


bytearray (整型可迭代对象)


bytearray(字符串,encoding=‘utf-8’)


>>> bytearray()


bytearray(b'')


bytearray(10)


bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')


>>> bytearray(range(65,91))


bytearray(b'ABCDEFGHIJKLMNOPQRSTUVWXYZ')


bytearray("ABCD中文",'utf-8')


bytearray(b'ABCD\xe4\xb8\xad\xe6\x96\x87')


4.4 课上练习
有一个bytearray字节序列:ba = bytearray(b'a1b2c3d4')


如何得到字符串‘1234’ 和 ‘abcd’


将上述bytearray转为bytearray(b'A1B2C3D4')


ba = bytearray(b'a1b2c3d4')


 


byte1 = ba[1::2]


byte2 = ba[0::2]


 


string1 = byte1.decode(encoding='utf-8')


string2 = byte2.decode(encoding='utf-8')


ba[0::2]= bytearray(b'ABCD')


 


print(string1)


print(string2)


print(ba)


执行结果


1234


abcd


bytearray(b'A1B2C3D4')


5 标准输入输出文件
sys.stdin


sys.stdout


sys.stderr


一个标准输入文件,两个标准输出文件


import sys


 


sys.stdout.write('你好')


执行结果


你好

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值