目录
1. Python3处理Json的函数
1.1 Python3 字符串转Json格式
1.2 json.dump函数与json.dumps函数的区别
1.3 Python json序列化自定义类
1.4 Python str函数与repr函数
2. Python类属性
2.1 Python中dir()与__dict__的区别
2.2 __import__函数
2.3 其他属性
3. Python list转str
4. Python os模块
5. Django中与manage.py有关的命令
6. Python math库,random库,pickle库
7. Python遍历文件夹
8. Python dict字典用法及其他
9. Reference
1. Python3处理Json的函数
在使用json模块的相关函数时需要先使用import json
该语句将json模块导入进来。
在python命令行中输入dir(json)
命令可以看到json模块提供的各种属性,即:
['JSONDecodeError', 'JSONDecoder', 'JSONEncoder', '__all__',
'__author__', '__builtins__', '__cached__', '__doc__', '__file__',
'__loader__', '__name__', '__package__', '__path__', '__spec__',
'__version__', '_default_decoder', '_default_encoder', 'decoder',
'dump', 'dumps', 'encoder', 'load', 'loads', 'scanner']
1.1 Python3 字符串转Json格式
将python字符串转换成json格式,需要使用json.dumps
函数。
但是需要注意,有时候一不小心就会把json.dumps
函数写成json.dump
。比如以下示例:
这样写会报错:TypeError: dump() missing 1 required positional argument: 'fp'
因此我们需要注意:json.dump
和json.dumps
两个函数的区别。
1.2 json.dump函数与json.dumps函数的区别
json.dump
和json.dumps
两个函数的作用是不相同的。json.dump
用来json文件读写,和json.load
函数配合使用。函数调用格式为json.dump(x,f)
,其中x为对象,f是一个文件对象,这个方法可以将json字符串写入到文本文件中。例如:
在这个代码片段中,通过json.dumps
函数将python的list列表通过json.dump
函数转换成json字符串并写入文件。json.dump也可以将json字符串写入文件,如果不是json字符串,则会在函数内部进行自动转化。
json.load
函数可以用来加载json格式的文件
该函数会读取文件中的json字符串,并将其转换成python对象并返回结果。此后,我们就可以直接对python对象进行操作。
json.load
函数与下面的代码意思相同:
text是读取文件得到的json字符串,通过json.loads
函数将json字符串转换为python对象。
json.dumps
函数可以对python对象进行编码,转换为json字符串。例如:
输出结果如下:
[[1, 2, 3], 123, 123.123, 'abc', {'key2': (4, 5, 6), 'key1': (1, 2, 3)}]
[[1, 2, 3], 123, 123.123, "abc", {"key2": [4, 5, 6], "key1": [1, 2, 3]}]
通过输出的结果可以看出,简单类型通过encode之后跟其原始的repr()输出结果非常相似,但是有些数据类型进行了改变,例如上例中的元组则转换为了列表。在json的编码过程中,会存在从python原始类型向json类型的转化过程,具体的转化对照如下:
注意,在将python的对象转换成json字符串时
- True变成了true
- 元组tuple的圆括号()变成了json中的Array的方括号[],即python中tuple的()和list的[]转成json时都会变成[]
- json字符串中只能用双引号,不能用单引号!!!
- json字符串中的Array的最后一个元素后面不能加逗号’,’,即python的list最后一个元素后不要多加逗号
- json字符串中的Object的最后一个属性后面不能加逗号’,’,即python的dict中的最后一个属性后不要多加逗号
json.dumps()方法返回了一个str对象encodedjson,我们接下来在对encodedjson进行decode,得到原始数据,需要使用的json.loads()函数:
输出结果如下:
<type 'list'>
[1, 2, 3]
[[1, 2, 3], 123, 123.123, u'abc', {u'key2': [4, 5, 6], u'key1': [1, 2, 3]}]
json.loads
方法返回了原始的对象,但是仍然发生了一些数据类型的转化。比如,上例中’abc’转化为了unicode类型。从json到python的类型转化对照如下:
输出结果如下:
{"a": 123, "b": 789, "c": 456}
{"a": 123, "c": 456, "b": 789}
{"a": 123, "b": 789, "c": 456}
False
True
indent参数是缩进的意思,它可以使得数据存储的格式变得更加优雅。
输出:
{
"a": 123,
"b": 789,
"c": 456
}
输出的数据被格式化之后,变得可读性更强,但是却是通过增加一些冗余的空白格来进行填充的。
json主要是作为一种数据通信的格式存在的,而网络通信是很在乎数据的大小的,无用的空格会占据很多通信带宽,所以适当时候也要对数据进行压缩。separator参数可以起到这样的作用,该参数传递是一个元组,包含分割对象的字符串。
输出:
DATA: {'c': 456, 'b': 789, 'a': 123}
repr(data): 30
DATA: {"c": 456, "b": 789, "a": 123}
dumps(data): 30
DATA: {
"c": 456,
"b": 789,
"a": 123
}
dumps(data, indent=4): 44
DATA: {"c":456,"b":789,"a":123}
dumps(data, separators): 25
通过移除多余的空白符,达到了压缩数据的目的,而且效果还是比较明显的。
另一个比较有用的json.dumps
函数的参数是skipkeys
,默认为False。 dumps方法存储dict对象时,key必须是str类型,如果出现了其他类型的话,那么会产生TypeError异常,如果开启该参数,设为True的话,则会跳过非法的key。例如:
输出:
{"c": 456, "b": 789}
1.3 Python json序列化自定义类
json模块不仅可以处理普通的python内置类型,也可以处理我们自定义的数据类型,而往往处理自定义的对象是很常用的。
首先,我们定义一个类Person。
如果直接通过json.dumps方法对Person的实例进行处理的话,会报错,因为json无法支持这样的自动转化。通过上面所提到的json和python的类型转化对照表,可以发现,object类型是和dict相关联的,所以我们需要把我们自定义的类型转化为dict,然后再进行处理。这里,有两种方法可以使用。
方法一:自己写转化函数
上面代码已经写的很清楚了,实质就是自定义object
类型和dict类型进行转化。object2dict
函数将对象模块名、类名以及__dict__
存储在dict对象里,并返回。dict2object
函数则是反解出模块名、类名、参数,创建新的对象并返回。在json.dumps
方法中增加default
参数,该参数表示在转化过程中调用指定的函数,同样在decode过程中json.loads
方法增加object_hook
,指定转化函数。
方法二:继承JSONEncoder和JSONDecoder类,覆写相关方法
JSONEncoder
类负责编码,主要是通过其default函数进行转化,我们可以override该方法。同理对于JSONDecoder
。
在以上代码中,类的参数即为继承的父类。
1.4 Python str函数与repr函数
Python有办法将任意值转为字符串:将它传入repr() 或str() 函数。 函数str() 用于将值转化为适于人阅读的形式,而repr() 转化为供解释器读取的形式。(如果没有等价的语法,则会发生SyntaxError 异常) 某对象没有适于人阅读的解释形式的话, str() 会返回与repr()等同的值。很多类型,诸如数值或链表、字典这样的结构,针对各函数都有着统一的解读方式。)
字符串和浮点数有着独特的解读方式。
>>> s = 'Hello, world.'
>>> str(s)
'Hello, world.'
>>> repr(s)
"'Hello, world.'"
>>> str(1.0/7.0)
'0.142857142857'
>>> repr(1.0/7.0)
'0.14285714285714285'
2. Python类属性
2.1 Python中dir()与__dict__的区别
要知道一个类有哪些属性,有两种方法。最简单的是使用 dir()
内建函数。另外是通过访问类的字典属性 __dict__
。
类和实例都有__dict__属性,不过内容有所不同。
dir()
返回的仅是对象的属性的一个名字类表,而 __dict__
返回的是一个字典,它的键(key)是属性名,键值(value)是相应的属性对象的数据值。
内建函数 dir() 可以显示类属性,同样还可以打印所有实例属性:
实例也有一个 __dict__
特殊属性,它是实例属性构成的一个字典:
__dict__
函数的巧妙使用可以减少构造对象时的大量赋值代码。例子如下:
使用__dict__
函数可以简化代码:
不是所有的对象都有__dict__属性。例如,如果你在一个类中添加了__slots__
属性,那么这个类的实例将不会拥有__dict__
属性,但是dir()仍然可以找到并列出它的实例所有有效属性。(__slots__
属性详解见Python学习笔记(二))
2.2 __import__函数
使用__import__
函数可以在程序中动态调用模块或模块中的函数。如果我们知道模块的名称(字符串)的时候,我们可以很方便地使用动态调用。
import
关键字可以导入/引入一个python标准模块,其中包括.py
文件,带有__init__.py
文件的目录。
__import__
函数的作用和import
关键字的作用一样,只是__import__
函数只能接收字符串作为参数
import sys
相当于sys = __import__('sys')
,如果要导入类似package.function
的函数时,不能直接用mod = __import('package.function')
的形式来导入该模块。参考官方文档:
When the name variable is of the form package.module
, normally, the top-level package(the name up till the first dot) is returned,not the module named by name. However, when a non-empty from list argument is given(真的只要不是空就可以了,你可以随便写,比如[“a”]), the module named by name is returned. This is done for compatibility with the bytecode generated for the different kinds of import statement; when using import spam.ham.eggs
, the top-level package spam
must be placed in the importing namespace, but when using from spam.ham import eggs
, the spam.ham
subpackage must be used to find the eggs variable. As a workaround for this behavior, use getattr() to extract the desired components. For example, you could define the following helper:
2.3 其他属性
-
__init__属性
对象生命周期的基础是创建、初始化和销毁。__init__
方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象做一些你希望的初始化。
__init__()
方法意义重大的原因有两个。第一个原因是在对象生命周期中初始化是最重要的一步;每个对象必须正确初始化后才能正常工作。第二个原因是__init__()
参数值可以有多种形式。
python中的object类是一个隐含的超类,每一个python类都隐含了object这个超类。例如:class X: pass >>> X.__class__ <class 'type'> >>> X.__class__.__base__ <class 'object'>
-
__class__属性
使用C.__class__
属性可以获得该实例C对应的类。
对象的__class__
属性指明了对象所属的类型。
python的super()
方法和__class__
的关系见Python学习笔记(二))
-
__name__属性
C.__name__
属性可以返回类C的名字(字符串),__name__
是给定类的字符名字。它适用于那种只需要字符串(类对象的名字),而非对象本身的情况。 -
__doc__属性
C.__doc__
属性是类的文档字符串,与函数及模块的文档字符串相似,必须紧随头行后的字符串。文档字符串不能被派生类继承,也就是说派生类必须含有他们自己的文档字符串。 -
__bases__属性
C.__bases__
用来处理继承,它包含了一个由所有父类组成的元组。python中每个类都有一个__base__属性
,例如:
python和C++一样,也支持多重继承,注意,在这里父类Derived和Base的顺序不能搞反了。否则会出现以下错误:
注意:__base__
属性是类的属性,不是对象的属性
- __new__属性
继承自object的新式类才有
__new__
属性。
__new__
属性至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供。
__new__
必须要有返回值,返回实例化出来的实例,这点在自己实现__new__
时要特别注意,可以return父类__new__
出来的实例,或者直接是object的__new__
出来的实例。
__init__
有一个参数self,就是这个__new__
返回的实例,__init__
在__new__
的基础上可以完成一些其它初始化的动作,__init__
不需要返回值。 若__new__
没有正确返回当前类cls的实例,那__init__
是不会被调用的,即使是父类的实例也不行。
输出结果如下:
new <class '__main__.B'>
<class '__main__.A'>
- __del__属性
在一个类的实例被删除时调用该方法
3. Python list转str
在Python中将list转成str,可以用json.dumps()
来将list转成json字符串。除此之外,也可以用str的join
函数。在使用’‘.join()时保证参数的内容为str,如果参数是非str,如下所示:
输出结果为:
TypeError: sequence item 0: expected str instance, int found
因此,如果join的参数是list,则list中的元素必须都是str才行。例如:
输出结果为:
['a', 'b', 'c', 'd', 'e']
abcde
abcde
4. Python os模块
在Python中可以方便地使用os模块运行其他的脚本或者程序,这样就可以在脚本中直接使用其他脚本,或者程序提供的功能,而不必再次编写实现该功能的代码。为了更好地控制运行的进程,可以使用win32process模块中的函数。如果想进一步控制进程,则可以使用ctype模块,直接调用kernel32.dll中的函数。
-
使用os.system函数运行其他程序 os模块中的system()函数可以方便地运行其他程序或者脚本。其函数原型如下所示:
os.system(command)
,其参数含义如下所示。command
要执行的命令,相当于在Windows的cmd窗口中输入的命令。如果要向程序或者脚本传递参数,可以使用空格分隔程序及多个参数。例如:
import os # 使用os.system()函数打开记事本程序 os.system('notepad') # 向记事本传递参数,打开python.txt文件 os.system('notepad python.txt')
-
os.name:输出字符串指示正在使用的平台。如果是window 则用’nt’表示,对于Linux/Unix用户,它是’posix’。
-
os.getcwd():得到当前工作目录,即当前Python脚本工作的目录路径。
-
os.listdir():返回指定目录下的所有文件和目录名。
-
os.remove():删除一个文件。
-
os.system():运行shell命令。
-
os.sep:可以取代操作系统特定的路径分割符。
-
os.linesep:用字符串给出当前平台使用的行终止符。
-
os.path.split():该函数返回一个路径的目录名和文件名。
os.path.split('C:\\Python25\\abc.txt')
输出结果为:
('C:\\Python25', 'abc.txt')
-
os.path.isfile(),os.path.isdir():它们分别检验给出的路径是一个文件还是目录。
-
os.path.exists():用来检验给出的路径是否真地存在。
-
os.path.abspath(name):获得绝对路径。
-
os.path.normpath(path):规范path字符串形式。
-
os.path.getsize(name):获得文件大小,如果name是目录返回0L。
-
os.path.splitext():分离文件名与扩展名。
os.path.splitext('a.txt')
输出结果为:
('a', '.txt')
-
os.path.join(path,name):连接目录与文件名或目录。
os.path.join('c:\\Python','a.txt') os.path.join('c:\\Python','f1')
输出结果为:
'c:\\Python\\a.txt' 'c:\\Python\\f1'
-
os.path.basename(path):返回文件名。
os.path.basename('a.txt') os.path.basename('c:\\Python\\a.txt')
输出结果为:
'a.txt' 'a.txt'
-
os.path.dirname(path):返回文件路径。
os.path.dirname('c:\\Python\\a.txt')
输出结果为:
'c:\\Python'
5. Django中与manage.py有关的命令
django-admin.py startproject mysite 该命令在当前目录创建一个 mysite 目录。 django-admin.py这个文件在C:\Python27\Lib\site-packages\django\bin文件夹里,可以把该目录添加到系统Path里面。 Django内置一个轻量级的Web服务器。 进入 mysite 目录的话,现在进入其中,并运行 python manage.py runserver 命令 启动服务器,用http://127.0.0.1:8000/可以进行浏览了,8000是默认的端口号。
-
python manage.py runserver 8080
:更改服务器端口号。 -
python manage.py shell
:启动交互界面。 -
python manage.py startapp books
:创建一个app,名为books。 -
python manage.py validate
:验证Django数据模型代码是否有错误。 -
python manage.py sqlall books
:为模型产生sql代码。 -
python manage.py sqlmigrate
:用来把数据库迁移文件转换成数据库语言(displays the SQL statements for a migratioin)。
用法:python manage.py sqlmigrate app migration
,比如makemigrations生成了0001_initial.py,就用sqlmigrate app 0001_intial,这里0001_initial就是migration参数。 -
python manage.py dbshell
:启动数据库的命令行工具。 -
manage.py sqlall books
:查看books这个app下所有的表。 -
python manage.py makemigrations
:用来检测数据库变更和生成数据库迁移文件。 -
python manage.py migrate
:用来迁移数据库。
6. Python math库,random库,pickle库
python的math库定义了两个常数:
math.e # 自然常数e
math.pi # 圆周率pi
还有一些运算函数:
-
math.ceil(x)
表示对x向上取整,比如x=1.2,返回2 -
math.floor(x)
表示对x向下取整,比如x=1.2,返回1 -
math.pow(x,y)
表示指数运算,得到x的y次方 -
math.log(x)
表示求对数,默认基底为e。可以使用base参数,来改变对数的基地。比如math.log(100,base=10) -
math.sqrt(x)
表示求平方根 -
三角函数:
math.sin(x)
,math.cos(x)
,math.tan(x)
,math.asin(x)
,math.acos(x)
,math.atan(x)
-
角度和弧度互换:
math.degrees(x)
,math.radians(x)
-
双曲函数:
math.sinh(x)
,math.cosh(x)
,math.tanh(x)
,math.asinh(x)
,math.acosh(x)
,math.atanh(x)
-
特殊函数:
math.erf(x)
,math.gamma(x)
python random库中的常见函数如下:
random.seed(x)
用来改变随机数生成器的种子seed。如果你不了解其原理,你不必特别去设定seed,Python会帮你选择seed。
1) 随机挑选和排序
-
random.choice(seq)
:从序列的元素中随机挑选一个元素,比如random.choice(range(10))
,从0到9中随机挑选一个整数。 -
random.sample(seq,k)
:从序列中随机挑选k个元素 -
random.shuffle(seq)
:将序列的所有元素随机排序
2)随机生成实数
下面生成的实数符合均匀分布(uniform distribution),意味着某个范围内的每个数字出现的概率相等:
-
random.random()
:随机生成下一个实数,它在[0,1)范围内。 -
random.uniform(a,b)
:随机生成下一个实数,它在[a,b]范围内。 -
random.gauss(mu,sigma)
: 随机生成符合高斯分布的随机数,mu,sigma为高斯分布的两个参数。 -
random.expovariate(lambd)
:随机生成符合指数分布的随机数,lambd为指数分布的参数。
python pickle模块 pickle提供了一个简单的持久化功能。可以将对象以文件的形式存放在磁盘上。
pickle.dump(obj, file[, protocol])
用来序列化对象,并将结果数据流写入到文件对象中。参数protocol是序列化模式,默认值为0,表示以文本的形式序列化。protocol
的值还可以是1或2,表示以二进制的形式序列化。protocol的值为-1也可以通过二进制形式序列化。
pickle.load(file)
用来反序列化对象。将文件中的数据解析为一个Python对象。
7. Python遍历文件夹
python遍历一个文件夹下的所有文件用以下函数实现:
该函数的for循环时有三个参数,os.walk分别返回:
- 父目录
- 所有文件夹名字(不含路径)
- 所有文件名字
8. Python dict字典用法及其他
- 向字典中添加元素
- 从字典中取元素
从字典中取某个key对应的value,可以直接用dict[key]来去元素,但是就上面的例子而言,由于info中没有’a’这个key,所以运行后会报错:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'a'
提示说程序中出现了KeyError
。因此,在从字典中取元素时需要考虑key不存在的情况。
可以用key in dict
这种形式来判断Key是否存在于dict中。也可以用dict.get(key)
函数来获取在该dict中key对应的value值。但是如果key不存在,该函数会抛出异常。所以我们需要为返回值设置默认值。
将dict.get(key,default)
的第二个参数设置为一些非法值,然后根据函数返回值即可判断字典中是否有该key。
- 删除字典中的元素可以用pop函数和del函数。例如:
其他注意点:
python多变量在同一行进行赋值可以这样写:
python的print函数中的逗号,比如:
输出结果为:
1 2 3
在python中如何使print输出不换行
Python 2:使用print后加一个逗号:print 'hello'
,
Python 3:输入参数end:print('hello', end='')
python print函数不输出多余空格:
for i in range(6):
for j in range(i):
print('*', end='')
print()
输出结果为:
*
**
***
****
*****
但是在python的代码中用end=''
的时候,需要在文件的开头第一行添加这条语句:from __future__ import print_function
。如果import这个库的语句不在第一行就会出现下面的这种错误。
SyntaxError: from __future__ imports must occur at the beginning of the file
如果文件开头第一行为# coding: utf-8
,那么下面import的第一个库必须是上面的这个库才不会导致end=''
报错。如果有多条import语句,上面这条语句也必须放在所以import语句的最前面。
出现IndentationError: unindent does not match any outer indentation level
错误都是代码缩进的问题。
python中if name == ‘main’: 的解析
模块是对象,并且所有的模块都有一个内置属性 name。一个模块的 name 的值取决于您如何应用模块。如果 import 一个模块,那么模块__name__ 的值通常为模块文件名,不带路径或者文件扩展名。但是您也可以像一个标准的程序样直接运行模块,在这种情况下, name 的值将是一个特别缺省”main“。
9. Reference
http://blog.csdn.net/fanhuajames/article/details/8781977
http://www.cnblogs.com/coser/archive/2011/12/14/2287739.html
http://www.jb51.net/article/54640.htm