写Bug途中的碎碎念

  • 用字典时,注意key唯一值的唯一性,两个value对应相同key,但需要区分时,需要选用其他key(如数字)

    数据库主键同理,不容易确定唯一性/多简直可选用自增主键/uuid

Sqlite3

1
2
3
4
5
6
7
8
9
insert into TABLE_NAME [(column1, column2, column3,...columnN)] values (value1, value2, value3,...valueN);
/*如果要为表中的所有列添加值,可以不在语句中指定列名称。但要确保值的顺序与列在表中的顺序一致*/
insert into TABLE_NAME values (value1,value2,value3,...valueN);
update TABLE_NAME set column1 = value1, column2 = value2...., columnN = valueN where [condition]
delete from TABLE_NAME where [condition]

PRAGMA table_info('table_name') /*获取表的字段结构*/
select name from sqlite_db_name WHERE type='table_name' /*获取整个数据库表名*/

插入更新、插入忽略

操作字段 说明 Note
INSERT OR REPLACE INTO 如存在,则更新,否则插入 只对 PRIMARY KEY 或 UNIQUE 约束字段起作用
INSERT OR IGNORE INTO 如存在,则忽略,否则插入 只对 PRIMARY KEY 或 UNIQUE 约束字段起作用

表的连接

  • Like子句的两种通配符:百分号(%)代表零个、一个或多个数字或字符。下划线(_)代表一个单一的数字或字符。可以组合使用

  • Glob字句的两种通配符:星号(*)代表零个、一个或多个数字或字符。问号(?)代表一个单一的数字或字符。可以组合使用

    like子句的大小写不敏感,glob字句的大小写敏感

A join B on condition
只返回两张表匹配的记录,内连接(inner join)。
内连接 + A 无匹配记录,左连接(left join)。
内连接 + B 无匹配记录,右连接(right join)。
内连接 + A 、 B无匹配记录,全连接(full join)。

  • 内连接:满足连接条件的元组才能作为结果输出
  • 外连接(outer join)只支持左外连接:以join左边的表为主表进行连接,不满足连接条件的外连接列值为NULL
1
2
3
4
5
select name from sqlite_master where type='table' order by name  获取数据库的表名
PRAGMA table_info(“表名”) 获取表结构
create table table_name as select xx, xx where 将查询结果新建一个表
select * from data where work_date between 'ADate' and 'Bdate' 查询日期是否在某个范围时,转换成字符
select col1, col2.. from table1 inner join table2 on colA1=colA2 and colB1=colB2
  • 新增数据列未填入的值查询结果为None(NULL),填入后但又清除数据的查询结果为””(空字符串),但是过滤””的语句也可以过滤出NULL
  • 传入单值时,必须加括号、逗号使其成为元组形式,否则会按字符串的字符数传入参数:cursor.execute('INSERT INTO images VALUES(?)', (img,))

读取/写入文件

方法 说明
读取模式 ‘r’
写入模式 ‘w’ 如果文件不存在,则创建该文件;如果文件已存在且有内容,则在返回文件对象前清空该文件
附加模式 ‘a’ 如果文件不存在,则创建一个空文件;不会在返回文件对象前清空文件,写入行附加到末尾
读取和写入模式 ‘r+’ 文件不存在会报错FileNotFoundError
1
2
3
4
5
6
7
8
# 按行读取文件
with open(filename) as f:
for line in f:
print(line)
lines = f.readlines() # 是一个line组成的list
# 写入文件
with open(filename, 'w') as f:
f.wirte("helloworld")

Input()与getpass()

这个脚本请在命令行去执行, pycharm无法测试带getpass函数的脚本

1
2
3
4
5
6
import getpass
_username = "Admin"
_passwd = "abc,123"
username = input("请输入你的用户名:")
#getpass这个模块可以帮助你输入密码时把密码隐藏
passwd = getpass.getpass("请输入你的密码:")

变量类型与作用域

全局变量:在模块内、所有函数外、所有class外

局部变量:在函数内、在class的方法(类方法、静态方法、实例方法)内

