IO编程:操作目录
Python基础系列内容为学习廖雪峰老师Python3教程的记录,廖雪峰老师官网地址:廖雪峰Python3教程
os
模块:Python提供了os
模块来支持对文件的操作,下面列举部分比较常见的操作获取系统类型
import os print(os.name) # 输出结果 # nt # [Finished in 0.2s]
os.name
会获取系统的类型,nt
代表的是Windows系统,而posix
代表Linux
Unix
或者Mac OS X
获取环境变量
import os print(os.environ) # 输出结果 environ({'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', 'PROMPT': '$P$G', 'PYTHONIOENCODING': 'utf-8', ...}) [Finished in 0.2s]
系统的环境变量都会储存在这个变量中,如果要获取某个变量的值,可以调用方法:
os.environ.get()
方法:import os print(os.environ.get("Path")) # 输出结果 C:\Users\fanyu\Anaconda3\Library\bin;C:\ProgramData\Oracle\Java\javapath;C:\Program Files\Microsoft SQL Server\130\Tools\Binn\;.... [Finished in 0.1s]
创建文件或目录
import os parent=os.path.abspath(".")#获取当前路径的绝对路径地址 print(parent)# 输出当前路径绝对路径 new_folder_path=os.path.join(parent,'testdir')# 新的文件夹绝对路径 print(new_folder_path) flag=os.path.isdir(new_folder_path) # 判断是否存在该目录 print(str(flag)) os.mkdir(new_folder_path) # 创建该目录 flag=os.path.isdir(new_folder_path) # 判断创建的目录是否存在 print(str(flag)) os.rmdir(new_folder_path) # 移除目录 flag=os.path.isdir(new_folder_path) # print(flag)
输出结果:
D:\data\schoolwork\code D:\data\schoolwork\code\testdir False True False [Finished in 0.2s]
我们来分析上面的代码:
首先程序获取当前目录的绝对路径并打印出来:
D:\data\schoolwork\code
接下来程序使用
os.path.join()
函数拼接出一个新的地址:D:\data\schoolwork\code\testdir
然后用
os.path.isdir()
来判断该目录是否存在:False
紧接着程序创建了该目录:
os.mkdir(new_folder_path) # 创建该目录
再判断其是否存在:True
最后程序移除了该目录:
os.rmdir(new_folder_path) # 移除目录
这里要说明几个函数,能够方便程序开发
os.path.split()
:这个函数能将一个路径按照系统的不同将路径划分为两个部分,一个是其父路径,另一个为其文件名全称os.path.splitext()
:这个函数能把一个路径按照后缀分开import os path="C:/users/fanyu/desktop/test.txt" print("split result:\n",os.path.split(path)) print("splitext result:\n",os.path.splitext(path)) # 输出结果 split result: ('C:/users/fanyu/desktop', 'test.txt') splitext result: ('C:/users/fanyu/desktop/test', '.txt') [Finished in 0.1s]
os.path.join()
:该函数能根据系统的不同将路径拼接起来import os path=os.path.join("c:/users/fanyu/desktop",'test.txt') print(path) # 结果 c:/users/fanyu/desktop\test.txt [Finished in 0.1s]
os.rename()
:对文件重命名os.remove()
: 删除文件
由于
os
模块所提供的函数都是对系统封装的调用,因而如果某功能,比如文件复制,没有相应的系统调用的话os
模块也就没有相应的函数,基于此,Python提供了shutil
模块来作为os
模块的补充,来提供一些别的文件操作相关的函数,比如复制文件shutil.copyfile
比如删除非空目录shutil.rmtree
等
序列化:把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫
pickling
,在其他语言中也被称之为serialization
,marshalling
,flattening
等等,都是一个意思。序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling
。Python提供了pickle
模块来进行序列化操作pickle.dumps()
:序列化操作import pickle d=dict(name='Lisa',score=100,age=20) print(pickle.dumps(d)) # 输出结果: b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00Lisaq\x02X\x05\x00\x00\x00scoreq\x03KdX\x03\x00\x00\x00ageq\x04K\x14u.' [Finished in 0.2s]
可以看到该函数将一根
dict
对象序列化为了二进制的数据(这里显示为16进制)pickle.dump()
:将对象序列化后保存为文件import pickle d=dict(name='Lisa',score=100,age=20) f=open("test.txt","wb") pickle.dump(d,f) f.close()
pickle.load()
: 反序列化:将序列从文件还原import pickle f=open("test.txt","rb") print(pickle.load(f)) f.close() #结果 {'name': 'Lisa', 'score': 100, 'age': 20} [Finished in 0.2s]
可见变量又被加载回来了。另外值得提起的时是,这种序列化是高度依赖语言甚至是语言版本的,可能不同版本的Python序列化的结果都不一样,鉴于此,有为了跨平台,多兼容的序列化标准:比如
json
xml
等。但更好的方法是序列化为json
,因为json
表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。json
不仅是标准格式,并且比xml
更快,而且可以直接在Web
页面中读取,非常方便。
json
:使用json
进行序列化也非常方便import json d={"name":"Lisa","sroce":99,"age":20,"gender":"female"} print(json.dumps(d)) #结果 {"name": "Lisa", "sroce": 99, "age": 20, "gender": "female"} [Finished in 0.2s]
加载同样也很方便:
import json d={"name":"Lisa","sroce":99,"age":20,"gender":"female"} json_str=json.dumps(d) dd=json.loads(json_str) print(dd) {'name': 'Lisa', 'sroce': 99, 'age': 20, 'gender': 'female'} [Finished in 0.2s]