python学习_五

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类
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值