1
2
3
4
x = "Num"
def change_x():
global x # 对全局变量赋值/修改值的时候,必须要先用global进行声明 否则x在赋值的时候会是局部变量
x = "Number"

format - 有效数字/小数位数/四舍五入

  • format:保留有效数字的关键字是g,小数点后n位数的则是f,还有科学计数法e和转换成百分比之后保留小数点后n位数的骚操作%
1
2
3
4
5
6
7
8
>>> format(12.456789, '.3g')
'12.5'
>>> format(12.456789, '.3f')
'12.457'
>>> format(12.456789, '.3e')
'1.246e+01'
>>> format(12.456789, '.3%')
'1245.679%'

docx Word交互

参考资料:

合并单元格文档:https://www.osgeo.cn/python-docx/dev/analysis/features/table/cell-merge.html

读取文字格式文档:https://blog.csdn.net/zhouz92/category_10094330.html

https://blog.csdn.net/zhouz92/article/details/107179616

1
2
3
4
5
6
7
8
9
10
11
12
13
14
docx = Document(docx_file_path)
tables = docx.tables//获取所有表格
table=tables[0]# 获取第一个表格
len(table.rows)# 获取行的总数
len(table.columns)# 获取列的总数
cell =table.cell(0,0).paragraphs[0] # 目标=表.cell(坐标).paragraphs[该单元第几段(从零开始)]
cell_run =table.cell(0,0).paragraphs[0].add_run(想要添加的内容 可以为空) # 插入一个文字块
cell_run.font.name='黑体' # 设置字体种类
cell_run.font.size=Pt(15) # 设置字体大小

# 表格单元插入图片 设置图片大小
from doxc import shared
cell_run.add_picture(photo_path)
cell_run.add_picture(photo_path, width=shared.Cm(6), height.cm(8)) # 只设置宽高的一个 自适应

re 正则表达式

  • Windows下的文件名:不符合命名规则的字符替换为下划线
1
2
3
4
5
import re
def validateTitle(title):
rstr = r"[\/\\\:\*\?\"\<\>\|]" # '/ \ : * ? " < > |'
new_title = re.sub(rstr, "_", title) # 替换为下划线
return new_title

os.walk()

文件、目录遍历器: 高效处理文件、目录方面的事,在Unix,Windows中有效

1
2
3
4
5
6
7
os.walk(top)
# 目录层级只能手动设定一个if判断
depth = 1
for root, subdir, filenames in os.walk():
if depth is 2:
break
depth += 1
  • top – 要遍历的目录的地址, 返回的是一个三元组(root,dirs,files)。
    • root 所指的是当前正在遍历的这个文件夹的本身的地址
    • dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
    • files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
  • topdown –可选,为 True,则优先遍历 top 目录,否则优先遍历 top 的子目录(默认为开启)。如果 topdown 参数为 True,walk 会遍历top文件夹,与top 文件夹中每一个子目录。

os.path/pathlib

分解文件路径

  • 提取单一后缀文件类型:os.path.splitext(file) ('F:/test/001', '.csv')
  • 提取文件路径中的文件名:os.path.basename(file) 001.csv
  • 分隔文件路径与文件名:os.path.split(file) ('F:/test', '001.csv')

文件名/文件路径后缀多个扩展名

获取文件名/文件路径后缀时:一个文件有多个扩展名(.tar.gz)/单扩展名

  • 只需要取文件路径/文件名后缀:os.path.splitext(str)[-1]
  • 需要分隔目录层/文件名/文件后缀,用pathlib.Path(str)
1
2
3
4
5
6
7
8
9
import pathlib

path = pathlib.Path('/Users/user/Documents/app_sample.tar.gz')
print('Parent:', path.parent)
print('Filename:', path.name)
print('Extension:', ''.join(path.suffixes))
# Parent: /Users/user/Documents
# Filename: app_sample.tar.gz
# Extension: .tar.gz

数据结构

List

去重复值:直接转换为set即可 set(listA)
两个List取差、交、并集:difference,intersection,union

