201013-UnicodeDecodeError: 'gb2312' codec can't decode byte

今天写个python爬虫时,发现一个有意思的问题,因为不同的目标网站的编码可能并不一样,所以再进行文本解析时,直接使用response.charset返回的编码格式进行处理文本,结果出现了上面这个问题,解决方法也比较简单,改用gbk即可

1
2
3
4
5
6
7
8
9
10
fp = open(file, 'r', encoding='gb2312')
# 替换为
fp = open(file, 'r', encoding='gbk')

### http访问方式
if response.charset == 'gb2312':
code = 'gbk'
else:
code = response.charset
raw = await response.text(encoding=code)

200929-Python 批量修改文件名

遇到一个实际的场景,需要针对某个目录下的所有文件进行统一规则的重命名,使用shell脚本是一个比较好的选择,此外python也可以快速的实现

下面介绍一下核心代码

1
2
3
4
5
6
7
8
9
import os

for p, n, filename in os.walk('./'):
# 获取目录下所有的文件
i = 0
for file in filename:
# 遍历文件名,依次重命名
os.rename(file, 'out_%02d' % (i))
i + =1

200902-python3 启动服务器

python内置了一个非常简单的服务器,可以用来实现简单的http通信

如python3 启动服务器命令

1
2
3
4
5
# 默认端口号为8000
python3 -m http.server

# 指定端口号为9000
python3.7 -m http.server 9000

如果是python2,需要启动服务器,可以使用命令

1
python -m SimpleHTTPServer 9000

200623-Python url编码

Python提供了较好的url编码封装,常借助 parse来实现,一般常见的使用姿势有两种

1
2
3
4
5
6
7
8
9
10
11
12
>>> from urllib import parse
# 直接对字符串进行url编码
>>> parse.quote('一灰灰Blog')
'%E4%B8%80%E7%81%B0%E7%81%B0Blog'
# 解码
>>> parse.unquote('%E4%B8%80%E7%81%B0%E7%81%B0Blog')
'一灰灰Blog'

# 对一个字典进行url编码,并组装成url参数
>>> p = {'a': '12+23', 'b': '一灰灰blog'}
>>> parse.urlencode(p)
'a=12%2B23&b=%E4%B8%80%E7%81%B0%E7%81%B0blog'

200527-Python 获取本机Ip和主机名

python中获取本机ip以及主机名

1
2
3
4
import socket

hostname = socket.gethostname()
ip = socket.gethostbyname(hostname)

200526-python int list转String

在python中,可以直接通过','.join的方式来连接一个list,但是如果list中的元素不是string,会报错

1
2
3
4
5
6
>>> a = [1,2,3]
>>> ','.join(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected str instance, int found
>>>

针对非string元素的列表的转换时,可以考虑借助表达式语言来处理,如下

1
2
3
4
>>> a = [1,2,3]
>>> ','.join([str(x) for x in a])
'1,2,3'
>>>

200509-python3 Pip install ssl certificate问题

python3.7 通过pip进行安装时,提示ssl certificate问题

如下提示:

1
2
pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) - skipping

解决办法,用国内镜像源

1
pip install aiohttp -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

200109-Python redis使用手册上篇

本文可作为redis的操作指南,介绍redis命令对应的python使用姿势

191121-Python 科学计数法误用引起的血案

记录一个代码中误用科学计数法导致所有的数据增大十倍的问题

科学计数法用e表示,后面跟上数字n,表示10的n次方;然后10^8用科学计算法怎么写?

正确写法

1
1e8  # 前面的1不能缺少

错误用法

1
10e8  # 这个实际上是10亿

191104-Python 封装一个通用日志插件

日志对于一个应用程序而言,不可获取;特别是在问题定位,链路分析往往是最直观,最有效的富足工具;所以在python中可以怎样便捷的使用日志模块呢

191015-Python markdown转html

本篇将介绍如何利用python来实现markdown文档转html

1. 依赖安装

我们主要借助 python-markdown这库来实现markdown转html的功能,官方安装教程如下

https://python-markdown.github.io/install/

python的依赖包安装相对简单,直接使用pip

1
pip install markdown

