Fork me on GitHub

Python中的部分tricks整理

本文整理了本人遇到的一些tricks。主要包括:

  • pycharm快捷键整理
  • 爬虫中的日志记录(logging)、取消SSL警告、字符过滤(re.sub)与查找(find)、文件删除(os)与文件保存(pickle)、词云(wordcloud)的使用
  • 图像处理的部分基本操作(PIL,numpy)。

0 pycharm 快捷键

注释/反注释

Ctrl+斜杠,也就是 Ctrl + / 注释与反注释都是这个组合键。

块注释

Ctrl+Shift+斜杠

格式化代码

ctrl + alt + F: 格式化代码(用了JetBrains的IDE之后就习惯性地格式化一下),代码规范化。

复制当前行

Ctrl + D复制当前行

另起一行

shift + enter : 向下另起一行,光标在行内任意位置都能另起一行,且不破坏当行结构
ctrl + alt + enter : 向上另起一行

查看注释

Ctrl + q: help 查注释,查询documentation

搜索功能

ctrl + shift + a : 搜索功能: 搜索IDE功能,比如想看看这个文件的历史,就键入history 可以找到 Local history

万能提示键

ctrl + alt + space: 万能提示键(在Keymap中搜索basic可以找到并修改它)PyCharm的会根据上下文提供补全。

run相关的快捷键

根据具体设置可能略有差异,笔者采用的是
VS风格(可在File->Settings->Keymap中设置)的快捷键。
ctrl + F9 : run the current file (跑当前页面的程序)
F9 : resume the program (中断后)重新开始程序
ctrl + F5: run the specific program(直接跑上一个程序)
F5: debug(弹出debug目录,自行选择运行的文件)
alt + shift + F10 : 运行程序(弹出run目录)

其他技巧

ctrl + shift + 数字键ctrl + 数字键 : 书签功能
Ctrl + 鼠标点击 : 查看内置函数啥的
alt + 上下箭头 : preview/next method (def/class)
debug的时候可以在断点打开Python console然后改变量值
Ctrl+ Bshift + →,查看源码时很方便,至少在vim下看库的源码没那么容易。对Python程序员而言,看源码很重要
shift + F6 : 重命名,这太重要了,vim没有吧。即使有,那它也没法重构Flask和Django的template下的指令吧。

1 python信息同时输出到控制台与文件

1.1 问题

python编程中,往往需要将结果用print等输出,如果希望输出既可以显示到IDE的屏幕上,也能存到文件中(如txt)中,该怎么办呢?

1.2 解决方案

可通过日志logging模块输出信息到文件或屏幕。但可能要设置log的level或输出端,对于同时需要记录debug error等信息的较为合适,官方教程推荐学习用更规范的logger来操作。
例如,可参考来自官网的这段代码。

1
2
3
4
5
import logging
logging.basicConfig(filename='log_examp.log',level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')

其中的level=logging.DEBUG会显示Debug调试信息,若想显示普通的输出信息,可以换成level=logging.INFO


























程度 使用场景
DEBUG 获得诊断问题是具体的信息
INFO 确认程序是否按正常工作
WARNING 在程序还正常运行时获取发生的意外的信息,这可能会在之后引发异常(例如磁盘空间不足)
ERROR 获取程序某些功能无法正常调用这类严重异常的信息
CRITICAL 获取程序无法继续运行的这类最严重异常信息

1.3 改变默认输出信息的格式

1
2
3
4
import logging
# output format: output time - logging level - log messages
logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s')
logging.warning('This message will appear in python console.')

python console中直接打印以下输出:

1
2016-8-2 2:59:11, 510 - WARNING - This message will appear in python console

2 Python中将打印输出导向日志文件

利用sys.stdout将print行导向到你定义的日志文件中,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import sys
# make a copy of original stdout route
stdout_backup = sys.stdout
# define the log file that receives your log info
log_file = open("message.log", "w")
# redirect print output to log file
sys.stdout = log_file
print "Now all print info will be written to message.log"
# any command line that you will execute
...
log_file.close()
# restore the output to initial pattern
sys.stdout = stdout_backup
print "Now this will be presented on screen"

这样子只会打印到日志文件,而控制台没有输出了,笔者一般不采用这种方法。

3 python3使用requests请求HTTPS取消SSL验证警告

3.1 问题描述

使用requests库请求HTTPS时,因为忽略证书验证,导致每次运行时都会报错(警告):

1
2
D:\python\Python35\lib\site-packages\urllib3\connectionpool.py:858: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
InsecureRequestWarning)

3.2 解决方法

