首页 > 编程语言 > 详细

python0.11-----文件/编码和解码/pickle模块

时间:2018-06-21 00:57:18      阅读:75      评论:0      收藏:0      [点我收藏+]

标签:enc   读写   obj   utf-8   ros   microsoft   网络数   报错   ror   

文件:
python中的文件读写和c兼容,磁盘上的读写由操作系统完成,一般的程序无法操作磁盘。文件读写是通过操作系统对象完成,该对象称为文件描述符。

文件的操作分两种:

1.打开文件
open(path,flag[,encoding][,errors])
path:要打开文件的路径。
flag:打开方式。
  r:以只读的方式打开文件。文件的(描述符)指针放在文件开头。
  rb:以二进制格式打开一个文件用于只读,文件描述符放在文件开头。
  r+:打开一个文件用于读写,文件描述符放到开头。
  w:打开文件只用于写入。若文件已经存在则会被覆盖,若文件本身不存在,则会创建新文件。
  wb:打开一个文件只用于写入二进制。若文件已经存在则会被覆盖,若文件本身不存在,则会创建新文件。
  w+:打开一个文件用于读写。若文件已经存在则会被覆盖,若文件本身不存在,则会创建新文件。
  a:打开一个文件用于追加。如果文件存在,文件描述符将会放到文件末尾。若文件本身不存在,则会创建新文件。
  a+:打开一个文件用于读写。如果文件存在,文件描述符将会放到文件末尾。若文件本身不存在,则会创建新文件。注意:因为文件描述符放在文件末尾,因此,读文件读不出来什么东西。

encoding:编码方式。
errors:错误处理方式,‘ignore‘表示若编码和解码方式不一致不会报错,‘strict‘表示若编码和解码方式不一致会报错。
注意:网络数据是以二进制进行传输的。因此存在‘wb‘,‘rb‘。

例子:
f=open(r‘C:\Users\yuliang\Desktop\Project\lrc.txt‘,‘r‘,encoding=‘utf-8‘,errors=‘ignore‘)
注意:f代表的是已经打开的文件。
2.1 从文件中读出内容:
#1.读取文件的全部内容:str1=f.read(),此时文件描述符已经来到了文件的末尾。
注意:若文件很大,有1G以上,那么文件内容全部存到内存里面去了,这样显然不好。
#2.读取指定的内容:str1=f.read(num),读取文件描述符后面的num个字符数,此时文件描述符向右移动num个字符位置。
#3.读取整行,包括‘\n‘字符:str1=f.readline(),文件描述符放到下一行的行首。另外,str1=f.readline(num)跟str1=f.read(num)功能一样,不过很少用。
#4.读取所有行并返回列表:list1=f.readlines()。文件描述符放到文件末尾。另外,list=f.readlines(num),若给定数字大于0,就读取就实际size的行数。不过很少用。
#5.修改描述符的位置:f.seek(num)。表示将文件描述符放在离文件开头num个字符的位置。

2.2 向文件写入内容:
#1 将信息str1写入缓冲区 f1.write(str1)
#2刷新缓冲区
f1.flush() :直接将缓冲区的内容立即写入文件。若不加这个语句,则文件在关闭的时候才将缓冲区的内容写入到内存里面区。若缓冲区满了,也会自动将缓冲取内容立即写入文件。

3.关闭文件
f.close

#一个完整的过程
try:
  f1=open(path,‘r‘)
  print(f1.read())
finally:
  if f1:    #若f1正常打开,则关闭,否则无须关闭。

    fi.close

#更简单的读取方式:
with open(path,‘r‘) as f1:
  print(f1.read())
不管文件打开成功或者失败,with最后都可以自动将文件给关上。

#写内容的简单方式,不用关闭,不用刷新
with open(path,‘a‘) as f1:
  f1.write(str)

 

编码和解码:
with open(path,‘wb‘,encoding=‘utf-8‘) as f1:       #wb表示将存入文件的数据应该为字节类型。
  f1.write(str1.encoding(‘utf-8‘))            #将字符串str1用utf-8格式编码成为二进制模式并写入文件。若不编码,则报错:a bytes-like object is required, not ‘str‘。


with open(path,‘rb‘) as f1:
  date=f1.read()    #读出来的是二进制文件,date是字节类型class ‘bytes‘。
  newDate=date.decode(‘utf-8‘)   #所以要将字节类型以utf-8格式解码为字符串类型。若不解码,则无法得到正常的字符串。

注意:若文件保存的编码格式是utf-8,那么用gbk的格式读取内容将会报错: ‘gbk‘ codec can‘t decode byte 0xae in position 40: illegal multibyte sequence。
errors=‘ingnore‘会忽略打开文件的编码解码不一致错误,无能忽略二进制文件编码时产生的错误。

 

pickle模块:数据持久性模块。它可以把list,tuple,dict,set数据写入文件。

使用pickle模块的方法:
#打开文件:f1=open(path,‘wb‘)
#使用pickle模块存储数据:pickle.dump(data,f1)
#关闭文件:f1.close()
#打开文件:f2=open(path,‘rb‘)
#读取pickle文件内容:pickle.load(f2)
#关闭文件:f2.close()
注意:因为dump和load会将将其他数据类型转化为二进制的字节类,因此,文件的读写方式应该是‘wb‘和‘rb‘形式。若读方式不是二进制的形式,则会报错:write() argument must be str, not bytes

python0.11-----文件/编码和解码/pickle模块

标签:enc   读写   obj   utf-8   ros   microsoft   网络数   报错   ror   

原文:https://www.cnblogs.com/yulianggo/p/9206572.html

(0)
(0)
   
举报
评论 一句话评论(0
0条  
登录后才能评论!
© 2014 bubuko.com 版权所有 鲁ICP备09046678号-4
打开技术之扣,分享程序人生!
             

鲁公网安备 37021202000002号