python学习

print 输出颜色:
\033[显示方式;前景色;背景色m
print(’\031[0;32;40m欢迎使用学生选课系统\033[0m’)
print
数值表示的参数含义:

前景色 背景色 颜色

30 40 黑色
31 41 红色
32 42 绿色
33 43 黃色
34 44 蓝色
35 45 紫红色
36 46 青蓝色
37 47 白色

显示方式 意义

0 终端默认设置
1 高亮显示
4 使用下划线
5 闪烁
7 反白显示
8 不可见

\033[0m 默认字体正常显示,不高亮
\033[32;0m 红色字体正常显示
\033[1;32;40m 显示方式: 高亮 字体前景色:绿色 背景色:黑色
\033[0;31;46m 显示方式: 正常 字体前景色:红色 背景色:青色

conda的作用:

  1. conda可以给我们提供一个独立的环境,相当于python的virtualenv
    conda create -name envname python=2.7
    activate envname
  2. conda info -envs 列出conda创建所有的环境
    conda版本:conda --version
    更新conda:conda update conda
    切换回当前环境:deactivate
    删除环境:conda remove --name flowers --all
    制作环境副本:conda create --name flowers --clone snowflakes
    查看在环境中安装的第三方包:conda list
    搜索可安装的包:conda search
    安装新软件:conda install --name packagename beautifulsoup4
    也可以使用pip安装:pip install pkg
    也可以从其它页面下载安装:conda install --channel https://conda.anaconda.org/pandas bottleneck
    删除环境的第三方包:conda remove --name envname pck或者 pip uninstall pck
    删除conda:rm -rf ~/miniconda OR rm -rf ~/anaconda

Surround with: Ctrl+Alt+T
智能补全Tab
删除当前行: Ctrl+X
复制当前行: Ctrl+D
另起一行: Shift+Enter
查看参数: Ctrl+P
查注释(docstring): Ctrl+Q
查定义的(源代码): Ctrl+B/Ctrl+I
运行当前文件: Ctrl+Shift+F10
重构Refactor: Ctrl+Alt+Shift+T

pyinstall -F -c “demo.py”
参数 含 义
-F 只生成一个exe文件
–distpath 指定生成的exe存放的目录
–workpath 指定编译中临时文件存放的目录
-D 创建一个目录包含:exe文件、依赖文件
-i 指定exe图标
-p 指定exe依赖的包、模块
-d 编译为debug模式,获取运行中的日志信息
-clean 清理编译时临时文件
-c 使用控制台
-w 使用窗口
-version-file 添加exe版本信息

pipenv
pipenv install 在当前目录下创建虚拟环境
pipenv --python 3.6 根据指定版本创建环境
pipenv shell 激活环境
pipenv run python --version 直接运行命令
pipenv install flask==0.12.1 安装模块
pipenv uninstall numpy
pipenv --venv 当前环境目录
pipenv --where 当前项目根目录
exit 退出当前环境

【【文件和文件路径操作】】
文件操作
os.mkdir()/makedirs() 创建文件夹和递归创建文件夹,区别在于后者会把不存在的父级目录也创建出来。
os.rmdir()/removedirs()删除和递归删除文件夹,都要求必须是空目录,及不存在文件。
os.rename(filename,newname)文件改名
os.listdir(dir) 列出当前文件夹下的所有目录和文件
os.remove(path) 删除文件,如果要删除的是文件夹,抛出OSError异常

shutil.copyfile(src, dst) 复制文件,当文件已存在时直接覆盖
shutil.copy(src, dst) 复制文件,DST可以是目录,会在该目录下创建同名文件。
shutil.copytree(src, dst, symlinks=False, ignore=None) 将文件夹复制到另一个文件夹下。
shutil.rmtree(path, ignore_errors=False, οnerrοr=None) 移除文件夹和文件夹下所有文件
shutil.move(src, dst) 移动文件

shutil.make_archive(base_name, format, root_dir, …) 把root_dir下的的文件夹打包成一个叫base_name的压缩文件。
base_name:压缩的文件名,如./abc,不允许有扩展名,因为扩展名由format决定,一般为zip。
root_dir:要压缩的文件夹,压缩该文件夹下所有文件,压缩包不带文件夹。
format:压缩包种类,“zip”, “tar”, “bztar”,“gztar”,注意:不支持RAR
shutil.unpack_archive(filename, extract_dir=None, format=None) 解压缩
extract_dir:解压至的文件夹路径。文件夹可以不存在,会自动生成

补充:RAR文件可以用rarfile来解压:rf = rarfile.RarFile(filename) rf.extractall(path2)

文件路径
os.path.exists(filepath)判断文件和路径是否存在
os.path.abspath(path) 获取绝对路径地址
os.path.isabs(path) 判断是否绝对路径
os.path.dirname(path) 获取当前文件或文件夹的父文件夹,循环调用可以调用向上遍历父目录。
os.path.basename(path) 获取文件或文件夹的主体部分,即path.split(’//’)[-1]
os.path.split(path) 返回一个列表,即[dirname,basename]
os.path.join(var1,var2) 和split相反。
os.path.splitext(path) 把文件切割成后缀和其他两部分,即path.split(’.’)
os.path.getsize(path) 获取文件大小,经常用来判断是否空文件
os.path.isfile(path)/isdir(path)/islink(path) 判断是否文件/文件夹/链接

【【时间和日期】】
【time】
time.time 获得当前时间点的时间戳
time.ctime 获得类似’Sat Mar 23 22:00:40 2019’数据,可以用.split(’’)[-2] 来获取时间字符串。
time.localtime(time.time()) 可以得到一个年月日时分秒星期的九位元祖,用数组取值可以得到某个数值。
时间转化为固定格式字符串:
strftime(format,time.localtime()):
%y%Y 年份 %m 月份 %d 日 %H%I 小时 %M 分钟 %S 秒 %a本地简化星期 %A 本地完整星期
%b本地简化月份名称 %B完整月份名称 %c本地相应的日期和时间表示 %w星期(0-6)

【datetime.date】
构造:
date.today() 返回date格式的日期(一个年月日的日期元祖)
date(年,月,日)可以构造一个date格式的日期
一个完整的datetime对象.date() 可以截取一个date对象
方法:
.wekday() 返回0-6的星期
.isoweekday() 返回1-7的星期
.isoformat() 返回 ‘YYYY-MM-DD’的ISO格式字符串
.replace(year/month/day) 返回一个被替换过的新日期对象,如replace(year=2019)
.strftime(format) 转化为固定格式字符串 如:today.strftime(’%Y/%m/%d-%w’)

【datetime.time】
构造:
time(时,分,秒)
一个完整的datetime对象.time() 可以截取一个time对象
方法:
.isoformat() 返回"HH:MM:SS"的ISO格式字符串
.replace().strftime(format) 和date方式一样

【datetime.datetime】
构造:
datetime (year, month, day[ , hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] )
datetime.today()/now():返回一个表示当前本地时间的datetime对象;
datetime.fromtimestamp(timestamp[, tz]):根据时间戮创建一个datetime对象,参数tz指定时区信息;
datetime.fromisoformat(string)可以从一个ISO格式的字符串转化为一个datetime
datetime.strptime(date_string, format):将格式字符串转换为datetime对象
方法:
它继承了time和date的所有方法

【datetime.timedelta】
用于一些时间日期的加减计算
datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)所有参数为可选参数,默认为0
±-timedelta(days=1)可以得到一个datetime对象。
两个对象+—可以得到一个timedelta对象。
delta.days
delta.seconds
total_seconds
可以计算相差时间。

【【TKinter】】

控件 描述
Button 按钮控件;在程序中显示按钮。
Canvas 画布控件;显示图形元素如线条或文本
Checkbutton 多选框控件;用于在程序中提供多项选择框
Entry 输入控件;用于显示简单的文本内容
Frame 框架控件;在屏幕上显示一个矩形区域,多用来作为容器
Label 标签控件;可以显示文本和位图
Listbox 列表框控件;在Listbox窗口小部件是用来显示一个字符串列表给用户
Menubutton 菜单按钮控件,由于显示菜单项。
Menu 菜单控件;显示菜单栏,下拉菜单和弹出菜单
Message 消息控件;用来显示多行文本,与label比较类似
Radiobutton 单选按钮控件;显示一个单选的按钮状态
Scale 范围控件;显示一个数值刻度,为输出限定范围的数字区间
Scrollbar 滚动条控件,当内容超过可视化区域时使用,如列表框。.
Text 文本控件;用于显示多行文本
Toplevel 容器控件;用来提供一个单独的对话框,和Frame比较类似
Spinbox 输入控件;与Entry类似,但是可以指定输入范围值
PanedWindow PanedWindow是一个窗口布局管理的插件,可以包含一个或者多个子控件。
LabelFrame labelframe 是一个简单的容器控件。常用与复杂的窗口布局。
tkMessageBox 用于显示你应用程序的消息框。

构造方法内常见参数:
text=‘你好!this is Tkinter’, bg=‘green’, font=(‘Arial’, 12), width=30, height=2

按钮:b =Button(window, text=“Help”, command=DISABLED) command命令提供按下时候的命令
Entry文本框:Entry(window, show=’’, font=(‘Arial’, 14)) show=""显示成密码框格式

文本域:Text是tkinter类中提供的的一个多行文本区域,显示多行文本,可用来收集(或显示)用户输入的文字(类似 HTML 中的 textarea),格式化文本显示,允许你用不同的样式和属性来显示和编辑文本,同时支持内嵌图象和窗口。
t = tk.Text(window, height=3)

列表框:是tkinter类中提供的的列表框部件,显示供选方案的一个列表。listbox能够被配置来得到radiobutton或checklist的行为。
lb = tk.Listbox(window, listvariable=var2)
b.insert(‘end’, item) # 从最后一个位置开始加入值
lb.insert(1, ‘first’) # 在第一个位置加入’first’字符
lb.insert(2, ‘second’) # 在第二个位置加入’second’字符
lb.delete(2) # 删除第二个位置的字符

.curselection() 可以返回当前选中的文本

【【PYQT5】】
【核心模块:】
QtCore模块涵盖了包的核心的非GUI功能,此模块被用于处理程序中涉及到的 time、文件、目录、数据类型、文本流、链接、mime、线程或进程等对象
QtWidgets模块包含了一整套UI元素组件

核心代码如下:
app = QApplication(sys.argv)
MainWindow = QWidget() #可以改为QMainWindow或QDialog
#该代码为主窗体绑定其他控件
MainWindow.show()

【信号与槽】
self.bt1.clicked.connect(self.showMessage)
bt1按钮发出了clicked信号,bt1是信号源,cliced是一个信号,它被代码连接到了showMessage函数上。bt1发出信号的过程是qt自己根据用户动作自动发出的,我们这里只是决定了信号连接到哪个槽函数。

dial.valueChanged.connect(lcd.display)
valueChanged信号会返回一个int类型的返回值,lcd的display函数恰好需要一个int类型的参数,这样信号与槽函数就互相匹配,能够让lcd显示屏显示旋钮发出的数值了。

bt1和dial作为信号源,必须是一个QObject对象,信号是QObject对象的一个属性它是PyQt5.QtCore的pyqtSignal类型的,它具有一个connect方法,可以连接到一个具体的函数。对象发出信号的过程是窗体某事件驱动的,当然我们可以通过重写事件函数来自定义发出某信号的过程.emit()。

在槽函数中调用QMainWindow.sender(),可以获取信号源的对象本身。

小贴士:QtCore.QMetaObject.connectSlotsByName()可以实现根据名称自动绑定槽函数。控件必须有一个setobjiectname的方法起名btn,函数命名必须是on_btn_set_clicked试样的。
@pyqtSlot()
def on_bt1_clicked(self):
f=QColorDialog.getColor()
print(f.name())

【事件函数】
QtWidget控件预设了一些事件函数,当特定事件发生时,它们会被自动调用,我们可以通过重写这些函数来实现某些特定的功能。
keyPressEvent(self, e)
paintEvent(self, event)
mouseMoveEvent(self, event)

【控件添加和主窗体控件】
1、控件创建过程中可以通过构造函数的parent参数指定父控件,如:
self.pushButton = QtWidgets.QPushButton(self.verticalLayoutWidget)
2、父控件可以通过.addWidget方法来添加子控件,如:
self.verticalLayout.addWidget(self.pushButton)
使用第一种方式可以直接向主窗体添加控件,但主窗体如果想要主动添加控件,只能设置布局、菜单、工具栏等次及控件,然后再由次及容器添加子控件,如:
hbox = QHBoxLayout()
hbox.addStretch(1)
hbox.addWidget(bt1)
QMainWindow.setLayout(vbox) #设置窗体的主布局
QMainWindow.menuBar().addMenu(m1).addAction(a1)#通过窗体的主菜单设置次级菜单和动作标签
.statusBar().showMessage(‘准备就绪’) #设置左下角的状态栏
toolbar = self.addToolBar(‘工具栏’)) #添加一行工具栏
toolbar.addAction(newAct)

小贴士:布局时添加拉伸量可以实现分隔或居中效果,如: hbox.addStretch(1)
小贴士:右键菜单设置(需要重写contextMenuEvent函数):
def contextMenuEvent(self, event):
cmenu = QMenu(self)
newAct = cmenu.addAction(“新建”)
opnAct = cmenu.addAction(“保存”)
quitAct = cmenu.addAction(“退出”)
action = cmenu.exec_(self.mapToGlobal(event.pos()))

【弹出输入框与信息框】
QInputDialog:详情见https://zhuanlan.zhihu.com/p/29101077
QMessageBox:详情见https://zhuanlan.zhihu.com/p/29795495

【文件选择&字体和颜色选择】
QFileDialog.getOpenFileName(self, ‘打开文件’,’./’,“Images (*.png .xpm .jpg)")
第一个参数是父窗体,第二个是标题,第三个是工作目录,第四个是过滤器还可以是"xls (
.xls
)”。
返回值是一个两位元祖,元祖第一个元素是文件路径,第二个是输入的过滤器,点击取消后返回(’’, ‘’),可以用if f[0] 判断是否返回有效值。
f=QFileDialog.getSaveFileName(self,‘打开文件’,’./’)和Open类似,不同的是如果文件已存在会进行提醒。
f=QFileDialog.getOpenFileNames(self,‘打开文件’,’./’)可以选取多个文件,返回值仍然是一个两位元祖,不同的是第一个元祖是列表,点击取消时返回([], ‘’),仍然可以用if f[0]判断。

font, ok = QFontDialog.getFont()可以弹出一个字体选择对话框,返回值是一个字体和布尔值的二位元祖。
QTextEdit()的setCurrentFont(font)方法可以设置当前字体

col=QColorDialog.getColor() 可以弹出一个颜色选择对话框,可以设置到文本域中
if col.isValid():
QTextEdit().setTextColor(col)

【进度对话框和进度条】
progress = QProgressDialog() 进度条
progress.setMinimumDuration(5) 设置超过多少才显示出来,这里是4秒
progress.setWindowModality(Qt.WindowModal) 设置是否模态模式,必须设置为模态,否则会无响应
progress.setRange(0,num) 设置最大值和最小值,方便计算每一步对总长的百分比
for ***
progress.setValue(i) 在循环中显示现在进行的步数

QProgressBar为进度条
.setOrientation()该属性设置了进度条的方向,方向必须是Qt.Horizontal(默认,水平)或Qt.Vertical(垂直)
.setFormat("%v")
%p - 被完成的百分比取代
%v - 被当前值替换
%m - 被总step所取代
默认值是”%p%
self.pb22.setInvertedAppearance(True) 向右或向下增长
QProgressBar.setValue()

【文本框属性QLineInput】
.setContextMenuPolicy(Qt.NoContextMenu)
这个语句设置QLineEdit对象的上下文菜单的策略,即右键菜单的格式,Qt.NoContextMenu即没有右键菜单。
.setPlaceholderText(“密码6-15位,只能有数字和字母,必须以字母开头”)灰色的占位符文本
.setEchoMode(QLineEdit.Password)设置了如何限定输入框中显示其包含信息的方式,这里设置的是:密码方式。其他方式还有NOrmal正常模式 NoEcho不显示任何文字 PasswordEchoOnEdit 编辑时显示字符,离开后显
示密码。
regx = QRegExp("1[0-9A-Za-z]{14}$")
validator = QRegExpValidator(regx, self.edit)
.setValidator(validator) 使用正则表达式限定掩码
.maxLength() 设置最长长度
setReadOnly(bool) 设置是否只读
.isClearButtonEnabled(bool) 设置清楚文本的按钮
setInputMask() 设置掩码

setText()或insert() 设置或插入文本
setPlaceholderText(str) 设置占位符
text()displayText() 返回文本框的文本
setSelection(int start, int length)selectAll() 选择文本
deselect()取消选择文本
selectedText() 返回选中的文本,没有选中返回’’
cut()、copy() 和paste() clear() redo() undo() 操作文本
setAlignment()对齐

信号
textChanged() 文本改变,无论是手动还是代码改变都发出该信号
textEdited() 手动操作改变文本,而非使用setText()发出该信号
cursorPositionChanged() 光标移动
returnPressed() 按下Return或Enter
editingFinished() 失去焦点或提交成功

【按钮 QPushButton】
.setMenu(menu) 可以给按钮添加下拉菜单
.setIcon():设置按钮上的图标
.setEnable()设置是否可用
.setCheckable(True) 将按钮变为切换状态,此时isChecked才有意义
.isChecked():返回按钮的状态,返回值为True或False
.setAutoExclusive(True) 此属性保存是否启用排它性。如果启用了自动排它性,那么属于同一个父部件的可选中按钮就会只有一个能按下。
.setText():设置按钮的显示文本
.text():返回按钮的显示文本
信号
clicked/clicked[bool] 后者传递一个是否按下的布尔值,只有切换模式才有意义相当于self.sender().isCheckd()
pressed 按下
released 松开按钮

【复选框QCheckBox】
setChecked():设置复选框的状态,设置为True时表示选中复选框,设置为False时表示取消选中复选框
setText():设置复选框的显示文本
text():返回复选框的显示文本
isChecked():检查复选框是否被选中
一般的复选框这些属性就够了,但对于三态复选框,有额外的属性:
setTriState():设置复选框为一个三态复选框
setCheckState :为三态复选框设置选中状态,Qt.Checked Qt.Unchecked Qt.PartiallyChecked 三种状态
checkState() 查看三态复选框的状态。

【单选框QRadioButton】
一组单选框需要被包括在一个QButtonGroup中,它们之间是互斥的。
isChecked():返回单选按钮的状态,返回值为True或False
setText():text(): 设置和获取文本
self.bg1 = QButtonGroup(self)
bg1.addButton(self.rb11, 11) 将单选按钮添加到分组中,同时分配一个id号。

信号:
toogled 当按钮切换到选中或者非选中状态时会触发toggled信号
clicked 信号是在每次点击单选按钮式触发的
buttonClicked 点击某按钮组发出该信号(由QButtonGroup发出信号,可以由sender.checkedId()判断到底由哪个按钮触发)

【工具按钮QToolButton】
工具按钮通常在使用QToolBar.addAction()创建新的QAction实例时创建,也可以像其他任何小部件一样构建工具按钮,并将其与其他小部件一起排列在布局中。
tb = QToolButton(self)
tb.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)该属性保持工具按钮是仅显示图标,仅显示文本,还是显示图标旁边/下方的文本。
Qt.ToolButtonIconOnly 仅显示图标
Qt.ToolButtonTextOnly 仅显示文本
Qt.ToolButtonTextBesideIcon 文字出现在图标旁边
Qt.ToolButtonTextUnderIcon 文字出现在图标下方

tb.setPopupMode(QToolButton.MenuButtonPopup) 描述了弹出式菜单与工具按钮一起使用的方式:
QToolButton.DelayedPopup 长按显示菜单
QToolButton.MenuButtonPopup 按钮旁边出现一个箭头,按下箭头显示菜单
QToolButton.InstantPopup 按下按钮显示菜单,按钮本身的动作不触发。

tb.setAutoRaise(True) 此属性保持是否启用自动升起。默认是禁用的(即False)。

a1=QAction(QIcon(‘icon/alipay.ico’),‘支付宝支付’, self) action是工具按钮的原子类,具体动作由该类触发。
a1.triggered.connect() 设置触发的槽函数

【按钮的共有方法】
button = QPushButton(‘Ro&ck’, self)如果按钮是一个文本按钮,带有一个包含’&’的字符串,则QAbstractButton会自动创建一个快捷键。这里是Alt+C
setIcon(QIcon(“print.png”))
setShortcut(“Alt+F7”)
isDown()指示按钮是否被按下。
isChecked()指示按钮是否被选中。只有可被选中的按钮才能查看其选中的状态。
isEnabled()指示按钮是否可以被用户按下。
信号:
pressed():当鼠标光标在按钮内时,鼠标左键被按下。
release():当在释放鼠标左键时发出的。
clicked() :当按钮第一次被按下,然后被释放;当快捷键被键入时;click()或者animateClick()被调用时。
toggle():当开关按钮状态发生变化时发出的。

【定时器QTimer】
.setInterval(1000) 定时器发出信号的间隔,毫秒单位
.timeout.connect()为定时器间后发生的事件绑定槽函数
.start() .stop() 开启和关闭定时器

【【xlwings】】
【xlwings引用已打开的EXCEL对象】
xw.apps 返回当前所有EXCEL程序的窗口集合,一个窗口可能包含一个或多个工作簿视图
xw.books 当前活动窗口中的工作簿集合,wps可能有多个,office一般只有一个
xw.sheets 返回当前活动工作簿的工作表集合
xw.Range(str) 返回当前活动工作表中的固定区域

xw.pps/books/sheets.active 集合中活动的窗口/工作簿/工作表
xw.apps[apps.keys()[i]] 窗口的索引方法
xw.books/sheets[i] 工作簿集合和工作表集合的索引方法
xw.books/sheets[name] 通过名称引用工作簿或工作表

遍历当前打开的工作表:
for app in xw.apps:
for book in app.books:
for sheet in book.sheets:
print(sheet.name)

引用工作表\单元格】:
book.sheets[i] 下标从0开始
book.sheets(i&sheetname) 下标从1开始,表名需要完全一致
sheet[‘a1’] python集合引用办法
sheet[i,j] 下标从0开始
sheet.cells(i,j) 下标从1开始
sheet.range(‘a1’) vba引用办法

sheet的属性和方法】:
activate() 激活工作簿,使其获得焦点
utofit(axis=None) 自动调整单元格宽度,参数可以是rows/columns,默认不填是both
book 工作表的父工作簿
clear() 清空一整张工作表
clear_contents() 清空一整张工作表的文本内容
delete()
range(cell1, cell2=None) cell1 (str or tuple or Range)
select()
index 表示工作表的索引,即它在工作簿中的顺序
used_range

Range的属性和方法】
add_hyperlink(str:address, str:text_to_display=None, str:screen_tip=None) 添加链接
get_address(row_absolute=True, column_absolute=True, include_sheetname=False, external=False)
row_absolute 开启行绝对引用 column_absolute 开启列绝对引用 后面的是是否带表名和工作簿名
autofit()
clear()
clear_contents()
color 获取或设置颜色,通过三位元祖设置,如xw.Range(‘A1’).color = (255,255,255)
current_region
end(direction) direction (One of ‘up’, ‘down’, ‘right’, ‘left’)
expand(mode=‘table’) ‘table’ (=down and right), 类似current_region ,提供向下或向右扩展
formula
formula_array
hyperlink 返回添加的链接地址,没有会报错,不识别EXCEL链接,只支持网页链接
last_cell 返回区域的最右最下单元格
number_format
offset(row_offset=0, column_offset=0)
resize(row_size=None, column_size=None) 最小值为1,及原来单元格本身
rows 返回行集合,可以迭代
columns

APP的属性和方法】:
xlwings.App(visible=None, spec=None, add_book=True, impl=None)
calculate() 设置重新计算
calculate() 自动重算的类型’manual’, ‘automatic’, ‘semiautomatic’
display_alerts 显示提醒
hwnd 句柄
kill()
quit() Quits the application without saving any workbooks
screen_updating
selection book和app对象都可以调用该属性
visible

Book的属性和方法】
app.books.add() xw.Book()也能达成效果,不推荐这样使用
app.books.open(fullname)xw.Book(fullname)一样,若已经存在会报错
active
close() Closes the book without saving it.
fullname
save(path=None)
selection

总结:xlwings是对excel程序的调用,支持excel和wps2016版本,电脑上没有软件时,没法使用xlwings操作。xlwings新建或打开工作簿时,也没法判断用什么程序打开,所以通常我们只使用它对已打开的工作簿进行操作,尽量不涉及打开文件。

【【openpyxl】】

openpyxl
openpyutil.utils
该模块直接对文件进行操作,不依靠EXCEL。

【属性和方法】
workbook】
构造:
wb = Workbook()
wb=load_workbook(filename )
方法:
get_sheet_by_name(str) 通过名称获取工作表
get_active_sheet() 等价于active属性
create_sheet(title=None, index=None) 默认插在工作簿末尾,0则是第一个位置
get_index(worksheet)
remove_sheet(worksheet)
save(filename)
copy_worksheet(from_worksheet) 复制工作表,复制到工作簿末尾

属性:
active 返回当前工作簿的活动工作表
worksheets 工作表集合,可以通过索引进行引用或迭代
sheetnames 工作簿名称集合

worksheet】
方法:
add_chart(chart, anchor=None)
add_data_validation(data_validation)
add_image(img, anchor=None)
append(iterable) 在第一列没有文字的哪一行添加。可以是列表或字典,字典的KEY必须是列名
calculate_dimension() 返回usedrange的文字字符串
cell(row, column, value=None) 可以直接在方法内设置值
insert_cols(idx, amount=1) 在idx之前插入amount行
insert_rows(idx, amount=1)
merge_cells(range_string=None, start_row=None, start_column=None, end_row=None, end_column=None)
合并单元格,通过四个整数获得区域
属性:
max_column 有数据的最大单元格列数
max_row 有数据的最大单元格行数
min_column
min_row
active_cell 返回当前的活动单元格
freeze_panes 返回当前冻结的单元格
selected_cell
rows 有数据的每一行集合
columns 有数据的每一列集合
parent 父工作簿

Cell】
获得单元格
ws[‘c’] 返回C1:Cmax_row
ws[‘1’] 返回a1:max_column1
ws[‘d7:d9’] 按range返回
cell(7,4)

方法:
offset(row=0, column=0)
set_explicit_value(value=None, data_type=‘s’)
根据类型显示

属性:
col_idx 列数字
column 列文字
comment 批注
coordinate 地址
hyperlink
is_date
parent 父工作表
data_type 类型,s文本 n数字 d时间

可迭代对象:
rows 可迭代的行对象集合,每一个next是一行cells的tupple
colums 类似rows
values 可迭代的cells总集合
iter_rows() 自定义的rows集合
iter_cols() ) 自定义的cols集合

填充颜色:
from openpyxl.styles import PatternFill
fill = PatternFill(“solid”, fgColor=“1874CD”)
d4.fill = fill

【【xlrd/wt】
工作簿:
workbook=xlrd.open_workbook(filename)
book=xlwt.Workbook(encoding=“utf-8”,style_compression=0)
工作表:
worksheet=workbook.sheet_by_name()
worksheet=workbook.sheet_by_index()
worksheet=book.add_sheet(‘test01’, cell_overwrite_ok=True)
.nrows ncols 最大行列
单元格:
cell=worksheet.cell(1,2)
sheet.write(0, 0, ‘各省市’)

【【numpy】】
numpy提供了一个ndarray多维数组对象,我们可以很方便的使用这个对象对多维数组进行直接操作而不用迭代循环。
构造:
1、使用array从嵌套list的list进行转化,如(也可以使用asarray,区别是数据源本身就是ndarray时,后者不会copy,而是直接赋值):
a=np.array([[1,2,3],[4,5,6]]) 构造成一个两行三列的ndarray,若行列不匹配将不会生成二维数组,而是一个一维的obj数组
2、通过arange.reshape创建顺序的多维数组,如:
a = np.arange(15).reshape(3, 5) 构造了一个从0-14,三行五列共15个元素的数组。
3、创建具有初始占位符的固定长度数组,如:
np.zeros( (3,4) ) 三行4列由0占位的浮点型数组
np.ones( (2,3,4)) 两个三行4列由1组成的整形数组
np.empty( (2,3) ) 空数组,其实数组中有随即的极小值

数组类型dtype 如int32/float64等可以在创建时指定,否则会自动匹配。
np.ones( (2,3,4), dtype=np.int16 ) np.array( [ [1,2], [3,4] ], dtype=complex )

ndarray的属性:
ndim 数组的纬度
shape 返回数组各个纬度长度的元祖,如(3,4)表示三行四列
size
dtype 数组的类型
itemsize 数组中每个元素的字节大小

【运算】
等长的两个数组可以直接运算,如:
a = np.array( [20,30,40,50] )
b = np.arange( 4 )
c=a-b
d=a*b

数组也可以直接和标量运算,运算过程为数组每个元素直接和标量运算:
b**2
b-=2
b-5 返回一个新的数组

【方法】
.sum(int:axis) 可以根据行或列求和,axis=0表示纬度,下标从0开始
.min(int:axis)
.max(int:axis)
.std() 方差
.var() 标准差
.argmax() 最大值索引
.argmin() 最小值索引
.any() 是否至少有一个True
.all() 是否全部为True
.ravle() 返回降为一维数组
.reshape(n,m) 返回重新定义数组形状,如果在reshape操作中将维度指定为-1,则会自动计算其他维度
.resize(n,m) 修改数组本身的形状,如果新数组大小大于原始大小,则包含原始数组中的元素的副本
.T 返回交换了纬度的数组
.where(condition) 只需要把条件传递给它,它就会返回一个使得条件为真的元素的列表

【切片/索引】
ndarray[n] 选取第n+1个元素
ndarray[nⓂ️step] 选取第n+1到第m行元素,间隔为step
ndarray[:,:] 选取全部元素
ndarray[:,n:] 选取第n+1列到最后列元素
ndarray[:n,:m] 选取第n+1行及之后,m+1列及之后的所有元素

花式索引:
a=[1,2,3,4,5,6]
普通索引方式为a[i],譬如a[3]=4,也可以用数组作为索引,如
i=[0,3,4],a[i]返回[1,4,5]
同时,还可以构造索引矩阵来索引同样结构的数组。
i=[[0,1],[4,5]]
a[i]=[[1,2],[5,6]

二维数组中,a=[0,0,0],[255,0,0],
… [0,255,0],
… [0,0,255],
… [255,255,255] ] )
a[i,j] 是普通索引,i和j同时可以是一组长度相同的向量,这样就能索引出同样长度的向量数组。
当然,i,j也可以是同样结构的矩阵,这样也能索引出同样结构的矩阵数组。

如果二维数组只给出了一个索引参数,则表示索引一行。a[0,1]:
[0,0,0,]
[255,0,0,]

布尔索引:
ndarray[ bool_ndarray ] 根据bool数组选取位置上为true的元素:如b[b>5]
需要注意的是,索引出的数组仍然是旧有数组的一部分,我们可以通过给这个切片复制来改变原来的数组,比如
b[b>5]=4.
如果想要不改变原来的数组获得新数组,可以使用where
当然,也可以单独对数组的行、列进行单独的布尔索引

【函数】
np.in1d(ndarray, [x,y,…]) 检查ndarray中的元素是否等于[x,y,…]中的一个,返回bool数组
np.sort( ndarray) 排序,返回副本
np.unique(ndarray) 返回ndarray中的元素,排除重复元素之后,并进行排序
np.intersect1d( ndarray1, ndarray2) 返回二者的交集并排序。
np.union1d( ndarray1, ndarray2) 返回二者的并集并排序。
np.abs(ndarray) 计算绝对值
np.mean(ndarray) 求平均值
np.ceil(ndarray) 向下取整
np.floor(ndarray) 向上取整
np.rint(ndarray) 四舍五入
np.vstack((ndarray1, ndarray2…)) 将数组在竖直方向堆叠,要求行数必须一样
np.hstack(((ndarray1, ndarray2…)) 将数组在水平方向堆叠,要求列数必须一样
np.column_stack((ndarray1, ndarray2…))将1D数组作为列叠加到2D数组中
np.concatenate((a1, a2, …), axis) 沿着指定的轴堆叠数组
np.stack(arrays, axis) 函数用于沿新轴连接数组序列
np.split(ary, indices_or_sections, axis)
indices_or_sections:果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置
axis:沿着哪个维度进行切向,默认为0,横向切分。为1时,纵向切分
np.hsplit(ary,count) 函数用于水平分割数组,通过指定要返回的相同形状的数组数量来拆分原数组,| |
np.vsplit(ary,count) 沿着垂直轴分割,其分割方式与hsplit用法相同-_
np.append(arr, values, axis=None) 将数组添加到原数组的末尾,要求在哪个纬度添加,另一个纬度的长度就必须完全相同,类似堆叠
np.transpose(arr)
np.where(condition,x,y) if condition x else y
np.where(condition) 返回满足条件的坐标,可以根据坐标索引这些元素
np.setdiff1d(x,y) 返回1:x中有Y中没有的元素,2这些元素在X中的索引

【随机数组】
NumPy.random:
permutation(count) 返回一个从0~9的序列的随机排列count个数量的一维数组
permutation(ndarray) 返回一个ndarray随机打散排列
shuffle(ndarray) 对一个序列就地随机排列
rand(int) 产生int个均匀分布的样本值
randint(begin,end,num=1) 从给定的begin和end随机选取num个整数

【文件读写】
np.save(string, ndarray) 将ndarray保存到文件名为 [string].npy 的文件中(无压缩)
np.savez(string, ndarray1, ndarray2, …) 将所有的ndarray压缩保存到文件名为[string].npy的文件中
np.savetxt(sring, ndarray, fmt, newline=’\n’) 将ndarray写入文件,格式为fmt
np.load(string) 读取文件名string的文件内容并转化为ndarray对象(或字典对象)
np.loadtxt(string, delimiter) 读取文件名string的文件内容,以delimiter为分隔符转化为ndarray

【【pandas】】

1、seriers序列

构造】:
list=[1,2,3,45,6]
obj=Seriers(list) 从list构造
obj=Seriers({“inde”:2,“ff”:2}) 从dict构造
也可以指定索引:
obj=Seriers(list,index=[“a”,“b”,“c”,“d”,“e”])

特性】
seriers 可以看作一个定长的有序字典,可以以索引获取value
ojb[“a”]
和字典类似,也可以用 in运算符查询是否存在(索引中):
“b” in obj
所不同的是,序列可以进行向量运算:
obj[obj>2] obj2 np.max(obj)
比字典快捷的地方在于,两个同索引对象可以直接进行全局运算,而不用循环
obj+obj
2 索引不同产生NaN值
索引可以通过就地赋值的方式修改:
obj.index=[…]

方法】:
get() 和字典方法一样
keys、values 返回numpy array形式的list
items 返回zip
obj[] 添加/修改数据
drop([]) 删除

索引排序】:
使用reindex方法进行重拍,当前某个索引值不存在,引入NaN
原索引为1324
obj2=obj.reindex([1,2,3,4]) 会将1324的值按1234进行排列
重排时增加索引值可以增加一行,增加的Nan值可以预先进行填充:
reindex(value,method=‘ffill’) 向缺失值

【索引、选取和过滤】
序列的索引、切片方法和list完全一致,所不同的是,可以使用index来进行切片,选取,使用index进行切片时,其端点是包含的,这一点和python list不同。
obj[“b”:“c”]

2、dataframe数据表

构造:
可以从以下类型构造:
1、数组的字典:
value={‘state’:[1,2,3,4,5],
‘year’:[2001,2002,2003,2004,2015],
‘pop’:[1.5,1.5,1.6,125,125]
}
索引自动排列,从0开始
2、字典的字典:
value={
‘col1’:{‘row1’:22,‘row2’:44},
‘col2’:{‘row1’:24,‘row2’:43}
}
索引就是内存字典的key值
3、序列seriers的字典
和2差不多,略
4、字典的列表
value=[{“df”:3,“ff”:33},{“df”:3,“ff”:4}]
key值会自动转化为列名,缺失的索引从0自动排列。
5、列表的列表
value=[[1,3,4,5,6],[7,5,6,7,8]]
列名和索引都会从0自动排列赋值。
6、ndarray矩阵,类似5列表的列表

df=Datafrem(value)
列名索引缺失时,也可以指定列名和索引:df=Datafrem(value,colums=[…],index=[…])
但需要注意,如果构造时已经有列名和索引了,新结果只会匹配新index存在的值,其他都是NAN
使用.values 会返回ndarray数组矩阵

【选取和切片】
选取:
只能使用使用df[colname]的方式选取列,无法使用df[2]的方式选取,也无法选取到行。
可以使用df[colname][rowname]的方式选取到单元格。
切片:
可以使用seriers的两种切片方式,但只能切片行,不能切片列。

ix、loc、iloc】选取函数
.ix[row,col]类似于excel的cells(row,col)方法,可以根据行列标签选择单元格,但要强大得多。
row/col可以是单个字符串或数字,识别顺序为先匹配index和colum,如果识别不到则进行index排序识别。
ix[1,3] index从0开始,所以这是二行,4列
ix[“row1”,“col1”] 从标签进行匹配。
row/col 也可以是字符串或数字的数组,这样同时选取多行多列
也可以是字符串或数字的:切片表达式
也可以是布尔筛选表达式。
注意:该函数在目前的版本中已经被弃用,分为loc和iloc取代。
loc[row,col] 只能使用label标签来定位,参数类型和ix完全一致
iloc[row,clo]只能使用整数来定位,参数类型和ix完全一致。
注意:当类似cells()定位单个单元格时,使用at/iat速度比较快。
注意2:和numpy类似,当只定位列时,行以:表示全部。

删除】:
删除行:.drop([‘row1’,'row2])
删除列:.drop(columns=[‘col1’])或drop([],axis=1)

行列最大值】
max(df.count(0))
max(df.count(1)) 最小值同理,使用min即可
shape 返回一个行列最大值的元祖(rowmax,colmax)

判断为空】
不能直接用if dataframe或者bool(df)判断,会报错,可以使用以下属性
.empty 判断是否为空
.any 有任何一个True返回True,
.all 有任何一个False返回False

增加操作】
1、使用append()方法,其中可以是一个seriers或者dict,使用dict时,ignore_index必须为True,这样会忽略index重新从0开始编码。
2、使用df.loc[indexname/id]=[]/{} 手动进行操作

筛选操作】
df[(df[‘time’] == ‘Dinner’)&(other condition)] in操作可以用df.isin=[…]来进行

聚合操作】
df.groupby(‘sex’).size()

将某一列设置为索引】df.set_index(cloname)
遍历】df.iterrows() 返回一个可迭代的行集合 .iteritems() 返回可迭代列集合

【【selinum学习】】
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.common.by import By
初始化:
chrome_options = webdriver.ChromeOptions()
chrome_options.binary_location = r"D:\Program Files\ChromeCore\ChromeCore.exe"
browser = webdriver.Chrome(options=chrome_options)
【元素定位】
· find_element_by_id
· find_element_by_name
· find_element_by_xpath
· find_element_by_link_text
· find_element_by_partial_link_text
· find_element_by_tag_name
· find_element_by_class_name
· find_element_by_css_selector
定位多个元素(注意elements,返回一个列表)
· find_elements_by_id
· find_elements_by_name
· find_elements_by_xpath
· find_elements_by_link_text
· find_elements_by_partial_link_text
· find_elements_by_tag_name
· find_elements_by_class_name
· find_elements_by_css_selector
from selenium.webdriver.common.by import By
driver.find_element(By.XPATH, ‘//button[text()=“Some text”]’)
driver.find_elements(By.XPATH, ‘//button’)
By类的可用属性
ID = “id”
XPATH = “xpath”
LINK_TEXT = “link text”
PARTIAL_LINK_TEXT = “partial link text”
NAME = “name”
TAG_NAME = “tag name”
CLASS_NAME = “class name”
CSS_SELECTOR = “css selector”

【元素操作】
窗口操作】
driver.maximize_window() 窗口最大化
driver.back() 页面返回
driver.forward() 页面前进
.get_window_size()
.set_window_size(‘width’,‘height’)
.get_window_position()
.set_window_position(20,20)
.current_window_handle 返回当前窗口句柄
.window_handles 返回所有打开server的浏览器句柄

键盘操作】
from selenium.webdriver.common.keys import keys
ele.send_keys(keys.ALT)
ele.send_keys()

鼠标操作】
ele.click()
cick_and_hold()
context_click()
double_click()
key_down(value,ele=none)
key_up()
from selenium.webdriver.common.action_chains import ActionChains
ActionChains(browser).context_click(elebtn).perform()
ActionChains(driver).method,当调用该方法时,动作不会立即被执行,而是会将所有的操作按顺序存放在一个队列里,当调用perform()方法时,队列中的时间会依次执行

调用js()】
driver.execute_script()
driver.execute_script(“window.scrollTo(0, document.body.scrollHeight);”)

【元素等待】
隐式等待 implicitly_wait
该等待是全局设置,因而只需在实例化driver后设置一次即可,等待全局加载完毕
browser.imolicitly_wati(s)

显式等待,WebDriver提供的针对元素级别的、灵活、智能的等待方法,通过配合until()、until_not()、ExpectedCondition等条件的使用
lo=EC.presence_of_element_locate((BY.id,"kw))
WebDriverWati(browser,sec).until/until_not(lo)
注意1:until等待lo条件为真为止,返回真的元素内容,until_not返回lo条件不成立为止,返回False
注意2:_locate()只允许传一个tupple参数,所以必须使用()将两个参数打包起来。
注意3:lo只要是可调用对象,返回值可判断真假即可,可用selenium提供的 expected_conditions 模块中的各种条件,也可以用WebElement的 is_displayed() 、is_enabled()、is_selected() 方法,或者用自己封装的方法都可以

1.title_is:判断当前页面的title是否完全等于预期字符串,返回布尔值
2.title_contains:判断当前页面的title是否包含预期字符串,返回布尔值
3.presence_of_element_located:判断某个元素是否被加到dom树下,不代表该元素一定可见
4.visibility_of_element_located:判断某个元素是否可见,可见代表元素非隐藏,并且元素的宽和高都不为0
5.visibility_of:跟上面的方法是一样的,只是上面需要传入locator,这个方法直接传定位到的element就好
6.presence_of_all_elements_located:判断是否至少一个元素存在于dom树中,举个例子,如果页面上有n个元素的class都是’coumn-md-3’,name只要有一个元素存在,这个方法就返回True
7.text_to_be_present_in_element:判断某个元素中的text文本是否包含预期字符串
8.text_to_be_present_in_element_value:判断某个元素中的value属性值是否包含了预期字符串
9.frame_to_be_availabe_and_switch_to_it:判断该frame是否可以switch进去,如果可以,则返回True并且switch进去,否则返回False
10.invisibility_of_element_located:判断某个元素是否不存在于dom树或不可见
11.element_to_be_clickable:判断某个元素是见并且是enable(有效)的,这样的话才叫clickable
12.staleness_of:等某个元素从dom树下移除,返回True或False
13.element_to_be_selected:判断某个元素是否被选中,一般用于select下拉表
14.element_selection_state_to_be:判断某个元素的选中状态是否符合预期
15.element_located_selection_state_to_be:跟上面的方法一样,只是上面的方法传入定位到的element,这个方法传入locator
16.alert_is_present:判断页面上是会否存在alert

【网页截图】
Chrome FireFox IE Edge PhantomJS
全屏截图 可视区域 可视区域 可视区域 可视区域 整个页面
元素截图 正常 正常 正常 正常 整个页面
使用webdriver提供的 save_screenshot 方法:
driver.save_screenshot(‘screenshot.png’)
driver.get_screenshot_as_png() 返回二进制的图片数据
ele.screenshot(‘ele.png’)

自定义元素截图
def get_image(ele,filename):
location=ele.location/location_once_scrolled_into_view
size=ele.size
driver.save_screenshot(filename)
img=Image.open(filename)
img=img.crop((location[“x”], location[“y”], location[“x”]+size[‘width’], location[“y”]+size[‘height’]))
img.save(filename)

【处理弹框】
result = EC.alert_is_present()(browser)
if result:result.dismiss()

【进入frame】
iframe = browser.find_element_by_class_name(“cnt-frame”)
browser.switch_to.frame(iframe)
browser.switch_to.window

【cookie操作】
cookie = driver.get_cookie(‘cookieKey’)
cookies = driver.get_cookies()
driver.add_cookie({‘name’:‘tmp’,‘value’:‘123123123’})
driver.delete_all_cookies()
driver.delete_cookie(‘UiCode’)

【文件下载】
对于Firefox,需要我们设置其Profile:
browser.download.dir:指定下载路径
browser.download.folderList:设置成 2 表示使用自定义下载路径;设置成 0 表示下载到桌面;设置成 1 表示下载到默认路径
browser.download.manager.showWhenStarting:在开始下载时是否显示下载管理器
browser.helperApps.neverAsk.saveToDisk:对所给出文件类型不再弹出框进行询问
然后对下载连击使用click即可

Chrome浏览器类似,设置其options
download.default_directory:设置下载路径
profile.default_content_settings.popups:设置为 0 禁止弹出窗口

【【tips】】
列表排序:
[].sort(func,reverse) 将[]进行排序,无返回值,func为遍历函数,指定func返回的值为排序键,reverse默认为升序排列,为True则是降序
sorted(list,func,reverse) 返回一个排序后的list
from operator import itemgetter, attrgetter
这两个函数可以用来快速选取对象,item使用index选取可迭代,attr用name选取属性
sorted(student_tuples, key=itemgetter(2))
还可以双重排序:
sorted(student_objects, key=attrgetter(‘grade’, ‘age’))


  1. a-zA-Z ↩︎

你可能感兴趣的:(python)