刻意练习:Python基础 -- Task07. 文件与文件系统
背景
我们准备利用17天时间,将 “Python基础的刻意练习” 分为如下任务:
- Task01:变量、运算符与数据类型(1day)
- Task02:条件与循环(1day)
- Task03:列表与元组(2day)
- Task04:字符串与序列(1day)
- Task05:函数与Lambda表达式(2day)
- Task06:字典与集合(1day)
- Task07:文件与文件系统(2day)
- Task08:异常处理(1day)
- Task09:else 与 with 语句(1day)
- Task10:类与对象(2day)
- Task11:魔法方法(2day)
- Task12:模块(1day)
这是我的 07/12 次任务的打卡内容。我学习 Python 的思路是,先去熟悉 Python 的整体语法框架与自己熟悉的编程语言进行知识点的连接,后面遇到问题再来慢慢补充,慢慢形成自己的知识结构。
Python 基础语法
1. 打开文件
open(file, mode='r')
接收两个参数:文件名(file
)和模式(mode
),用于打开一个文件,并返回文件对象,如果该文件无法被打开,会抛出OSError
。
打开模式 | 执行操作
完整的语法格式为:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None)
- file: 必需,文件路径(相对或者绝对路径)。
- mode: 可选,文件打开模式
- buffering: 设置缓冲
- encoding: 一般使用utf8
- errors: 报错级别
- newline: 区分换行符
f = open('将进酒.txt')
print(f)
# <_io.TextIOWrapper name='将进酒.txt' mode='r' encoding='cp936'>for each in f:print(each)# 君不见,黄河之水天上来,奔流到海不复回。
# 君不见,高堂明镜悲白发,朝如青丝暮成雪。
# 人生得意须尽欢,莫使金樽空对月。
# 天生我材必有用,千金散尽还复来。
# 烹羊宰牛且为乐,会须一饮三百杯。
# 岑夫子,丹丘生,将进酒,杯莫停。
# 与君歌一曲,请君为我倾耳听。
# 钟鼓馔玉不足贵,但愿长醉不复醒。
# 古来圣贤皆寂寞,惟有饮者留其名。
# 陈王昔时宴平乐,斗酒十千恣欢谑。
# 主人何为言少钱,径须沽取对君酌。
# 五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。
2. 文件对象方法
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[]
Sample:
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()
3. OS 模块中关于文件/目录常用的函数使用方法
我们所知道常用的操作系统就有:Windows,Mac OS,Linu,Unix等,这些操作系统底层对于文件系统的访问工作原理是不一样的,因此你可能就要针对不同的系统来考虑使用哪些文件系统模块……,这样的做法是非常不友好且麻烦的,因为这样就意味着当你的程序运行环境一改变,你就要相应的去修改大量的代码来应对。
有了OS(Operation System)模块,我们不需要关心什么操作系统下使用什么模块,OS模块会帮你选择正确的模块并调用。
os.getcwd()
用于返回当前工作目录。os.chdir(path)
用于改变当前工作目录到指定的路径。
import ospath = 'C:\\'
print("当前工作目录 : %s" % os.getcwd())
# 当前工作目录 : C:\Users\Administrator\PycharmProjects\untitled1
os.chdir(path)
print("目录修改成功 : %s" % os.getcwd())
# 目录修改成功 : C:\
os.listdir(path)
返回path
指定的文件夹包含的文件或文件夹的名字的列表。
import osdirs = os.listdir()
for item in dirs:print(item)
os.mkdir(path)
创建单层目录,如果该目录已存在抛出异常。
import osif 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
。
import osprint("目录为: %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 osprint("目录为: %s" % os.listdir(r'.\E'))
os.rmdir(r'.\E\A')
print("目录为: %s" % os.listdir(r'.\E'))
os.removedirs(path)
递归删除目录,从子目录到父目录逐层尝试删除,遇到目录非空则抛出异常。
import osprint("目录为: %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
。
import osprint("目录为: %s" % os.listdir(os.getcwd()))
os.rename("test", "test2")
print("重命名成功。")
print("目录为: %s" % os.listdir(os.getcwd()))
os.system(command)
运行系统的shell命令(将字符串转化成命令)
import ospath = 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’)
import osprint(os.curdir) # .
print(os.pardir) # ..
print(os.sep) # \
print(os.linesep)
print(os.name) # 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)
元组。
import os# 返回文件名
print(os.path.basename(r'C:\test\lsgo.txt')) # lsgo.txt
# 返回目录路径
print(os.path.dirname(r'C:\test\lsgo.txt')) # C:\test
# 将目录和文件名合成一个路径
print(os.path.join('C:\\', 'test', 'lsgo.txt')) # C:\test\lsgo.txt
# 分割文件名与路径
print(os.path.split(r'C:\test\lsgo.txt')) # ('C:\\test', 'lsgo.txt')
# 分离文件名与扩展名
print(os.path.splitext(r'C:\test\lsgo.txt')) # ('C:\\test\\lsgo', '.txt')
os.path.getsize(file)
返回指定文件大小,单位是字节。os.path.getatime(file)
返回指定文件最近的访问时间os.path.getctime(file)
返回指定文件的创建时间os.path.getmtime(file)
返回指定文件的最新的修改时间- 浮点型秒数,可用time模块的
gmtime()
或localtime()
函数换算
import os
import timefile = r'.\lsgo.txt'
print(os.path.getsize(file)) # 30
print(os.path.getatime(file)) # 1565593737.347196
print(os.path.getctime(file)) # 1565593737.347196
print(os.path.getmtime(file)) # 1565593797.9298275
print(time.gmtime(os.path.getctime(file)))
# time.struct_time(tm_year=2019, tm_mon=8, tm_mday=12, tm_hour=7, tm_min=8, tm_sec=57, tm_wday=0, tm_yday=224, tm_isdst=0)
print(time.localtime(os.path.getctime(file)))
# time.struct_time(tm_year=2019, tm_mon=8, tm_mday=12, tm_hour=15, tm_min=8, tm_sec=57, tm_wday=0, tm_yday=224, tm_isdst=0)
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 osprint(os.path.ismount('D:\\')) # True
print(os.path.ismount('D:\\Test')) # False
4. 序列化与反序列化
Python 的 pickle 模块实现了基本的数据序列和反序列化。
- 通过 pickle 模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储。
- 通过 pickle 模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。
pickle模块中最常用的函数为:
pickle.dump(obj, file, [,protocol])
将obj
对象序列化存入已经打开的file
中。
obj
:想要序列化的obj
对象。file
:文件名称。protocol
:序列化使用的协议。如果该项省略,则默认为0。如果为负值或HIGHEST_PROTOCOL
,则使用最高的协议版本。
pickle.load(file)
将file
中的对象序列化读出。
file
:文件名称。
import pickledataList = [[1, 1, 'yes'],[1, 1, 'yes'],[1, 0, 'no'],[0, 1, 'no'],[0, 1, 'no']]
dataDic = {0: [1, 2, 3, 4],1: ('a', 'b'),2: {'c': 'yes', 'd': 'no'}}# 使用dump()将数据序列化到文件中
fw = open(r'.\dataFile.pkl', 'wb')# Pickle the list using the highest protocol available.
pickle.dump(dataList, fw, -1)# Pickle dictionary using protocol 0.
pickle.dump(dataDic, fw)
fw.close()# 使用load()将数据从文件中序列化读出
fr = open('dataFile.pkl', 'rb')
data1 = pickle.load(fr)
print(data1)
data2 = pickle.load(fr)
print(data2)
fr.close()# [[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
# {0: [1, 2, 3, 4], 1: ('a', 'b'), 2: {'c': 'yes', 'd': 'no'}}
总结
好了,到此为止有关于 文件、文件系统 和 序列化与反序列化 部分就介绍完了,大家要根据上面的例子多多体会,只有刻意练习才能掌握一门技术,没有捷径的,加油啊!See You!
参考文献:
- https://www.runoob.com/python3/python3-tutorial.html
- https://www.bilibili.com/video/av4050443
相关图文:
- 资料分享:数学建模资料分享 – 图论部分
- 资料分享:数学建模资料分享 – 神经网络部分
- 如何利用 C# 实现 K 最邻近算法?
- 如何利用 C# 实现 K-D Tree 结构?
- 如何利用 C# + KDTree 实现 K 最邻近算法?
- 如何利用 C# 对神经网络模型进行抽象?
- 如何利用 C# 实现神经网络的感知器模型?
- 如何利用 C# 实现 Delta 学习规则?
- 如何利用 C# 实现 误差反向传播 学习规则?
- 如何利用 C# 爬取带 Token 验证的网站数据?
- 如何利用 C# 向 Access 数据库插入大量数据?
- 如何利用 C# + Python 破解猫眼电影的反爬虫机制?
刻意练习:Python基础 -- Task07. 文件与文件系统相关推荐
- 第六篇:python基础之文件处理
第六篇:python基础之文件处理 阅读目录 一.文件处理流程 二.基本操作 2.1 文件操作基本流程初探 2.2 文件编码 2.3 文件打开模式 2.4 文件内置函数flush 2.5 文件内光标移 ...
- [Python学习日记] 文件与文件系统(一)
[Python学习日记] 文件与文件系统(一) 目录 Python3 File(文件) 方法 open() 方法 file 对象 目录 Python3 File(文件) 方法 open() 方法 Py ...
- python 基础之文件读操作
创建一个名为'尘曦'的文件内容如下 Hadoop是一个由Apache基金会所开发的分布式系统基础架构. 用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和存储. ...
- python基础(文件、异常、模块、类、对象)
文件: 打开文件使用open函数,open()的第一个参数是:要打开文件的路径,如果只传入文件名那么将在当前文件下查找文件并打开.第二个参数是:文件的打开模式,其他参数都是默认的.文件的打开模式如下图 ...
- python基础之文件打开
博主简介:原互联网大厂tencent员工,网安巨头Venustech员工,阿里云开发社区专家博主,微信公众号java基础笔记优质创作者,csdn优质创作博主,创业者,知识共享者,欢迎关注,点赞,收藏. ...
- 带你学python基础:文件读写,俗称IO操作
这一节讲个挺有意思的知识,至少在我以前刚刚接触编程的时候,对于文件操作还是觉得很有意思的事情,这也许是有一种操作文件的激情吧,希望看到这篇文章的读者也会有这样的激情,说明还是很有兴趣的,当然,就算没有 ...
- Python基础(5) - 文件
Python Python提供的函数和方法方便地对文件进行读.写.删除等的操作. open()函数返回一个文件对象. open(name[, mode[, buffering]]) -> fil ...
- python基础之文件操作,集合,函数
文件操作: 打开文件的方法: 第一种:打开文件执行完命令后,需要关闭文件,否则会一直占用内存空间 f=open('/data/1.txt','r+') #后面的r+ 表示打开文件的模式是读写 # ...
- Python基础:文件的操作
一.python可以在不导入任何模块的情况下对文件完成读.写.追加,替换(稍复杂). 二.打开文件: 1.f = open('text.txt') 这种方式打开,操作完后需要使用f.colse()关闭 ...
- 【Python基础】文件读写
IO操作的类型 文件读写是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的. 在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘. 读写文件就是请 ...
最新文章
- 关闭图片 pycharm_博士大佬总结的Pycharm 常用快捷键思维导图,收藏!
- php实现基于shmop扩展的数据缓存
- 1231 最优布线问题
- matlab计算联合熵,如何用matlab软件计算一幅图像信息的熵以及两幅图像间的联合熵?...
- SpringBoot 使用注解实现消息广播功能
- Hibernate缓存和加强
- 二代征信系统上线 这些内容与你有关
- mysql登录报错error1045,mysql创建登录报错ERROR1045(28000)
- HAOI(十二省联考)2019 qwq记
- 一般人想象不到的创业者付出的5种努力 创业者的背后
- Android APK反编译技巧全讲解
- Java中类和对象的区别
- 数据交换平台-初步设计
- scheme语言编译成c语言,Scheme语言--简单介绍
- JAVA导出exls时报oom,Poi导出产生OOM解决方案
- PC微信3.7.0将本地文件从MsgAttach文件夹转移回原先的File文件夹
- [开题报告+论文+源码]基于Android仿QQ聊天系统
- 张浩java成绩大于98分_1028学习
- 2022-07-06 Unity核心9——3D动画
- java有参构造_java的有参构造有什么用