文件操作
常见的文件类型
txt
cvs
json
html
mp4
文件操作的流程
打开
open()
读/写
read()/write()
关闭
close()
序号 | 用途 | 方法 | 功能 |
---|---|---|---|
打开/关闭文件 | f=open(file) | 打开文件 | |
f.close() | 关闭文件 | ||
读写文件内容 | f.read([size]) | 从文件中读取指定的字节数;若未指定,读取所有 | |
f.readline([size]) | 读取整行(第一行),包括“\n” | ||
f.readlines([size]) | 读取所有行,并返回列表 | ||
f.write(str) | 将字符串写入文件,并返回字符串长度 | ||
f.writelines(seq) | 向文件写入一个序列字符串列表,如果需要换行,需自己加入换行符 | ||
f.flush() | 刷新文件缓冲,直接把内容缓冲的数据写入文件 | ||
文件定位 | f.seek(offset) | 设置文件的当前位置,即指针位置 | |
f.tell() | 返回文件的当前位置,即指针位置 |
文件的打开与关闭
内置函数:open(),创建一个file对象,之后才可以用它调用相关的方法。
格式:file_object = open(file,[mode],[encoding=“utf-8”],[buffering])
解释:
file_object open()返回的文件对象
file 要打开的文件
mode 指定模式:只读,写入,追加等等。一般默认只读
encoding 指定文件编码,usually,“utf-8”/“GBK”
buffering 若设置为0,不会有寄存;设为1,访问文件时会寄存行;设为大于1的数,表明是寄存区的缓冲大小;设为负数,则寄存区的缓存区大小为系统默认
模式 | 描述 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
文件对象的属性
属性 | 描述 |
---|---|
f.name | 返回文件的名称 |
f.mode | 返回打开文件的访问模式 |
f.closed | 如果文件已关闭,返回true;否则返回false |
文件的读写
读
f.read([size])
从文件当前指针处读取
传递size,读取指定的字节数
f = open('./data/GreenFlowerPorcelain.txt','r')
print(f.read(4))
print(f.read(4))
1 G
reen
with open('/path/to/file', 'r') as f:
print(f.read())
定位读取
f.tell()
获取文件的当前位置
f.seek()
f.seek(offset,[from])
offset,要移动的字节数
from,指定偏移的参考位置
模块(module)
目的:为了编写方便维护的代码,可以把不同功能的代码分组,保留在不同的文件。
在python中,一个.py文件可以称为一个模块。
即:包含相应功能的函数以及变量,.py则以“.py”为后缀名;模块可以为其他的程序引用,以使用该模块所对应的的函数或者变量
使用模块的优点:
1.提高代码可维护性
2.提高代码复用性
3.可以导入很多功能的模块
标准库模块
第三方模块
自定义模块
4.避免变量名重复(作用域)
导入模块的常用方式
import calendar
print(calendar.__file__)
可寻找模块的路劲
import 模块名称
import 模块名称**
import 模块名称 as 新名称
from 模块名称 import 函数名
区别
import 模块名称 和 import 模块名称 as 新名称
- 会导入这个模块
- 如果我们需要使用某个函数,必须以“模块名称.函数名()”的形式来调用相应的函数(这种方式更有利于程序 的可读性(优先推荐))
- import 模块名称 as 新名称,重新命名导入的模块,通常使模块名称简洁,方便使用
from 模块名 import 函数名(不推荐使用)
- 只导入某一个函数,而不是整个模块
- 可以直接函数名称去调用函数,而无需在函数名称前加模块名称
- 如果我们的程序语句很多,不建议采用该方式(原因:调用很多模块后,可能造成函数名重名,引发报错)
注意:import 语句的对应模块顺序
python标准模块–>第三方模块–>自定义模块
os模块
是python标准库中用于访问操作系统功能的模块
使用os模块提供的接口,能实现跨平台访问
最常见的操作
目录的操作
判断
1.系统操作
os.sep: 用于查看系统路径的分隔符;
Windows系统—> ‘\’
**os.name: ** 显示我们正在使用的平台
Windows系统—>‘nt’
os.getenv(): 读取环境变量
os.getcwd: 获取当前路径
2.目录操作
**os.listdir()?*返回指定目录下的所有文件和目录名,不给定则返回当前路径
目录创建
**os.mkdir(path)?*创建一级目录
**os.makedirs(path)?*创建多级目录,创建多级目录
import os
os.makedirs('main_file/sub_file')
建立main_file文件和子文件sub_file
3.目录/文件删除
**os.rmdir(path)?*删除空目录(一级)
**os.removedirs(path)?*删除空目录(多级)
**os.remove(path)?*删除文件,必须是文件
4.更改路径/更改文件名称
**chdir(path)?*change direction #将当前工作目录更改到指定的工作目录
os.rename(old_name,new_name)#只能到目录更改文件名
5.判断文件
**os.path.exists(path):**判断文件或目录是否存在,存在,true;否则false
**os.path.isdir(path)?*判断是否为目录
**os.path.isfile(path)?*判断是否为文件
6.拓展
**os.path.dirname(path)?*返回文件路径
**os.path.basename(path)?*返回文件名称
**os.path.getsize(name)?*返回文件大小
**os.path.abspath(name)?*返回文件绝对路径
**os.path.join(path,name)?*连接目录与文件名或者目录
注意:会从第一个以”/”开头的参数开始拼接,之前的参数全部丢弃
在上一种情况确保情况下,若出现”./”开头的参数,会从”./”开头的参数的上一个参数开始拼接。
**os.path.split(path)?*将path的目录和文件名隔开,并返回元组
7.查看文件时间
os.path.getmtime(path): 返回文件或者目录的最后修改时间,结果为秒数—>modify
os.path.getatime(path):返回文件或者目录的最后访问时间,结果为秒数
os.path.getctime(path):返回文件或者目录的最后访问时间,结果为秒数
8.time模块
import time
time.sleep(n) #休眠n秒
time.time()#获取当前时间戳
python中,表示时间通常有三种方式:
1.时间戳(timetamp):表示的是从1970.01.01 00:00:00开始按秒计算的偏移量
2.格式化的时间字符串(format string)
python中时间日期格式化符号:
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身
3.结构化的时间(struct_time)----元组,9个元素,(年月日时分秒,一年的第几周,一年的第几天,夏令时)
time模块的常用方法
-时间戳----计算机识别的
-字符串时间—人类可以看的
-结构化时间—对时间的操作
方法 | 描述 |
---|---|
time.localtime([sec]) | 将一个时间戳转化为一个当前时区的struct_time(若未提供参数,当前时间) |
time.gmtime([sec]) | 和localtime()类似,不同的是将一个时间戳转换为UTC时区(0时区)的struct_time |
time.time() | 返回当前时间戳 |
time.mktime(t) | 将time.struct_time转化为时间戳 |
time.sleep(sec) | 线程推迟指定的时间运行 |
time.asctime([t]) | 把表时间的元组或struct_time表示为:‘Sun July 26 09:06:12 2019’ ;若未传参数,默认为time.localtime() |
time.ctime([t]) | 把一个时间戳转化为time.asctime()的形式。若未传参数,默认time.time() |
time.strftime(format[t]) | 把一个代表时间的元组/struct_time (localtime()和gmtime()转化为格式化的字符串;如未传参数,默认为time.localtime() |
time.strptime() | 将结构化字符串转化为struct_time形式 |
结构化时间和时间戳的转换
import time
tp_struct=time.localtime()
print(time.strftime('%Y %m %d %X',tp_struct))
输出:
2019 07 26 09:39:19
字符串时间到结构化时间的转化
time.strptime(时间字符串,字符串对应格式)
import time
print(time.strptime('2019-07-26','%Y-%m-%d'))
输出:
time.struct_time(tm_year=2019, tm_mon=7, tm_mday=26, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=207, tm_isdst=-1)
import time
tp_struct=time.localtime()
print(time.asctime(tp_struct))
time.asctime(结构化时间)
import time
tp_struct=time.localtime()
print(time.asctime(tp_struct))
输出:Fri Jul 26 09:50:09 2019
时间戳和字符串的转化(国际化)
9.datetime模块
相比time来说,datetime模块接口更直观,更容易调用
方法(类) | 描述 |
---|---|
datetime.date | 表示日期(类),常用属性year,month,day |
datetime.time | 表示时间(类),常用属性hour,mintue,second,microsecond |
datetime.datetime | 表示日期 |
datetime.timedelta | 表示时间间隔 |
datetime.tzinfo | 与时区有关的信息 |
import datetime
print(datetime.datetime.now())
输出:
import datetime
print(datetime.datetime.now())
10.sys模块
sys模块是与python解释器交互的一个接口
-处理命令行参数
-在解释器启动后,argv列表包含了传递给脚本的所有参数,列表的第一个元素为脚本自身的名称
11.序列化模块
概念:将一个对象从内存中转换为可存储(字符串类型)或者可传输(bytes)类型的过程
str/bytes—>数据结构(反序列化) 数据结构—>str/bytes(序列化)
为什么要使用序列化?
-持久化数据类型
-跨平台交互使用
-使程序更易维护
json
json格式在各个语言中都可以通用序列化格式。在json中,所有的字符串必须为’’
json类型 | python类型 |
---|---|
{} | dict |
[] | list |
‘string’ | str |
1234.56 | int/float |
true/false | True/False |
null | None |
json的方法和属性
四个功能
-dumps 序列化,转换为字符串
-dump
-loads
-load
如果是元组,序列化强转为字典;如元组作为字典的键,序列化是报错
如果把数据类型直接序列化写入文件中,可以用dump和load方法
import json
dic={'name':'tom','age':18}
with open('dump_json','w') as f:
json.dump(dic,f) #dump方法可以接收一个文件句柄。直接将字典->字符串,写入文件中
pickle
只适用于python
内部中结构化的数据<—>格式pickle<—>bytes类型<—>保存在文件中或基于网络传输
优缺点:
优点:
-支持python中几乎所有的类型
-pickle会把数据类型序列化为bytes类型
缺点:
-只支持python
模块提供四个功能:
-序列化
-dumps
-dump
-反序列化
-loads()
-load()
import pickle
dic={'name':'tom','age':12}
dic_b=pickle.dumps(dic)
print(type(dic_b))
dic_d=pickle.loads(dic_b)
print(type(dic_d))
输出:
<class 'bytes'>
<class 'dict'>
time模块
import time
time.sleep(n) #休眠n秒
time.time()#获取当前时间戳
python中,表示时间通常有三种方式:
1.时间戳(timetamp):表示的是从1970.01.01 00:00:00开始按秒计算的偏移量
2.格式化的时间字符串(format string)
python中时间日期格式化符号:
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身
3.结构化的时间(struct_time)----元组,9个元素,(年月日时分秒,一年的第几周,一年的第几天,夏令时)
time模块的常用方法
-时间戳----计算机识别的
-字符串时间—人类可以看的
-结构化时间—对时间的操作
方法 描述
time.localtime([sec]) 将一个时间戳转化为一个当前时区的struct_time(若未提供参数,当前时间)
time.gmtime([sec]) 和localtime()类似,不同的是将一个时间戳转换为UTC时区(0时区)的struct_time
time.time() 返回当前时间戳
time.mktime(t) 将time.struct_time转化为时间戳
time.sleep(sec) 线程推迟指定的时间运行
time.asctime([t]) 把表时间的元组或struct_time表示为:‘Sun July 26 09:06:12 2019’ ;若未传参数,默认为time.localtime()
time.ctime([t]) 把一个时间戳转化为time.asctime()的形式。若未传参数,默认time.time()
time.strftime(format[t]) 把一个代表时间的元组/struct_time (localtime()和gmtime()转化为格式化的字符串;如未传参数,默认为time.localtime()
time.strptime() 将结构化字符串转化为struct_time形式
结构化时间和时间戳的转换
import time
tp_struct=time.localtime()
print(time.strftime('%Y %m %d %X',tp_struct))
输出:
2019 07 26 09:39:19
字符串时间到结构化时间的转化
time.strptime(时间字符串,字符串对应格式)
import time
print(time.strptime('2019-07-26','%Y-%m-%d'))
输出:
time.struct_time(tm_year=2019, tm_mon=7, tm_mday=26, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=207, tm_isdst=-1)
import time
tp_struct=time.localtime()
print(time.asctime(tp_struct))
time.asctime(结构化时间)
import time
tp_struct=time.localtime()
print(time.asctime(tp_struct))
输出:Fri Jul 26 09:50:09 2019
时间戳和字符串的转化(国际化)
datetime模块
相比time来说,datetime模块接口更直观,更容易调用
方法(类) 描述
datetime.date 表示日期(类),常用属性year,month,day
datetime.time 表示时间(类),常用属性hour,mintue,second,microsecond
datetime.datetime 表示日期
datetime.timedelta 表示时间间隔
datetime.tzinfo 与时区有关的信息
import datetime
print(datetime.datetime.now())
输出:
import datetime
print(datetime.datetime.now())
sys模块
sys模块是与python解释器交互的一个接口
-处理命令行参数
-在解释器启动后,argv列表包含了传递给脚本的所有参数,列表的第一个元素为脚本自身的名称
序列化模块
概念:将一个对象从内存中转换为可存储(字符串类型)或者可传输(bytes)类型的过程
str/bytes—>数据结构(反序列化) 数据结构—>str/bytes(序列化)
为什么要使用序列化?
-持久化数据类型
-跨平台交互使用
-使程序更易维护
json
json格式在各个语言中都可以通用序列化格式。在json中,所有的字符串必须为’’
json类型 python类型
{} dict
[] list
‘string’ str
1234.56 int/float
true/false True/False
null None
json的方法和属性
四个功能
-dumps 序列化,转换为字符串
-dump
-loads
-load
如果是元组,序列化强转为字典;如元组作为字典的键,序列化是报错
如果把数据类型直接序列化写入文件中,可以用dump和load方法
import json
dic={'name':'tom','age':18}
with open('dump_json','w') as f:
json.dump(dic,f) #dump方法可以接收一个文件句柄。直接将字典->字符串,写入文件中
pickle
只适用于python
内部中结构化的数据<—>格式pickle<—>bytes类型<—>保存在文件中或基于网络传输
优缺点:
优点:
-支持python中几乎所有的类型
-pickle会把数据类型序列化为bytes类型
缺点:
-只支持python
模块提供四个功能:
-序列化
-dumps
-dump
-反序列化
-loads()
-load()
import pickle
dic={'name':'tom','age':12}
dic_b=pickle.dumps(dic)
print(type(dic_b))
dic_d=pickle.loads(dic_b)
print(type(dic_d))
输出:
<class 'bytes'>
<class 'dict'>
包
包是通过使用’.模块名’来组织python模块名称空间的方式,具体而言包就是一个包含__init__.py文件的文件夹
目的:用文件夹将文件、模块组织起来
注意:
~python3中即使包中没有__init__.py也可以使用
~python2中没有会报错
创建包的目的不是为了运行,而是为了被导入使用。
包的本质还是模块
注意:
-使用时,import 导入,若导入带点的,点的左边一定是包名
-import导入文件时,产生名称空间的名字源于文件,import包,名称空间同样源于文件(包)init.py,导入包的本质导入它
-单独导入包时,不会导入该包所包含的所有子模块
-用from导入时,import后不包含点
-from . import … 表明import后面的是被调用而不能被运行
-from school.api import * #*代表___all___里的内容
字符编码
python主要识别文件内容,而不是关心拓展名----解释器
字符–>机器翻译–>二进制
字符如何对应特定数字的标准,这个标准就是字符编码
ASCII
GBK
Unicode
UTF-8
对于英文字符来说,1bytes
对于中文,3bytes
对于内存而言都会基于Unicoude转换,再转回来