zfill自动补0

2018年5月19日 17:14

python提供了zfill(zero fill)函数自动为字符串前面补0
>>> "5".zfill(2)  #2表示字符串宽度
'05'
 
《寿康宝鉴》有声书

 

评论(0) 阅读(7)

python常见编码错误集合

2018年5月17日 11:08

  • 错误1:变量加载到内存出现编码错误
文件内容
a="中国"
print a

#报错
➜  ~ python a.py
  File "a.py", line 1
SyntaxError: Non-ASCII character '\xe4' in file b.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
编译会读取变量a存到内存,因为包含中文,转化为str(ascii默认编码)报错
磁盘字节串utf-8-->无法转为内存字节串str(ascii)
 
  • 错误2:str直接encode报错
>>> sys.getdefaultencoding()
'ascii'
>>> a="中国"
>>> a.encode("gbk")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
>>> b=u"中国"
>>> b.encode("gbk")
'\xd6\xd0\xb9\xfa'
变量a的类型是str(utf-8字节串),会自动调用decode(默认编码ascii),转为unicode,再调encode
按照默认编码去decode变量utf-8编码字节串会报错
 
 
  • 错误3:编码相互转换报错
>>> "中国".decode("utf-8").encode("ascii")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
>>> "中国".decode("utf-8").encode("gbk")
'\xd6\xd0\xb9\xfa'
>>> "a".decode("utf-8").encode("ascii")
'a'
 
ascii是utf-8的子集合,小集合转换大集合没有问题
大集合转为小集合就报错不支持
 
  • unicode不能再decode