191009-Python之定义函数参数、返回类型

python虽然是一个弱类型的语言,在编码中,不需要特别声明参数类型,然而在实际的场景中,这种不现实指定参数类型经常会带来预期之外的问题,而且编译器还不会提示错误

如果我有一个函数,对参数类型和返回类型都有要求,可以怎么做?

1
2
def 函数名(参数: 参数类型...) -> 返回值类型:
pass

190808-Python CSV读写解决中文乱码问题

一般而言,我并不会直接操作excel文件,如果需要输出表格的时候,我会选择csv文件,用英文逗号来分割不同的单元格;csv文件的优点是简单,文本格式,vim可以直接打开编辑,excel也可以打开可以方便的转换为excel文档;可以说即适合开发人员,也适合给运营同学

然而有个蛋疼的问题,csv文件中文乱码问题,下面记录下,在python中如何解决

190717 Python 内置函数之zip

接收一个or多个迭代器,将对象中对应的元素打包成一个个元组,如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同

1
2
3
4
5
6
7
>>> list(zip([1,2,3], ['a', 'b', 'c']))
[(1, 'a'), (2, 'b'), (3, 'c')]
>>> list(zip([1,2,3], ['a', 'b', 'c'], ['!', "@"]))
[(1, 'a', '!'), (2, 'b', '@')]

>>> list(zip(*[(1, 4), (2, 5), (3, 6)]))
[(1, 2, 3), (4, 5, 6)]

说明:借助*可以将zip打包的元组解压为之前的数据

190717 Python 内置函数之vars

返回对象object的属性和属性值的字典对象

1
2
3
4
5
6
>>> class A:
... x = 10
... y = 20
...
>>> vars(A)
mappingproxy({'__module__': '__main__', 'x': 10, 'y': 20, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None})

190717 Python 内置函数之type

返回参数类型

  • type: 不认为子类与父类类型相同
  • isinstance: 子类是一种父类类型

语法

1
2
type(object)
type(name, bases, dict)

上面两种用法表示的含义不同

  • 一个参数:返回对象类型
  • 三个参数:根据定义返回一个新的类型对象
    • name 类名
    • bases 父类
    • dict 字典

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> type('str')
<class 'str'>
>>> type(b'123')
<class 'bytes'>
>>> type('123')
<class 'str'>

>>> x = type('x', (object,), dict(a=1))
>>> x
<class '__main__.x'>
>>> a = x()
>>> a.a
1

190717 Python 内置函数之tuple

将可迭代系列(如列表)转换为元组

1
2
3
4
>>> tuple([1,2,3])
(1, 2, 3)
>>> tuple({'a': 1, 'b': 2})
('a', 'b')

190717 Python 内置函数之super

访问父类中的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
>>> class A:
... def m(self):
... return 'A'
>>> class B:
... def m(self):
... return 'B'
...

>>> class C(A):
... def m(self):
... print(super().m())
...
>>> C().m()
A

>>> class D(A,B):
... def m(self):
... a = super(D, self).m()
... print(a)
...
>>> D().m()
A

注意,在多继承时,会从左到右找匹配的方法,广度优先

190717 Python 内置函数之str

将对象转化为字符串

1
2
3
4
5
6
7
8
>>> str([1,2,3])
'[1, 2, 3]'
>>> str((1,'a'))
"(1, 'a')"
>>> str({'a': 123, 'b': 456})
"{'a': 123, 'b': 456}"
>>> str(b'hello')
"b'hello'"

190717 Python 内置函数之staticmethod

修饰静态方法

1
2
3
4
5
6
7
>>> class A:
... @staticmethod
... def m():
... return 10
...
>>> A.m()
10

190717 Python 内置函数之sorted

对所有可迭代的对象进行排序

1. 语法

1
sorted(iterable, key=None, reverse=False)
  • iterable: 可迭代对象
  • key: 用于比较排序的元素
  • reverse: True降序 False升序

返回排好序的列表

2. 实例

1
2
3
4
5
6
7
8
>>> a = [1,3, 2, 9, 4]
>>> sorted(a)
[1, 2, 3, 4, 9]
>>> a
[1, 3, 2, 9, 4]
>>> a.sort()
>>> a
[1, 2, 3, 4, 9]

