1.概述
(1)文件标识
意义:找到唯一确定文件
组成:文件路径,文件名主干,文件扩展名
操作系统以文件为单位进行管理
(2)文件类型
文本文件:专门存储文本字符数据
二进制文件:不能直接使用文字处理程序正常读写,必须先了解其结构和序列化规则,再设计正确的反序列化规则
划分基于数据逻辑存储结构而非物理存储结构,在物理层面都以二进制形式存储
(3)标准文件
import sys
file = sys.stdout
file.write("hello")
2.文件基本操作
(1) 打开
open()
open(file, mode='r', buffering=-1)
打开模式 | 名称 | 描述 | |
r/rb | 只读模式 | 以只读的形式打开文本文件/二进制文件,若文件不存在或无法找到,文件打开失败 | |
w/wb | 只写模式 | 以只写的形式打开文本文件/二进制文件,若文件已存在,则重写文件,否则创建新文件 | |
a/ab | 追加模式 | 以只写的形式打开文本文件/二进制文件,只允许在该文件末尾追加数据,若文件不存在,则创建新文件 | |
r+/rb+ | 读取(更新)模式 | 以读/写的形式打开文本文件/二进制文件,若文件不存在,文件打开失败 | |
w+/wb+ | 写入(更新)模式 | 以读/写的形式打开文本文件/二进制文件,若文件已存在,则重写文件 | |
a+/ab+ | 追加(更新)模式 | 以读/写的形式打开文本/二进制文件,只允许在文件末尾添加数据,若文件不存在,则创建新文件 |
open(file, mode='r', buffering=-1)
file1 = open('E:\\a.txt') # 以只读方式打开E盘的文本文件a.txt
file2 = open('b.txt', 'w') # 以只写方式打开当前目录的文本文件b.txt
file3 = open('c.txt', 'w+') # 以读/写方式打开文本文件c.txt
file4 = open('d.txt', 'wb+') # 以读/写方式打开二进制文件d.txt
若待打开的文件不存在,文件打开失败,程序会抛出异常,并打印错误信息:
------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
<ipython-input-5-23b0bb5a2ffc> in <module>
----> 1 file1 = open("b.txt")
FileNotFoundError: [Errno 2] No such file or directory: 'b.txt'
(2)关闭
内置方法:close()
file.close()
自动关闭:with()
with open('a.txt') as f:
pass
(3)读取
指定字节:read()
read(n=-1)
with open('file.txt', mode='r') as f:
print(f.read(2)) # 读取两个字节的数据
print(f.read()) # 读取剩余的全部数据
指定一行:readline()
readline()
with open('file.txt', mode='r', encoding='utf-8') as f:
print(f.readline())
print(f.readline())
多行:readlines()
readlines(hint=-1)
with open('file.txt', mode='r', encoding='utf-8') as f:
print(f.readlines()) # 使用readlines()方法读取数据
(4)写
指定字符串:write()
write(data)
string = "Here we are all, by day; by night." # 字符串
with open('write_file.txt', mode='w', encoding='utf-8') as f:
size = f.write(string) # 写入字符串
print(size) # 打印字节数
行列表:writelines()
writelines(lines)
string = "Here we are all, by day;\nby night we're hurl'd By dreams,
each one into a several world."
with open('write_file.txt', mode='w', encoding='utf-8') as f:
f.writelines(string)
(5)定位读写
操作是连续的,每个文件对象都有“文件读写位置”属性,该属性为0则在文件首部
tell():获取当前读写位置
with open('file.txt') as f:
print(f.tell()) # 获取文件读写位置
print(f.read(5)) # 利用read()方法移动文件读写位置
print(f.tell()) # 再次获取文件读写位置
seek():控制文件读写位置
seek(offset, from)
with open('file.txt') as f:
print(f.tell()) # 获取文件读写位置
print(f.read(5)) # 利用read()方法移动文件读写位置
print(f.tell()) # 再次获取文件读写位置
offset:表示偏移量,即读写位置需要移动的字节数
from:用于指定文件的读写位置,该参数的取值为0(文件开头)、1(使用当前读写位置)、2(文件末尾)
相对当前读写位置或文件末尾进行位移操作,需以二进制形式打开文件
with open('file.txt','rb') as f:
f.seek(5,0)
f.seek(3,1)
3.文件与目录管理
4.数据维度与数据格式化
(1)数据存储
一维数据线性排列,用特殊字符分隔
注意:
同一或同组文件使用同一分隔符
分隔数据的分隔符不应出现在数据中
分隔符为英文半角,不使用中文符号
CSV(字符分隔值)格式:
纯文本存储
每一行对应一条数据
每条记录由一个或多个字段组成
字段之间用逗号(英文、半角)分隔
(2)数据读取
csv_file = open('score.csv')
lines = []
for line in csv_file:
line = line.replace('\n','')
lines.append(line.split(','))
print(lines)
csv_file.close()
(3)数据写入
(4)格式化
规则 | 例子 |
数据存储在键值对(key:value)中 | “姓名”: “张华” |
数据的字段由逗号分隔 | “张华”, “语文”: “116” |
一个花括号保存一个JSON对象 | {“姓名”: “张华”, “语文”: “116”} |
一个方括号保存一个数组 | [{“姓名”: “张华”, “语文”: “116”}] |
(5)json
函数 | 功能 |
dumps() | 对Python对象进行转码,将其转化为JSON字符串 |
loads() | 将JSON字符串解析为Python对象 |
Python对象 | JSON数据 |
dict | object |
list,tuple | array |
str,unicode | string |
int,long,float | number |
True | true |
False | false |
None | null |