ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 概述 文件是计算机中由OS管理的具有名字的存储区域; 在linux系统上,文件被看作是**字节序列**; **非序列化**的数据不能直接存储在文件系统的文件中。 ![](http://images2015.cnblogs.com/blog/1114822/201702/1114822-20170228164022345-1278471804.png) ## 打开文件 ### 语法格式 ~~~ fd = open(filename [,mode=r [,bufsize]]) ~~~ ### 参数说明 **mode** ~~~ 'r'代表输入打开文 'w'代表输出生成并打开文件 'a'代表在文尾追加内容而打开文件 在模式后附加`'+'`表示同时支持输入输出操作 在模式后附加`'b'`表示以二进制方式打开 ~~~ **bufsize** ~~~ 0表示无输出缓存 1表示缓冲一行数据 负数表示使用系统默认设置 正数表示指定缓冲空间大小(byte) ~~~ >[danger]r+: 从头读,从尾写 w+: 从头写,从写后的位置读,什么也读不到 a+: 从尾写,从写后的位置读,什么也读不到 --- ## 文件对象的方法 ~~~ next() # 取出下一行 fileno() # 文件描述符 read(size) # 从文件读多少个**字节** readline() # 每次返回一行(包括行结束符'\n') readlines() # 以`列表`形式返回所有行(包括行结束符'\n') tell() # 返回`指针`在当前文件中的位置 seek(offset[, whence=0]) offset 偏移的字节数 0:从文件头开始偏移 1:从当前位置开始偏移 2:从文件尾部开始偏移 ~~~ ~~~ write(str) # 写入文件,写入的内容必须是字符串 writelines(sequence_of_strings) # 等价于为每个字符串调用一次write()函数 flush() # 将数据从缓冲区写入磁盘 truncate([size]) # 文件截取,默认到当前位置 name # 返回文件名称 closed # 文件状态 是否关闭 close() # 关闭文件 encoding # 编码格式,空为默认格式 mode # 文件打开模式 softspace # 字符串写入时是否有空格分隔, 0表示不使用空格隔离 ~~~ --- ## 使用文件 文件迭代器是最好的 **行** 读取工具,文件默认按行进行迭代 内容是字符串不是对象 文件可以缓冲的并且是可查找 --- ## 文件持久存储 ### 将对象转化的字符串存入文件中 需将对象转化为字符串才能存到文件中 ```python fd = open('fd.txt', 'w') #新建 fd.write('hello text file\n') #写入 fd.readline() # 返回字符串 #读取 ``` ### 用pickle在文件中存储并解析python对象 用pickle存储python原生对象 pickle模块能直接在文件中存储几乎任何python对象 #### pickle写入 ```python D = {'a': 1, 'b': 2} #字典 F = open('fd.pkl', 'wb') #打开文件 import pickle #导入模块 pickle.dump(D, F) #将D写入F F.close() #关闭文件 ``` #### pickle读取 ```python fd = open('fd.pkl', 'rb') E = pickle.load(fd) E fd.close() ``` ### 用struct文件中打包二进制数据的存储与解析 `struct`模块能构造并解析二进制数据,实际上是禁止转换工具。 > 2.7测试通过,3.0未通过 #### 写入 ```python F = open('data.bin', 'wb') import struct data = struct.pack('>i4sh', 7, 'spam', 8) F.write(data) F.close() ``` #### 读取 ```python F = open('data.bin', 'rb') data = F.read() value = struct.unpack('>i4sh', data) value ``` ---- ### 文件上下文管理器 with open() as fd: 内置类型陷阱 1. 赋值生成引用,而不是拷贝 2. 重复能够增加层次深度 3. 留意循环数据结构 4. 不可变类型不可在原处改变 可以通过分片,合并来创建一个新对象 T = (1, 2, 3) T = T[0:2] + (4,) ==> T = (1, 2, 4)