1
2
3
set(listA).difference(set(listB))
set(listA).intersection(set(listB))
set(listA).union(set(listB))

排序sorted()与sort()

1
2
3
ListB = sorted(listA) # 有返回值 原列表对象不作修改
listA.sort() # 没有返回值 直接会对列表的对象进行排序
listA.sort(reverse=True) # reverse默认Flase升序

生成重复单一值List:['值']*3

dict

defaultdict(int/list/dict):设置字典默认值,int - 0,list - [],dict - {}

1
2
3
4
5
6
7
8
9
# 设置默认字典
def dic_default():
return {
"name": "",
"nums": 0
}
default_dict = defaultdict(dic_default)
# 默认值为dic_default函数的返回值{'name': '', 'nums': 0}
default_dict["group1"]

RuntimeError: dictionary changed size during iteration

循环遍历字典的值的同时,进行了字典pop数据报错:在迭代器对字典的键迭代的过程期间,不应修改字典,除非为现有键设置值(不允许删除/添加/update)

1
2
3
4
5
for key in my_dic.keys():
if key == my_id:
my_dic.pop(key) # 循环过程可能会产生该报错
# 修改方案:my_dic.keys() -> list(my_dic.keys()
for key in list(my_dic.keys()):

str

replace不会更改原字符串的数据,返回值为替换后的str

1
str.replace(old, new[, max])

demical

测试原始数据大部分都是浮点数,由于二进制的原因,python的float类型数据无法精确存用,demical go!

1
2
3
4
5
6
7
8
9
# 数字是否等于0 
>>> Decimal('-0.0').is_zero()
True
# 数字是否带负号
>>> Decimal('-0.0').is_signed()
True
# 取绝对值
>>> Decimal('-2.5').copy_abs()
Decimal('2.5')

Matplotlib

hist

Seaborn

seaborn 0.9中文文档

图形界面

Seaborn包含定制主题和高级界面,用于自定义和控制Matplotlib图形的外观。

1
2
seaborn.set()
seaborn.set_style("Darkgrid/Whitegrid/Dark/White/Ticks")

seaborn.distplot

1
seaborn.distplot(a, bins=None, hist=True, kde=True, rug=False, fit=None, hist_kws=None, kde_kws=None, rug_kws=None, fit_kws=None, color=None, vertical=False, norm_hist=False, axlabel=None, label=None, ax=None)

灵活绘制单变量观测值分布图。

该函数结合了 matplotlib 中的 hist函数(自动计算一个默认的合适的 bin 大小)、seaborn 的kdeplot()rugplot()函数。它还可以拟合scipy.stats分布并在数据上绘制估计的 PDF(概率分布函数)。

参数:a:Series、1 维数组或者列表。

观察数据。如果是具有name属性的 Series 对象,则该名称将用于标记数据轴。

bins:matplotlib hist()的参数,或 None。可选参数。

直方图 bins(柱)的数目,若填 None,则默认使用 Freedman-Diaconis 规则指定柱的数目。

hist:布尔值,可选参数。

是否绘制(标准化)直方图。

kde:布尔值,可选参数。

是否绘制高斯核密度估计图。

rug:布尔值,可选参数。

是否在横轴上绘制观测值竖线。

fit:随机变量对象,可选参数。

一个带有fit方法的对象,返回一个元组,该元组可以传递给pdf方法一个位置参数,该位置参数遵循一个值的网格用于评估 pdf。

{hist, kde, rug, fit}_kws:字典,可选参数。

底层绘图函数的关键字参数。

color:matplotlib color,可选参数。

可以绘制除了拟合曲线之外所有内容的颜色。

vertical:布尔值,可选参数。

如果为 True,则观测值在 y 轴显示。

norm_hist:布尔值,可选参数。

如果为 True,则直方图的高度显示密度而不是计数。如果绘制 KDE 图或拟合密度,则默认为 True。

axlabel:字符串,False 或者 None,可选参数。

横轴的名称。如果为 None,将尝试从 a.name 获取它;如果为 False,则不设置标签。

