python文件操作
python文件操作
文件操作是编程中必不可少的,配置文件,数据存储都是对文件操作。
一、python内置函数open()
1、语法格式:
open(file, mode=’r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
此函数能够打开一个文件并返回文件对象。如果文件不能打开,则抛出操作系统异常OSError
2、参数
- 参数file是一个类似路径的对象,可以是字符串或数组表示的文件名称,文件名称是要打开文件的路径(绝对路径或者相对路径)。
- 参数mode是指明打开文件的模式。
‘r’:只读模式打开文件,不可写入,此为参数默认值。
‘w’:写入模式打开文件,并且清空打开的文件。
‘x’:独占模式打开文件,如果文件已经打开,则会打开失败。
‘a’:写入模式打开文件,如果文件存在,则在文件末尾追加内容。
‘b’:二进制模式,例如读取声音、图像文件。
‘t’:文本模式,此为参数默认值。
‘+’:打开文件进行更新,可以读取或写入。
- 参数buffering为可选参数,用于缓冲区的策略选择。
-
参数encoding为文件编码,仅适用于文本文件。
- 参数errors为编解码错误时进行的处理,但不能在二进制模式下使用。
-
参数newline为文本模式指定下一行的结束符。可以是None,”,\n,\r,\r\n等。
- 参数closefd用于传入的文件句柄,当退出文件时,不关闭文件句柄。
-
参数opener用于实现自己定义打开文件方式。
二、文件的打开和关闭
#在Windows操作系统下打开文件,默认使用GBK编码打开, #文本文件的写入utf8编码格式,打开也需要用utf8编码格式。 file=open('xx.txt',encoding='utf8') #相对路径 file.read() #打开文件 file.close() #关闭文件
三、文件路径
绝对路径:从电脑盘符开始的路径
在windows系统里,文件夹之间用 \ 分隔
在非windows系统里,文件夹之间用 / 分隔
相对路径:当前文件所在的文件夹开始的路径
'xx.txt'(或 ./xx.txt):当前文件夹
'demo/xx.txt':下级文件夹
'../xx.txt':上级文件夹
路径书写的三种方式:1、' \\ ' 2、r ' \ ' 3、' / ' ( 推荐使用 )
四、文件打开方式
- ' r ':只读模式,默认,打开文件后,只能读取,不能写入。如文件不存在,会报错。
- ' w ':写入模式,打开文件后,只能写入,不能读取。如果文件存在会覆盖文件,如果不存在,会创建文件。
-
' b ':以二进制形式打开文件。
- ' a ':追加模式,会在最后追加内容。
-
' r+ ',' w+ ':可读可写,很少用
file=open('xx.txt','rb') print(file.read()) #二进制读取 b'\xe5\xa5\xbd\xe5\xa5\xbd\xe5\xad' file1=open('xx.txt','wb') file1.write('好好学习'.encode('utf8')) #二进制写入,转成文本
五、文件读取方式
file=open('aa.txt',encoding='utf8') file.read() #读取所有数据 file.readline() #读取一行 file.readlines() #读取所有数据,存入列表,每行为一个列表项 file.read(n) #读取n的长度
六、文件拷贝
import os old_file_name=input('请输入文件名:') if os.path.isfile(old_file_name): names=old_file_name.rpartition('.') new_file_name=names[0]+'.bak.'+names[2] old_file=open(old_file_name,'rb') new_file=open(new_file_name,'wb') while True: content=old_file.read(1024) new_file.write(content) if not content: break new_file.close() old_file.close()
七、将数据写入内存
将数据写入内存涉及到类StringIO
from io import StringIO s_io=StringIO() print('hello ',file=s_io,end='') #控制台不显示 print('world!',file=s_io) #控制台不显示 print(s_io.getvalue()) #控制台输出'hello world!' s_io.close()
八、json字符串
文件的write,只能写入字符串或二进制,字典、列表、数字都不能写入到文件里。
将数据转化为字符串有两种方式:1、repr/str 方法 2、使用json模块
json本质就是字符串,区别在于json里用双引号表示字符串。
列表的序列化dumps()
import json names=['Jack','Rose','Merry'] name_json=json.dumps(names) file=open('names.txt','w',encoding='utf8') file.write(name_json) file.close()
列表的序列化dump()
import json names=['Jack','Rose','Merry'] file=open('names.txt','w',encoding='utf8') json.dump(names,file) file.close()
反序列化成字典loads()
import json x='{"name":"Rose","age":18}' #json字符串 p=json.loads(x)
反序列化成字典load():读取一个文件,并把文件里的json字符串加载为一个对象
import json file=open('names.txt','r',encoding='utf8') #names.txt {"name":"Jack"} y=json.load(file) file.close()
九、pickle的使用
将python里的对象转化为二进制
序列化:dumps()
反序列化:loads()
import pickle num1=['zhangsan','lisi','wangwu'] p=pickle.dumps(num1) #列表序列化成二进制 file=open('name1.txt','wb') file.write(p) #写入序列(二进制) file.close() file1=open('name1.txt','rb') q=file1.read() r=pickle.loads(q) #发序列化列表 print(r)
序列化dump()
反序列化load()
import pickle num1=['zhangsan','lisi','wangwu'] file3=open('name3.txt','wb') pickle.dump(num1,file3) #二进制序列化之name3.txt file3.close() file4=open('name3.txt','rb') y=pickle.load(file4) #二进制加载到Python数据 file4.close()
pickle:用来原封不动的转换成二进制,但是只能在Python里识别。
json:只能保存部分信息,作用是用来在不同的平台里传输数据。json里存储的数据是基本的数据类型。