虽然这并不影响结果的正确,但是这个提示一直存在,看着是真的别扭,尤其需要输出到报告或者是日志的时候。代码加入下面两行,取消这个警告。

添加如下的这两行代码:

1
2
3
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

python3也可以的。我的pycharm中会显示找不到该库,不过没问题,依旧可以跑,应该是pycharm本身的问题。

4. python过滤中文、英文标点特殊符号

4.1 垃圾邮件过滤实例

下面是一封垃圾邮件的过滤实例:

1
"想做/ 兼_职/学生_/ 的 、加,我Q: 1 5. 8 0. !!?? 8 6 。0. 2。 3 有,惊,喜,哦"

邮件中的“!?。、”都是中文的,而“/.”是英文的

下面是采用re正则项过滤方式:

1
2
3
4
5
6
import re
temp = "想做/ 兼_职/学生_/ 的 、加,我Q: 1 5. 8 0. !!?? 8 6 。0. 2。 3 有,惊,喜,哦"
temp = temp.decode("utf8")
string = re.sub("[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。?、~@#¥%……&*()]+", "", temp) # 将temp中若存在的前面的这一长串替换为空的。
print(string)

4.2 目录名称过滤实例

此外,比如说目录命名时,也需要过滤掉/|等,如下:

1
2
dirName = re.sub("[\s+\.\!\/_,$%^*(+\"\'?]+|[+——!,。?、~@#¥%……&*()]+", "", dirName)
os.mkdir(dirName)

5. Markdown之表格table的处理

插入表格代码如下:

1
2
3
4
5
6
7
8
9
10
<table class="table table-bordered table-striped table-condensed">
<tr>
<td>北京</td>
<td>雾霾</td>
</tr>
<tr>
<td>深圳</td>
<td>暴雨</td>
</tr>
</table>

发现table加了个class属性,如果只是table标签 将不起作用。

table-bordered:带圆角边框和竖线
table-striped:奇偶行颜色不同
table-condensed:压缩行距

除了以上另外还有其他可供选择:

1、如果需要表头跟内容不一样,可以将<td>表头内容</td>换成<th>表头内容</th>

2、如果表格内文需要换行,可以在要换行的内容后加入<br>,后面的内容就会跑到下一行。

3、如果内文中有代码,需要特别显示,可使用:<code>代码</code>

4、如果表格中有需要设为斜体的内容,可使用:<I>要设为斜体的内容</I>

5、如果有跨行或者跨列的单元格,可用<th colspan="跨列数">内容</th>rowspan

6、如果要调整某一列的宽度,可使用:<th width="宽度值或百分比">表头内容</th>

6. 用numpy打开图像和保存图像

1
2
3
4
5
6
7
8
9
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
from PCV.tools import imtools
import numpy
im = array(Image.open('C:/pic/train2/1.jpg').convert('L')) # 打开图像,并转成灰度图像
img11=Image.fromarray(uint8(im))
img11.save("C:/pic/train2/10.jpg")# 保存灰度图像

补充用opencv打开和保存图像:

1
2
3
4
5
#coding=utf-8
import cv2
img = cv2.imread("C:/pic/train1/2.jpg", 0)
cv2.imwrite('C:/pic/1/5.jpg',img)

7. PIL.Image转换为OpenCV支持的Image格式

可参考:http://www.mobibrw.com/2017/7381

后来放弃了。不太方便。

8. 使用pickle把数据保存到文件

8.1 实例一

使用pickle模块从文件中重构python对象。

1
2
3
4
5
6
7
8
9
10
11
import pprint, pickle
pkl_file = open('data.pkl', 'rb')
data1 = pickle.load(pkl_file)
pprint.pprint(data1)
data2 = pickle.load(pkl_file)
pprint.pprint(data2)
pkl_file.close()

8.2 实例二

其中,friend是从网页获得的数据,先保存下来,以备后续处理。

1
2
3
4
5
6
7
# 获取好友列表
friends = itchat.get_friends(update=True)[0:]
output = open('data.pkl', 'wb')
# Pickle dictionary using protocol 0.
pickle.dump(friends, output)
output.close()

读取保存的文件,用于后续处理。

1
2
3
4
import pickle, re
pkl_file = open('data.pkl', 'rb')
friends = pickle.load(pkl_file)

9. 解决Python词云库wordcloud不显示中文的问题

9.1 安装

安装命令:

pip install wordcloud

9.2 解决方案

