2020.05.01
对文件与目录的操作
把两个路径合成一个时,不要直接拼字符串,而要通过os.path.join()函数。
使用os.path.abspath(’.’)能都获取当前运行此语句的py文件绝对路径。
使用os.path.join(os.path.abspath(’.’) ,newdir):
此时会在运行该语句在py文件同级处创建一个名字为newdir的文件目录。
并且该语句适用于在任何操作系统如Linux、Windows、macOS下创建目录文件,这是与使用简单的字符串拼接不一样的地方。
拆分路径使用os.path.split(目录字符串):
sp = os.path.split('/Users/michael/testdir/file')
```python
print(sp) #可以看到会返回一个包含两个元素的元组,第二个元素是最后级别的目录或文件名,返回的第一个元素是除去最后一级的目录
print(type(sp))
>>> ('/Users/michael/testdir', 'file')
<class 'tuple'>
使用os.path.splitext()函数可以直接得到传入的路径下最后一级的文件扩展名
spt = os.path.splitext('/Users/michael/testdir/file.txt')
print(spt)
>>>('/Users/michael/testdir/file', '.txt')
使用os.rename()函数对文件重命名:
os.rename('test1.py','test2.py')
使用os.remove()函数删除文件:
os.remove('text1.py')
pickle模块
把变量从内存中变成可存储或传输的过程称之为序列化Python中叫pickling,在其他语言中也被称之为serializatio、flattening。序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。
反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。
Python提供了pickle模块来实现序列化。
其中有多种方法:
①pickle.dumps()
此方法将传入的第一个参数变量序列化,操作如下:
>>>s = "test"
>>>pickle.dumps(s)
b'\x80\x03X\x04\x00\x00\x00testq\x00.'
-可以看到将变量s序列化为一系列二进制串
②pickle.dump()
此方法需要传入第二个参数,是一个文件类型,作为第一个参数序列号后的存储文件。如下:
>>>pickle.dump(s,file)
-此时会将s对应的序列号串存入file中。但是注意,使用open打开file时,传入的读写模式一定是'wb'
③pickle.loads()
此方法与pickle.load()类似,只是传入的参数是一个变量而已。
④pickle.load()
此方法将序列化对象反序列化为变量,传入的参数一定是一个二进制文件。
>>>pickle.load(file)
test
-会原样输出。
JSON模块
python中的json模块可以将python中的数据转换为json类型,其中主要有:
[]对应list类型
{}对应dict类型
该模块也有和pickle模块一样的方法:dump()、dumps()、load()以及loads()方法,并且使用方法以及效果一样,只是pickle模块专注存储,json模块专注于变量与json类型的转换而已。如下:
>>> json_str = '{"age": 20, "score": 88, "name": "Bob"}'
>>> json.loads(json_str)
{'age': 20, 'score': 88, 'name': 'Bob'}
>>> d = dict(name='Bob', age=20, score=88)
>>> json.dumps(d)
'{"age": 20, "score": 88, "name": "Bob"}'
json模块在默认情况下只能将python中基本数据类型转换成json中对应的类型。如果想要将python中的类class转换成json类型,那么需要传入dumps()/dump()函数的默认命名可变参数:default参数,很显然,传入的时候要指定参数名。使用如下:
json.dumps(s,default=s2dic)
-这里假设s是一个拥有name、age、score属性的class,s2dic时一个函数,详情如下:
def s2dic(s):
return {
'name' = s.name,
'age' = s.age,
'score' = s.score
}
-可以看出,这是通过首先人为的将class的属性封装成一个dict,而dict可以直接与json中的{}转换,因此就可以在一定程度上实现class到json的转换。
在每一个class中,都定义有一个内置的__dict__变量,专门用来存储class中定义的属性,因此此时可以采用简便的方法实现上面的功能,并且不用专门定义一个s2dic函数:
json.dumps(s,deafult = lambda ojb: ojb.__dict__)
此时如果传入的s是一个对象class,则就将该class的内置__dict__变量传入,这样就可以达到专门定义函数转换的效果,而且可以通用,也就是不需要为每个需要转换成json的class专门定义一个函数。
如果想要将json转换为class,则和dumps/dump一样,只是传入的参数名字不是default而是object_hook,使用如下:
>>>json_str = '{"age": 20, "score": 88, "name": "Bob"}'
>>>print(json.loads(json_str, object_hook=dict2s))
object class
-此时的dict2s为:
def dict2s(p1,p2,p3):
return s(p1,p2,p3)
-返回一个新创建的s类