1.文件与文件系统
打开文件
-
open(file, mode='r', buffering = None, encoding=None, errors=None, newline=None,closefd=True)
Open file and return a stream. Raise OSError upon failure.file
:必需,文件路径(相对或者绝对路径)mode
:可选,文件打开模式buffering
:设置缓冲encoding
:一般使用utf8errors
:报错级别newline
:区分换行符
打开一个文件,并返回文件对象,如果该文件无法被打开,会抛出OSError
f = open('将进酒.txt')
print(f)
# <_io.TextIOWrapper name='将进酒.txt' mode='r' encoding='cp936'>
for each in f:
print(each)
# 君不见,黄河之水天上来,奔流到海不复回。
# 君不见,高堂明镜悲白发,朝如青丝暮成雪。
# 人生得意须尽欢,莫使金樽空对月。
# 天生我材必有用,千金散尽还复来。
# 烹羊宰牛且为乐,会须一饮三百杯。
# 岑夫子,丹丘生,将进酒,杯莫停。
# 与君歌一曲,请君为我倾耳听。
# 钟鼓馔玉不足贵,但愿长醉不复醒。
# 古来圣贤皆寂寞,惟有饮者留其名。
# 陈王昔时宴平乐,斗酒十千恣欢谑。
# 主人何为言少钱,径须沽取对君酌。
# 五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。
文件对象方法
fileObject.close()
用于关闭一个已打开的文件。关闭后的文件不能再进行读写操作,否则会触发ValueError
错误。
f = open("将进酒.txt")
print('FileName:', f.name) # FileName: 将进酒.txt
f.close()
fileObject.read([size])
用于从文件读取指定的字符数,如果未给定或为负则读取所有。
f = open('将进酒.txt', 'r')
line = f.read(20)
print("读取的字符串: %s" % line)
# 读取的字符串: 君不见,黄河之水天上来,奔流到海不复回。
f.close()
fileObject.readline()
读取整行,包括“\n”字符。
f = open('将进酒.txt', 'r')
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')
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'
.
str = '...'
# 文本 = Unicode字符序列
# 相当于 string 类型
str = b'...'
# 文本 = 八位序列(0到255之间的整数)
# 字节文字总是以‘b’或‘B’作为前缀;它们产生一个字节类型的实例,而不是str类型。
# 相当于 byte[]
f = open('将进酒.txt', 'r+')
str = '\n作者:李白'
f.seek(0, 2)
line = f.write(str)
f.seek(0, 0)
for each in f:
print(each)
# 君不见,黄河之水天上来,奔流到海不复回。
# 君不见,高堂明镜悲白发,朝如青丝暮成雪。
# 人生得意须尽欢,莫使金樽空对月。
# 天生我材必有用,千金散尽还复来。
# 烹羊宰牛且为乐,会须一饮三百杯。
# 岑夫子,丹丘生,将进酒,杯莫停。
# 与君歌一曲,请君为我倾耳听。
# 钟鼓馔玉不足贵,但愿长醉不复醒。
# 古来圣贤皆寂寞,惟有饮者留其名。
# 陈王昔时宴平乐,斗酒十千恣欢谑。
# 主人何为言少钱,径须沽取对君酌。
# 五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。
# 作者:李白
f.close()
fileObject.writelines(sequence)
向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符\n
.
f = open('test.txt', 'w+')
seq = ['小马的程序人生\n', '老马的程序人生']
f.writelines(seq)
f.seek(0, 0)
for each in f:
print(each)
# 小马的程序人生
# 老马的程序人生
f.close()
简洁的with语句
一些对象定义了标准的清理行为,无论系统是否成功的使用了它,一旦不需要它了,那么这个标准的清理行为就会执行。
关键词with语句就可以保证诸如文件之类的对象在使用完之后一定会正确的执行它的清理方法。
try:
f = open('myfile.txt', 'w')
for line in f:
print(line)
except OSError as error:
print('出错啦!%s' % str(error))
finally:
f.close()
# 出错啦!not readable
这段代码执行完毕后,就算在处理过程中出问题了,文件 f 总是会关闭。
try:
with open('myfile.txt', 'w') as f:
for line in f:
print(line)
except OSError as error:
print('出错啦!%s' % str(error))
# 出错啦!not readable
2.OS模块中关于文件/目录常用的函数
有了OS(Operation System)模块,我们不需要关心什么操作系统下使用什么模块,OS模块会选择正确的模块并调用。
os.getcwd()
用于返回当前工作目录。os.chdir(path)
用于改变当前工作目录到指定的路径。
import os
path = 'C:\\'
print("当前工作目录 : %s" % os.getcwd())
# 当前工作目录 : C:\Users\Administrator\PycharmProjects\untitled1
os.chdir(path)
print("目录修改成功 : %s" % os.getcwd())
# 目录修改成功 : C:\
listdir(path='.')
返回path
指定的文件夹包含的文件或文件夹的名字的列表。
import os
dirs = os.listdir()
for item in dirs:
print(item)
os.mkdir(path)
创建单层目录,如果该目录已存在抛出异常。
import os
if os.path.isdir(r'.\b') is False:
os.mkdir(r'.\B')
os.mkdir(r'.\B\A')
os.mkdir(r'.\C\A') # FileNotFoundError
os.makedirs(path)
用于递归创建多层目录,如果该目录已存在抛出异常。
import os
os.makedirs(r'.\E\A')
os.remove(path)
用于删除指定路径的文件。如果指定的路径是一个目录,将抛出OSError
。
首先创建. \E\A\text.txt
文件,然后进行删除。
import os
print("目录为: %s" % os.listdir(r'.\E\A'))
os.remove(r'.\E\A\test.txt')
print("目录为: %s" % os.listdir(r'.\E\A'))
os.rmdir(path)
用于删除单层目录。仅当文件夹是空的才可以,否则抛出OSError.
import os
print("目录为: %s" % os.listdir(r'.\E'))
os.rmdir(r'.\E\A')
print("目录为: %s" % os.listdir(r'.\E'))
os.removedirs(path)
递归删除目录,从子目录到父目录逐层尝试删除,遇到目录非空则抛出异常。
import os
print("目录为: %s" % os.listdir(os.getcwd()))
os.removedirs(r'.\E\A') # 先删除A 然后删除E
print("目录为: %s" % os.listdir(os.getcwd()))
os.rename(src, dst)
方法用于命名文件或目录,从 src 到 dst,如果 dst 是一个存在的目录, 将抛出 OSError。
把test.txt文件重命名为test2.txt。
import os
print("目录为: %s" % os.listdir(os.getcwd()))
os.rename("test.txt", "test2.txt")
print("重命名成功。")
print("目录为: %s" % os.listdir(os.getcwd()))
os.system(command)
运行系统的shell 命令(将字符串转化成命令)
import os
path = os.getcwd() + '\\a.py'
a = os.system(r'python %s' % path)
os.system('calc') # 打开计算器
-
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两个路径是否指向同一个文件
import os
print(os.path.ismount('D:\\')) # True
print(os.path.ismount('D:\\Test')) # False
3.序列化与反序列化
Python 的 pickle 模块实现了基本的数据序列和反序列化。
- 通过 pickle 模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储。
- 通过 pickle 模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。
pickle模块中最常用的函数为:
pickle.dump(obj, file, [,protocol])
将obj
对象序列化存入已经打开的file
中。
- obj:想要序列化的obj对象。
- file:文件名称。
- protocol:序列化使用的协议。如果该项省略,则默认为0。如果为负值或HIGHEST_PROTOCOL,则使用最高的协议版本。
pickle.load(file)
将file中的对象序列化读出。 - file:文件名称。
练习题
- 打开中文字符的文档时,会出现乱码,Python自带的打开文件是否可以指定文字编码?还是只能用相关函数?
open(file, mode=‘r’, buffering=None, encoding=None, errors=None, newline=None, closefd=True)
encoding可以指定编码方式。