实例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# -*- coding: utf-8 -*-
from wordcloud import WordCloud
import matplotlib.pyplot as plt
text = '''文案 文案
The 抱抱 Zen of LOVE 抱抱 Python, 快乐 by Tim Peters
公众号 公众号 Python 最好的 语言 语言
一辈子 is better LOVE than 一辈子.
喵小姐 is 爱你 than implicit.爱你 喵小姐
蟹先生 is 爱你 than complex.
一辈子 is 蟹先生 than complicated.
二中 is 喵小姐 我想你了 than nested. 二中 蟹先生
清湖 is 胜于 than 清湖.
思旺 counts. 想你
Special 喵小姐 我想你了 aren't special enough 思旺 break 思旺 rules.
别生气 practicality beats 厨艺好.
Errors should 我想你了 never pass 小龙虾 silently. 运营
别生气 explicitly 好不好. LOVE
In the face of ambiguity, 程序员 the 厨艺好 to guess.龙华 龙华
There 快乐 should be one-- 我想你了 and preferably 红烧肉 only one 小龙虾--obvious way to do it.运营
Although 共享单车 way may not 我想你了 be obvious at first unless you're Dutch. 新媒体 地铁
Now is better 红烧肉 than never.
程序员 Although 共享单车 is often 高铁 than 东莞 now. 高铁 地铁
If the implementation 想你 is hard to explain, it's a bad idea. 想你了
If 成都 implementation is 想你 easy to explain, it may be a good idea.
Namespaces are 端午one 端午 honking great idea -- 成都 do more of those! 想你了
深圳 晚安 深圳 新媒体
'''
# the font from github: https://github.com/adobe-fonts
font = r'C:\Windows\Fonts\simfang.ttf'
wc = WordCloud(collocations=False, font_path=font, width=1400, height=1400, margin=2).generate(text.lower())
plt.imshow(wc)
plt.axis("off")
plt.show()
wc.to_file('show_Chinese.png') # 把词云保存下来

10. PIL库图片基本操作

1.打开图片

1
2
import Image
img=Image.open("code.jpg")

注:有些图片名称是包含中文的,就需要在“”前加上u,例:

1
img=Image.open(u"阿布.jpg")

2.展示图片

1
img.show()

3.保存图片

1
img.save("img1.png","png")

说明:img为一个图片,存为一个名叫img1的图片,格式为png。后面的png不写也可以,直接按照文件名的后缀.png存为相应格式了。

4.旋转图片rotate

fixedIm=img.rotate(90)
fixedIm.save("fixedIm.png","png")

说明:fixedIm=img.rotate(90),将图片img逆时针旋转90度,存到fixedIm中。

更多操作可参考:
http://www.cnblogs.com/meitian/p/3699223.html

python删除文件

1
2
3
4
5
6
7
import os
# 删除文件:
os.remove()
#删除空目录:
os.rmdir()
# 递归删除空目录:
os.removedirs()

递归删除目录和文件(类似DOS命令DeleteTree):

1
2
3
4
5
6
7
8
9
10
# Delete everything reachable from the directory named in 'top',
# assuming there are no symbolic links.
# CAUTION: This is dangerous! For example, if top == '/', it
# could delete all your disk files.
import os
for root, dirs, files in os.walk(top, topdown=False):
for name in files:
os.remove(os.path.join(root, name))
for name in dirs:
os.rmdir(os.path.join(root, name))

参考自:python 删除文件

Python3 find()方法

描述

find()方法检测字符串中是否包含子字符串str,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果指定范围内如果包含指定索引值,返回的是索引值在字符串中的起始位置。如果不包含索引值,返回-1。

语法

find()方法语法:

str.find(str, beg=0, end=len(string))

参数

str:指定检索的字符串
beg:开始索引,默认为0。
end:结束索引,默认为字符串的长度。

返回值

如果包含子字符串返回开始的索引值,否则返回-1。

实例

以下实例展示了find()方法的实例(Python 3.0+):

1
2
3
4
5
6
7
8
#!/usr/bin/python3
str1 = "Runoob example....wow!!!"
str2 = "exam";
print (str1.find(str2))
print (str1.find(str2, 5))
print (str1.find(str2, 10))

以上实例输出结果如下:

7

7

-1

实例(Python 3.0+)

1
2
3
4
5
6
7
8
>>>info = 'abca'
>>> print(info.find('a')) # 从下标0开始,查找在字符串里第一个出现的子串,返回结果:0
0
>>> print(info.find('a', 1)) # 从下标1开始,查找在字符串里第一个出现的子串:返回结果3
3
>>> print(info.find('3')) # 查找不到返回-1
-1
>>>

参考资料

------ 本文结束感谢您的阅读 ------
坚持原创技术分享,您的支持将鼓励我继续创作!