一、文件操作
一、文件操作
1、文件操作基本步骤
1 #文件操作基本流程 2 #1、打开文件,得到文件句柄并赋值给一个变量 3 #2、通过句柄对文件进行操作 4 #3、关闭文件 5 6 f = open('test1',encoding='utf-8') 7 data = f.read() 8 print(data)
9 f.close()
备注:
(1)、打开文件的时候写的相对路径:应为在同一文件级别中;
(2)、在打开文件没有指定编码格式,就会报错;
原因分析:a、保存文件到硬盘上时,是将字符保存到硬盘上为二进制,字符到二进制中间有编码格式:utf-8,gbk,unicode等编码格式;
b、经过查看文件test1的编码格式:直接在pycharm中打开test1文件,编码格式为utf-8格式,在pycharm右下角可以查看文件的编码格式;
c、pycharm默认的编码格式就是utf-8,那为什么还会报错“gbk不能解码呢”?因为在打开文件文件的时候,默认oper命令读取的是操作系统的编码格式,即我现在的电脑是win10,编码格式为GBK,所以出现这种报错
d、在下面代码中,还有一个问题:就是在文件操作完成后,没有关闭文件,释放硬件资源:f.close()
1 f = open('test1') 2 data = f.read() 3 print(data) 4 #打印消息: 5 UnicodeDecodeError: 'gbk' codec can't decode byte 0x82 in position 80: illegal multibyte sequence
2、文件打开方式:文件打开的时候对文件的操作方式
(1)、r:只读;
1 f = open('陈粒',encoding = 'utf-8') 2 data = f.read() 3 print(data) 4 f.close() 5 #如果没有写文件打开方式默认为读:r
a、readable:判断是否可读
1 f = open('陈粒','r',encoding = 'utf-8') 2 data = f.read() #将文件所有内容都读取出来 3 print(data) 4 print(f.readable()) #True 5 print(f.writable()) #False 6 f.close()
b、readline
1 f = open('陈粒','r',encoding = 'utf-8') 2 for i in range(1,6): 3 print( '这是第%d行:' %i,f.readline()) 4 i =i+1 5 """ Q1、这是打印结果:为什么在第5行打印结果为空? 6 这是第1行: f = open('陈粒',encoding = 'utf-8') 7 8 这是第2行: data = f.read() 9 10 这是第3行: print(data) 11 12 这是第4行: f.close() 13 14 这是第5行: 15 """ 16 #因为我陈粒这个文件总共只有4行字符,当读取到第4行的时候,游标已经到文件 17 #末尾,再读取第5行的时候,就读取的是空值 18 #Q2、为什么打印结果有换了行的? 19 #
c、readlines
1 f = open('陈粒',encoding = 'utf-8') 2 print(f.readlines()) 3 #["f = open('陈粒',encoding = 'utf-8') ", 'data = f.read() ', 'print(data) ', 'f.close() ']
(2)、w:只写;
如果文件存在,直接清空文件,然后在写;如果文件不存在,新建文件
1 f = open('陈粒','w',encoding='utf-8') 2 f.write('11111') 3 f.write('22222') 4 f.write('11111 ') 5 f.write('2222 ') 6 f.write('11111 2222 ') 7 print(f.writable()) 8 f.writelines(['2222 ','12222345 ']) #文件只能写入字符串
(3)、a:只追加;
1 f = open('陈粒','a',encoding='utf-8') 2 print(f.readable()) #f.read() 3 f.write('追加的一行') 4 f.close() 5 e = open('陈粒','r',encoding='utf-8') 6 print(e.read())
(4)、其他模式
a、文件修改:文件其实没有修改的说法,都是覆盖文件
将文件从硬盘上读到内存中,然后在内存中修改,然后将内存中修改的二进制覆盖到到源文件中
1 src_f = open('陈粒','r',encoding ='utf-8') 2 data = src_f.readlines() #将读取到的内容赋值为data变量 3 for i in data: 4 hs= 1 5 print( '数据类型为:'+str(type(i)),i,end='') 6 # print(type(i)) 7 src_f.close() 8 # 然后将s 9 dst_f = open('陈粒1','w',encoding='utf-8') 10 dst_f.writelines(data) #在dst_f句柄中将内存中的变量data的值写入到文件陈粒1中 11 dst_f.close()
b、with as方式可以实现软件自动关闭打开的文件
1 with open('test','w') as f: 2 f.write('11111 ') 3 with open('test','a') as e: 4 e.writelines(['Who is that ','This is zhangsan ']) 5 with open('test','r') as src_f, 6 open('test1','w') as dst_f: 7 #['11111 ', 'Who is that ', 'This is zhangsan '] <class 'list'> 8 data = src_f.readlines() 9 print(data,type(data)) 10 dst_f.writelines(data[1:3]) #Who is that This is zhangsan
c、r+:可读可写
1 f = open('test1','r+',encoding ='utf-8') 2 pd_read = f.readable() 3 pd_write = f.writable() 4 print(pd_write,pd_read) 5 if pd_write is True: 6 f.writelines(['My name is zhangsan', 'I like chichen']) 7 if pd_read is True: 8 data = f.readlines() 9 e = open('test2','w',encoding = 'utf-8') 10 e.writelines(data)
d、w+:可读可写
e、a+:可读可写
3、第二种文件处理方式:b模式
备注:为什么要用b模式处理文件:
文件不只是只有文本模式‘’,
可以跨平台
b模式对于linux没有用,因为linux系统默认的就是b模式
(1)、rb:以字节的方式读取文件
1 # f = open('txt','rb',encoding='utf-8') 2 # #ValueError: binary mode doesn't take an encoding argument 3 #字节模式不需要写编码方式 4 # data= f.read() 5 # print(data) 6 zhuijia = open('test2','a',encoding='utf-8') 7 zhuijia.writelines(['我叫张三','来自重庆']) 8 zhuijia.close() 9 f = open('test2','rb') 10 data = f.read() 11 #b'Who is that This is zhangsan My name is zhangsanI like chichen 12 # xe6x88x91xe5x8fxabxe5xbcxa0xe4xb8x89xe6x9dxa5xe8x87xaaxe9x87x8dxe5xbax86' 13 #X表示16进制 14 #在windows平台中国,回车符是 ;linux/unix平台中回车是/n 15 #我的电脑操作系统为win10,所以以字节方式打开时,打印的结果为 16 print(data) 17 #使用utf-8进行解码结果:My name is zhangsanI like chichen我叫张三来自重庆我叫张三来自重庆 18 print(data.decode('utf-8'))
(2)、wb模式
1 f = open('test3','wb') 2 #TypeError: a bytes-like object is required, not 'str' 3 # f.write('11111 ') 4 f.write(bytes('11111 ',encoding = 'utf-8')) 5 f.write('张三'.encode('utf-8'))
(3)、ab模式
f = open('test3','ab') #TypeError: a bytes-like object is required, not 'str' # f.write('11111 ') f.write(bytes('11111 ',encoding = 'utf-8')) f.write('张三'.encode('utf-8'))
4、文件操作的其他方法
1 f = open('a.txt','r',encoding='utf-8') 2 # print(f.closed) #False 3 print(f.encoding) #utf-8打印文件的打开的编码方式 4 #在不知道文件编码格式的时候可以采用latin-1格式,可以最大限度读取数据 5 f.flush() #刷新 6 f.name #文件名 7 print(f.tell()) #光标所在位置 8 f.readline() 9 print(f.tell())
5、文件内光标的移动
a、文件打开方式为文本模式时,代表读取三个字符;
b、文件打开方式为b模式时,代表读取三个字节;
c、其余的文件内光标移动都是以字节为单位如:seek、tell、truncate
d、seek有三种移动方式:0/1/2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的。
f = open("text_1","rb",encoding="utf-8") ##seek必须要以b的模式 f.seek(3,0) #0模式表示从文件的开始 print(f.tell()) ###3 f.seek(3,1) #1模式表示从上次光标停留的位置开始 f.seek(-3,2) ##2模式表示从文件末尾进行seek
e、truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a+等模式下测试效果
备注:newline=‘’的用法:读取文件中真实的换行符号
1 # f = open('a.txt','r',encoding='utf-8',newline='' ) 2 # print(f.readlines()) ##['你好 ', '11233 ', '4497798'] 3 f = open('a.txt','r',encoding='utf-8') 4 print(f.readlines())##['你好 ', '11233 ', '4497798'] 5 #在Python中同一将回车符转换为