label:字符串,可选参数。

图形相关组成部分的图例标签。

ax:matplotlib axis,可选参数。

若提供该参数,则在参数设定的轴上绘图。

返回值:ax:matplotlib Axes

返回 Axes 对象以及用于进一步调整的绘图。

使用直方图和最大似然高斯分布拟合绘制分布图:

1
2
>>> from scipy.stats import norm
>>> ax = sns.distplot(x, fit=norm, kde=False)

离线安装whl库文件

  1. pip debug --verbose 查询当前python版本支持的whl标签

  2. pypi.org中搜索该模块的whl文件,下载对应适配的whl文件(Download filles如未支持低版本的python,可以去Release History中查看历史版本的whl文件)

  3. 对应的依赖模块whl也需要安装(注意安装顺序),如seaborn建立在matplotlib之上,并与pandas数据结构紧密关联。

  4. 将待安装whl放在C:/Python37/packages中,建一个requirements.txt文档,内容如下,并放在C:/Python37/Scripts文件夹下。

    1
    2
    scipy==1.1.0
    seaborn==0.11.2
  5. pip install --no-index --find-links=C:\python37\packages -r requirements.txt

  6. Done!

Linux

Console命令

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
# 查询两级目录下的文件结构,过滤文件类型doc/pdf/csv
tree -LAC 2 | grep -v '.doc' | grep -v '.pdf' | grep -v '.csv'

# 查询当前目录/当前登陆用户
pwd
whoami

# 查询文件夹权限
ll -R | grep "^d"
ll -r / ll -l
ls -al # 查看所有文件(包括隐藏文件)

# 更改文件的owner与group
chown demo:demo test.txt
chown demo:demo * # 修改当前前目录下的所有文件与子目录的拥有者

# 更改一个文件类型的权限为用户-组-其他用户均为可读可执行
chmod 555 *.utm4
chmod 555 *.tfl
# 添加脚本的执行权限
chmod +x 脚本文件名

# 文件与文件夹操作相关
mkdir 文件夹名 # 新建文件夹
touch 文件名 # 新建文件
rm 文件名 # 删除文件
rm -rf 文件夹名 #删除文件夹及里面所有内容

mv 移动文件

1
2
3
4
5
mv [options] source dest
mv [options] source... directory
# 修改文件名 - 目标目录与原目录一致,指定了新文件名,效果是重命名(该新文件名不存在)
# mv 默认是mv -i
mv /home/a.txt /home/b.txt
  • -b: 当目标文件或目录存在时,在执行覆盖前,会为其创建一个备份。
  • -i: 如果指定移动的源目录或文件与目标的目录或文件同名,则会先询问是否覆盖旧文件,输入 y 表示直接覆盖,输入 n 表示取消该操作。
  • -f: 如果指定移动的源目录或文件与目标的目录或文件同名,不会询问,直接覆盖旧文件。
  • -n: 不要覆盖任何已存在的文件或目录。
  • -u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作。

rm 删除文件/文件夹/文件夹中内容

  • rm- 代表删除
  • -f- 代表强制,例如,当您不想被询问/提示是否要删除archive时,它很有帮助。
  • -r- 代表递归,这意味着您要递归地遍历每个文件夹并删除所有内容。
1
2
3
rm -rf "/path/to the/directory/" 删除文件夹及里面所有文件
rm -rf "/path/to the/directory/"* 清空文件夹里非隐藏文件
rm -rf /path/to/directory/{*,.*} 清空文件夹里所有文件

tar 与zip