>>> a = "中国"
>>> b = a.decode("utf-8")
>>> b
u'\u4e2d\u56fd'
>>> b.decode("utf-8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
 
  • 总结
理解编码错误时,首先要判断str时以什么编码存放在内存中的,然后判断是否符合转换公式(str-(decode)->unicode-(encode)->str)。
判断方法,在python2中用len(str)或者bytes(str)可以判断,中文utf-8占3个字节,gbk占2个字节,ascii占一个字节。
 
印光大师十念法(胡小林主讲第1集)
此生必看的科学实验-水知道答案

 

评论(0) 阅读(31)

python2字符串在内存中如何存放

2018年5月14日 14:07

  • str类型
存在磁盘上的格式与存在内存中格式一致,例如ascii编码占一个字节,utf-8编码中文3个字节,英文1个字节
gbk编码中文2个字节,英文一个字节
 
注意python2是不会自动转换成unicode格式
 
  • unicode类型
python2用来支持多语言,不同编码类型的str转换需要通过它
unicode表示字符串属于逻辑层面,字节串(str)表示存放格式属于物理层面,如ascii,utf-8,gbk属于字节串
 
  • ascii在内存中字节数(utf-8/gbk同样1个字节)
>>> sys.getsizeof("a")       #pyton做了包装,包含了其它数据内容
38
>>> sys.getsizeof("aa") - sys.getsizeof("a")   # 将字符重复一个求差值,可知单个字符长度
1
 
  • unicode在内存中长度(python2中4个字节)
>>> sys.getsizeof(u"aa") - sys.getsizeof(u"a")   #python2中4个字节、python3中2个字节
4
>>> sys.getsizeof(u"你你") - sys.getsizeof(u"你")
4
 
  • utf-8长度(3个字节)
>>> a1,a2="a".encode("utf-8"),"aa".encode("utf-8")
>>> sys.getsizeof(a2) - sys.getsizeof(a1)  #英文一个字节
1

>>> b1,b2="你".decode("utf-8").encode("utf-8"),"你你".decode("utf-8").encode("utf-8")
>>> sys.getsizeof(b2) - sys.getsizeof(b1)   #中文三个字节
3
同样的方法可以知道gbk英文一个字节,中文2个字节
 
 
印光大师十念法(胡小林主讲第1集)

 

Tags: python
评论(0) 阅读(68)

gbk英文字符占几个字节

2018年5月14日 12:24

  • gbk英文字符占几个字节
➜  ~ python3
>>> bytes("你", "gbk")
b'\xc4\xe3'
>>> bytes("a", "gbk")
b'a'
>>> bytes("你", "utf-8")
b'\xe4\xbd\xa0'
>>> bytes("a", "utf-8")
b'a'
gbk中文2个字节,英文1个字节;utf-8中文3个字节,英文1个字节
 
  • 字符占几个字节
英文字母:
字节数 : 1;编码:GB2312
字节数 : 1;编码:GBK
字节数 : 1;编码:GB18030
字节数 : 1;编码:ISO-8859-1(latin-1)
字节数 : 1;编码:UTF-8
字节数 : 4;编码:UTF-16
字节数 : 2;编码:UTF-16BE
字节数 : 2;编码:UTF-16LE


中文汉字:
字节数 : 2;编码:GB2312
字节数 : 2;编码:GBK
字节数 : 2;编码:GB18030
字节数 : 1;编码:ISO-8859-1(latin-1)
字节数 : 3;编码:UTF-8
字节数 : 4;编码:UTF-16
字节数 : 2;编码:UTF-16BE
字节数 : 2;编码:UTF-16LE
 
 
印光大师十念法(胡小林主讲第1集)

 

Tags: python
评论(0) 阅读(60)

函数默认值初始化引起的问题

2018年3月30日 17:58

函数的默认值只会创建一次,之后不会再变了,使用对象(列表、字典、实例)作为默认值,会导致函数混乱
  • 官方说明
  • 示例
def f(a, L=[]):
    L.append(a)
    return L
for i in range(3):
    print f(i)
#输出
[0]
[0, 1]
[0, 1, 2]
  • 规避方法
def f(a, t=None):
    t = t or []
    t.append(a)
    return t
 
印光大师十念法(胡小林主讲第1集)

 

评论(0) 阅读(500)

python打乱数组顺序

2017年6月22日 23:44

import random
a = [1, 2, 3, 4, 5];
random.shuffle(a)
print a
#[2, 3, 1, 5, 4]
此生必看的科学实验-水知道答案
为什么观看这部记录片
精神病为什么治不好
百病之源
净土大经科注2014

评论(0) 阅读(1533)

python取文件后缀

2017年6月22日 23:41

#取文件后缀
>>> os.path.splitext("/root/a.py")
('/root/a', '.py')

#取目录与文件名
>>> os.path.split("/root/a.py")
('/root', 'a.py')

此生必看的科学实验-水知道答案
为什么观看这部记录片
精神病为什么治不好
百病之源
净土大经科注2014

评论(0) 阅读(1565)

subprocess.Popen(cmd)包含中文怎么办

2017年4月22日 12:22

在windows中通过subprocess调用cmd命令行,命令中包含中文是很令人头痛的事。
由于cmd控制台用的是gbk编码,而python用的是utf-8。utf-8的字符串,在gbk编码的控制台上运行,当然会运行不了。
假如再要你兼容繁体版的windows,此时更麻烦了。还好python提供了本地化接口
 
  • 本地化
>>> import locale
>>> locale.getdefaultlocale()
('zh_CN', 'cp936')
 
  • 示例
import locale
cmd = cmd.encode(locale.getdefaultlocale()[1])
subprocess.Popen(cmd)
 
净土大经科注2014 百度网盘地址

http://pan.baidu.com/s/1gfaHvwv

评论(0) 阅读(962)

python获取自己的路径

2017年4月17日 22:51

exe路径

>>> sys.executable
'C:\\Python27\\python.exe'

lib路径

>>> sys.prefix
'C:\\python27'

 

评论(0) 阅读(504)

windows上subprocess.Popen的参数close_fds=True与管道不能共存

2017年3月21日 21:46

  • 运行命令
subprocess.Popen(cmd, close_fds=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
 
  • 出现错误
ValueError: close_fds is not supported on Windows platforms if you redirect stdin/stdout/stderr
 
  • 原因
在windows上subprocess.Popen的参数close_fds=True与stdin/stdout/stderr不能共存
  1. close_fds=True表示子进程将不会继承父进程的输入、输出、错误管道。
  2. windows上不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)
 

评论(0) 阅读(1035)