1. 文件与文件系统
-
打开文件
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
file
: 必需,文件路径(相对或者绝对路径)。mode
: 可选,文件打开模式buffering
: 设置缓冲encoding
: 一般使用utf8errors
: 报错级别newline
: 区分换行符
打开模式 | 执行操作 |
---|---|
'r' | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
'w' | 打开一个文件只用于写入。 如果该文件已存在则打开文件,并从开头开始编辑。 即原有内容会被删除。 如果该文件不存在,创建新文件。 |
'x' | 写模式,新建一个文件,如果该文件已存在则会报错。 |
'a' | 追加模式,打开一个文件用于追加。 如果该文件已存在,文件指针将会放在文件的结尾。 也就是说,新的内容将会被写入到已有内容之后。 如果该文件不存在,创建新文件进行写入。 |
'b' | 以二进制模式打开文件。一般用于非文本文件,如:图片。 |
't' | 以文本模式打开(默认)。一般用于文本文件,如:txt。 |
'+' | 可读写模式(可添加到其它模式中使用) |
-
问题1#'gbk' codec can't decode byte 0xa4 in position 52: illegal multibyte sequence
f=open('将进酒.txt') print(f) for each in f: print(each) #'gbk' codec can't decode byte 0xa4 in position 52: illegal multibyte sequence 将encoding改为utf-8 f=open('将进酒.txt',encoding='utf-8') print(f) for each in f: print(each)
-
文件对象方法
- close()
- read()
- readline()
- readlines()
- tell()
- seek()
- write()
- writelines()
fileObject.close()
用于关闭一个已打开的文件。关闭后的文件不能再进行读写操作, 否则会触发ValueError
错误
f = open("将进酒.txt")
print('FileName:', f.name) # FileName: 将进酒.txt
f.close()
-
fileObject.read([size])
用于从文件读取指定的字符数,如果未给定或为负则读取所有。
f = open('将进酒.txt', 'r',encoding='utf-8')
line = f.read(20)
print("读取的字符串: %s" % line)
# 读取的字符串: 君不见,黄河之水天上来,奔流到海不复回。
f.close()
fileObject.readline()
读取整行,包括 "\n" 字符。
f = open('将进酒.txt', 'r',enconding='utf-8)
line = f.readline()
print("读取的字符串: %s" % line)
# 读取的字符串: 君不见,黄河之水天上来,奔流到海不复回。
f.close()
fileObject.readlines()
用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的for... in ...
结构进行处理。
f = open('将进酒.txt', 'r')
lines = f.readlines()
print(lines)
for each in lines:
each.strip()
print(each)
# 君不见,黄河之水天上来,奔流到海不复回。
# 君不见,高堂明镜悲白发,朝如青丝暮成雪。
# 人生得意须尽欢,莫使金樽空对月。
# 天生我材必有用,千金散尽还复来。
# 烹羊宰牛且为乐,会须一饮三百杯。
# 岑夫子,丹丘生,将进酒,杯莫停。
# 与君歌一曲,请君为我倾耳听。
# 钟鼓馔玉不足贵,但愿长醉不复醒。
# 古来圣贤皆寂寞,惟有饮者留其名。
# 陈王昔时宴平乐,斗酒十千恣欢谑。
# 主人何为言少钱,径须沽取对君酌。
# 五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。
f.close()
fileObject.tell()
返回文件的当前位置,即文件指针当前位置。
f = open('将进酒.txt', 'r',encoding='utf-8')
line = f.readline()
print(line)
# 君不见,黄河之水天上来,奔流到海不复回。
pos = f.tell()
print(pos) # 42
f.close()
fileObject.seek(offset[, whence])
用于移动文件读取指针到指定位置。
offset
:开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始。whence
:可选,默认值为 0。给offset
定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起。
f = open('将进酒.txt', 'r')
line = f.readline()
print(line)
# 君不见,黄河之水天上来,奔流到海不复回。
line = f.readline()
print(line)
# 君不见,高堂明镜悲白发,朝如青丝暮成雪。
f.seek(0, 0)
line = f.readline()
print(line)
# 君不见,黄河之水天上来,奔流到海不复回。
f.close()
fileObject.write(str)
用于向文件中写入指定字符串,返回的是写入的字符长度。
f = open('workfile.txt', 'wb+')
print(f.write(b'0123456789abcdef')) # 16
print(f.seek(5)) # 5
print(f.read(1)) # b'5'
print(f.seek(-3, 2)) # 13
print(f.read(1)) # b'd'
在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,这时你在文件中是看不到写入的内容的。
如果文件打开模式带b
,那写入文件内容时,str
(参数)要用encode
方法转为bytes
形式,否则报错:TypeError: a bytes-like object is required, not 'str'
。
fileObject.writelines(sequence)
向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符\n
2. OS 模块中关于文件/目录常用的函数
我们所知道常用的操作系统就有:Windows,Mac OS,Linu,Unix等,这些操作系统底层对于文件系统的访问工作原理是不一样的,因此你可能就要针对不同的系统来考虑使用哪些文件系统模块……,这样的做法是非常不友好且麻烦的,因为这样就意味着当你的程序运行环境一改变,你就要相应的去修改大量的代码来应对。
有了OS(Operation System)模块,我们不需要关心什么操作系统下使用什么模块,OS模块会帮你选择正确的模块并调用。
os.getcwd()
用于返回当前工作目录。os.chdir(path)
用于改变当前工作目录到指定的路径。listdir (path='.')
返回path
指定的文件夹包含的文件或文件夹的名字的列表。-
os.mkdir(path)
创建单层目录,如果该目录已存在抛出异常。 -
os.makedirs(path)
用于递归创建多层目录,如果该目录已存在抛出异常。 -
os.remove(path)
用于删除指定路径的文件。如果指定的路径是一个目录,将抛出OSError
。 os.rename(src, dst)
方法用于命名文件或目录,从src
到dst
,如果dst
是一个存在的目录, 将抛出OSError
。os.system(command)
运行系统的shell命令(将字符串转化成命令)os.curdir
指代当前目录(.
)os.pardir
指代上一级目录(..
)os.sep
输出操作系统特定的路径分隔符(win下为\\
,Linux下为/
)os.linesep
当前平台使用的行终止符(win下为\r\n
,Linux下为\n
)os.name
指代当前使用的操作系统(包括:'mac','nt')os.path.basename(path)
去掉目录路径,单独返回文件名os.path.dirname(path)
去掉文件名,单独返回目录路径os.path.join(path1[, path2[, ...]])
将path1
,path2
各部分组合成一个路径名os.path.split(path)
分割文件名与路径,返回(f_path,f_name)
元组。如果完全使用目录,它会将最后一个目录作为文件名分离,且不会判断文件或者目录是否存在。os.path.splitext(path)
分离文件名与扩展名,返回(f_path,f_name)
元组。os.path.getsize(file)
返回指定文件大小,单位是字节。os.path.getatime(file)
返回指定文件最近的访问时间os.path.getctime(file)
返回指定文件的创建时间os.path.getmtime(file)
返回指定文件的最新的修改时间- 浮点型秒数,可用time模块的
gmtime()
或localtime()
函数换算 os.path.exists(path)
判断指定路径(目录或文件)是否存在os.path.isabs(path)
判断指定路径是否为绝对路径os.path.isdir(path)
判断指定路径是否存在且是一个目录os.path.isfile(path)
判断指定路径是否存在且是一个文件os.path.islink(path)
判断指定路径是否存在且是一个符号链接os.path.ismount(path)
判断指定路径是否存在且是一个悬挂点os.path.samefile(path1,path2)
判断path1和path2两个路径是否指向同一个文件
3. 序列化与反序列化
1 为什么要序列化
因为TCP/IP协议只支持字节数组的传输,不能直接传对象。对象序列化的结果一定是字节数组!当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。
2 序列化和反序列化
序列化(serialization):及有序的列,数据转换成二进制的有序的过程
协议:规定序列化和反序列化的转换方式及就是把数据保存成二进制存储起来,其是定义的规则,其规则称为协议如果规定了协议,则可以进行序列化和反序列化,其协议是由版本的,约定协议后进行处理反序列化(deserialization):将有序的二进制序列转换成某种对象(字典,列表等)称为反序列化
持久化:序列化保存到文件就是持久化,序列化未必会持久化,序列化往往是传输或存储。可以将数据序列化后持久化,或者网络传输,也可以将从文件或网络接受到的字节序列反序列化。
Python 的 pickle 模块实现了基本的数据序列和反序列化。
通过 pickle 模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储。 通过 pickle 模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。
pickle模块中最常用的函数为:
pickle.dump(obj, file, [,protocol])
将obj
对象序列化存入已经打开的file
中。
pickle.load(file)
将file
中的对象序列化读出。
obj
:想要序列化的obj
对象。file
:文件名称。file
:文件名称。protocol
:序列化使用的协议。如果该项省略,则默认为0。如果为负值或HIGHEST_PROTOCOL
,则使用最高的协议版本。