1
2
3
4
5
6
7
8
9
10
11
# tar.gz解压与压缩
tar -zcvf Zipname.tar.gz Dirpath/* #压缩
tar -zxvf Zipname.tar.gz #解压
tar -tf Zipname.tar.gz # 不解压查看压缩包中的所有文件目录
Dir1/Dir2/File
Dir1/Dir3/

# zip解压与压缩
zip [选项] 压缩文件名 需要压缩的文档列表
unzip [选项] 压缩文件名
zip -sf 压缩文件名 # 不解压查看压缩包中的所有文件目录

-c: 建立压缩档案
-x:解压
-t:查看内容
-r:向压缩归档文件末尾追加文件
-u:更新原压缩包中的文件
这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。
-z:有gzip属性的
-j:有bz2属性的
-Z:有compress属性的
-v:显示所有过程
-O:将文件解开到标准输出
下面的参数-f是必须的
-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。

1、*.tar 用 tar –xvf 解压
2、*.gz 用 gzip -d或者gunzip 解压
3、*.tar.gz和*.tgz 用 tar –xzf 解压 -xcf压缩
4、*.bz2 用 bzip2 -d或者用bunzip2 解压
5、*.tar.bz2用tar –xjf 解压
6、*.Z 用 uncompress 解压
7、*.tar.Z 用tar –xZf 解压
8、*.rar 用 unrar e解压
9、*.zip 用 unzip 解压

使用tar xvf .tar.gz压缩包,出现以下报错:

1
2
3
gzip: stdin: decompression OK, trailing garbage ignored
tar: Child returned status 2
tar: Error is not recoverable: exiting now

step1: gunzip *.tar.gz 先解压为tar格式
step2: tar xvf *.tar 再将tar格式解压为文件夹
step3: tar zcf *.tar.gz Dir/ 再压缩为tar.gz格式,由tar.gz格式解压就不会报错了

tree命令参数

1
tree [-aACdDfFgilnNpqstux][-I <范本样式>][-P <范本样式>][目录...]
  • -a 显示所有文件和目录。
  • -A 使用ASNI绘图字符显示树状图而非以ASCII字符组合。
  • -C 在文件和目录清单加上色彩,便于区分各种类型。
  • -d 显示目录名称而非内容。
  • -D 列出文件或目录的更改时间。
  • -f 在每个文件或目录之前,显示完整的相对路径名称。
  • -F 在执行文件,目录,Socket,符号连接,管道名称名称,各自加上”*”,”/“,”=”,”@”,”|”号。
  • -g 列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码。
  • -i 不以阶梯状列出文件或目录名称。
  • -L level 限制目录显示层级。
  • -l 如遇到性质为符号连接的目录,直接列出该连接所指向的原始目录。
  • -n 不在文件和目录清单加上色彩。
  • -N 直接列出文件和目录名称,包括控制字符。
  • -p 列出权限标示。
  • -P<范本样式> 只显示符合范本样式的文件或目录名称。
  • -q 用”?”号取代控制字符,列出文件和目录名称。
  • -s 列出文件或目录大小。
  • -t 用文件和目录的更改时间排序。
  • -u 列出文件或目录的拥有者名称,没有对应的名称时,则显示用户识别码。
  • -x 将范围局限在现行的文件系统中,若指定目录下的某些子目录,其存放于另一个文件系统上,则将该子目录予以排除在寻找范围外。
命令执行符号 格式 作用
: 命令1:命令2 多个命令顺序执行,命令之间没有任何逻辑联系
&& 命令1 && 命令2 当命令1正确执行,命令2才会执行;当命令1不正确执行,则命令2不会执行
ll 命令1 ll 命令2 当命令1正确执行,命令2不会执行;当命令1不正确执行,则命令2才会执行

shell脚本语言

初步看了眼shell脚本语言,可读性比python差很多,再加上现在linux系统都预装了python2.x版本,python Best!

1
2
3
4
5
chmod +x ./test.sh  #使脚本具有执行权限
./test.sh #执行脚本
test.sh内容如下,打印字符串
#!/bin/bash
echo "Hello World !"

Windows文件/Word/Excel相关

Word删除空行 - word中操作

删除所有空行:”^p”替换为””

多个空行保留一个空行: “^p^p”替换为”^p”

Python输出文件的文件名在Window下的非法字符检查

1
2
3
4
5
6
import re
def validateTitle(name_str):
r_str = r"[\/\\\:\*\?\"\<\>\|]" # '/ \ : * ? " < > |'
format_str = re.sub(rstr, "_", name_str) # 替换字符
return format_str