python之文件操作

一、文件操作

一、文件操作

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 #
View Code

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中同一将回车符转换为
原文地址:https://www.cnblogs.com/tengjiang/p/9251562.html