注意:列表的sort()方法无返回直接作用于列表; sorted()有返回,原对象不变

1
2
3
>>> a=[('b',2),('a',1),('c',3),('d',4)]
>>> sorted(a, key=lambda x:x[1])
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

II. 其他

1. 一灰灰Bloghttps://liuyueyi.github.io/hexblog

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

2. 声明

尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

3. 扫描关注

一灰灰blog

QrCode

190717 Python 内置函数之slice

切片,主要用于切片操作函数里的参数

语法

1
2
slice(stop)
slice(start, stop[,step]
  • start: 开始位置
  • stop: 结束位置
  • step: 步长

举例

1
2
3
4
>>> list(range(0, 10))[slice(4)]
[0, 1, 2, 3]
>>> list(range(0, 10))[slice(2, 8, 3)]
[2, 5]

190717 Python 内置函数之setattr

与 getattr对应,设置属性值(属性可以不存在)

1
2
3
4
5
6
7
class A:
... x = 10
...
>>> a = A()
>>> setattr(a, 'b', 20)
>>> a.b
20

190717 Python 内置函数之set

创建一个无序不重复元素集

1
2
3
4
>>> set([1,2,3,2,1])
{1, 2, 3}
>>> set('hello')
{'h', 'o', 'e', 'l'}

注意传参为可迭代对象

190716 Python 内置函数之round

返回浮点数 x 的四舍五入值,准确的说保留值将保留到离上一位更近的一端(四舍六入)

会有精度丢失,要求高的,不要用

1
2
3
4
5
6
>>> round(2.674, 2)
2.67
>>> round(2.675, 2)
2.67
>>> round(2.6751, 2)
2.68

注意,如果保留位的后一个为5时,需要再往后看一位,如果有,则进;没有则舍

190716 Python 内置函数之repr

返回对象的string格式

1
2
3
4
5
6
7
8
9
>>> repr([1,2,3])
'[1, 2, 3]'
>>> repr('bca')
"'bca'"
>>> class A:
... x = 10
...
>>> repr(A())
'<__main__.A object at 0x10f079f98>'

190716 Python 内置函数之range

返回可迭代的对象

语法

1
range(start, stop[,step])
  • start: 默认从0开始
  • stop: 到stop结束,不包含stop
  • step: 步长

举例

1
2
3
4
>>> list(range(0, 10, 3))
[0, 3, 6, 9]
>>> list(range(2))
[0, 1]

190716 Python 内置函数之print

可以说是最常见的一个函数了,除了常见的输出在终端之外,还支持输出到文件

语法定义

1
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
  • objects: 输出的对象,用英文逗号分隔
  • sep: 多个对象输出时,间隔符号
  • end: 结尾符号
  • file: 写入的文件对象,sys.stdout标准输出
  • flush: 写文件时,如果设置True,表示强制刷新

190716 Python 内置函数之pow

计算n次方

1
2
3
4
5
6
>>> pow(4, 0.5)
2.0
>>> pow(4, 2)
16
>>> pow(100, -2)
0.0001

190716 Python 内置函数之ord

与前面介绍的chr配对,返回字unicode字符对应的ascii/unicode码

1
2
3
4
5
6
>>> ord('a')
97
>>> ord('灰')
28784
>>> chr(28784)
'灰'

190716 Python 内置函数之open

打开文件,常配合with语句使用

语法

1
open(file, mode='r',  buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

参数说明

  • file: 必需,文件路径(相对或者绝对路径)。
  • mode: 可选,文件打开模式
  • buffering: 设置缓冲
  • encoding: 一般使用utf8
  • errors: 报错级别
  • newline: 区分换行符
  • closefd: 传入的file参数类型

190716 Python 内置函数之next

返回迭代器的下一个元素

语法

1
next(iterator[,default]
  • iterator: 可迭代对象
  • default: 没有下一个元素时返回的默认值,不设置时,没有元素抛异常

实例

1
2
3
4
5
>>> a = iter([1,2,3])
>>> next(a)
1
>>> next(a)
2

从上面的case,也可以大致看出它常配合while循环一起使用

190716 Python 内置函数之min

返回给定参数中的最小值

1
2
3
4
5
6
>>> min(1,2,3)
1
>>> min([1,2,3])
1
>>> min([1,2,3], [4,3,2])
[1, 2, 3]

190716 Python 内置函数之memoryview

内存查看对象,是指对支持缓冲区协议的数据进行包装,返回元组列表

1
2
3
4
5
6
7
>>> memoryview(b'abc')
<memory at 0x10efa4348>
>>> memoryview(b'ab')
<memory at 0x10efa44c8>
>>> a = memoryview(b'ab')
>>> a[0]
97

190716 Python 内置函数之max

返回给定参数中的最大值

1
2
3
4
>>> max(1,2,3)
3
>>> max([1,2,3], [4,2,1])
[4, 2, 1]

190716 Python 内置函数之map

根据提供的函数,对传入的序列做映射

语法定义如下

1
map(function, iterable, ...)
  • function: 函数
  • iterable: 一个or多个序列
  • 返回迭代器

实例如下

1
2
3
4
5
6
7
8
9
>>> list(map(lambda x: x ** 2, [1, 2, 3, 4, 5]))
[1, 4, 9, 16, 25]

>>> for i in map(lambda x, y: x+y, [1,2,3], [10, 20, 30]):
... print(i)
...
11
22
33

190716 Python 内置函数之locals

global对象,返回全部局部变量

1
2
3
4
5
6
>>> def m():
... a = 10
... print(locals())
...
>>> m()
{'a': 10}

190716 Python 内置函数之list

将元组或字符串转换为列表

1
2
3
4
5
>>> aTuple = (123, 'hello', {'a':123})
>>> list(aTuple)
[123, 'hello', {'a': 123}]
>>> list('hello world')
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']

190716 Python 内置函数之len

len()可以用来返回字符串,列表,字典,集合,元组等的长度or个数

1
2
3
4
>>> len([1,2,3,4])
4
>>> len('1sdfa')
5

190716 Python 内置函数之iter

iter主要用来生成迭代器,简单来讲就是可以将一个obj对象,生成迭代器,可以走for循环

190716 Python 内置函数之issubclass

判断参数class 是否是类型参数 classinfo 的子类。

1
issubclass(class, classinfo)

请注意:两个参数必须都是类

这个比较好理解了,简单举例说明

1
2
3
4
5
6
7
8
>>> class A:
... x = 10
...
>>> class B(A):
... y = 10
...
>>> issubclass(B, A)
True

如果我们需要判断一个对象的类型,则推荐使用上一篇介绍的isinstance(),如

1
2
>>> isinstance(B(), A)
True

190716 Python 内置函数之isinstance

因为python是弱类型语言,所以拿到一个变量我们实际上是不确定它是什么类型的,这个时候就可以借助isinstance来判定

1
2
3
4
>>> isinstance('123', int)
False
>>> isinstance('123', str)
True

190716 Python 内置函数之int

将一个字符串或数字转换为整型

注意:int函数第二个参数可以指定进制数,实现将其他进制的字符串转换为十进制的整数

1
2
3
4
5
6
7
8
>>> int('11')
11
>>> int('11', 2)
3
>>> int('11', 8)
9
>>> int('11', 16)
17

上面分别演示的是十进制、二进制、八进制、十六进制的字符串转整数

190716 Python 内置函数之input

接收标准输入,返回String类型,用于与外界打交道

1
2
3
4
>>> a = input('enter: ')
enter: hello world
>>> a
'hello world'

190716 Python 内置函数之id

返回对象的唯一标识符,标识符是一个整数

1
2
3
4
>>> id('hello world')
4422041520
>>> id('hello worl')
4422041520

注意,上面两个字符串并不一样,但是返回的标识相同,实际上这两个字符串指向的是同一个内存,只是长度不一样而已

190716 Python 内置函数之help

help,主要就是用来显示帮助信息,如果对某个函数的用法不太清楚,就可以直接通过help来查看(在普遍用idea作为开发工具的情况下,基本上不太会用到…)

1
help('str')
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×