共计 5375 个字符,预计需要花费 14 分钟才能阅读完成。
工作起因,每学期都须要提交一个 DBF 文件给上级部门,而这个 DBF 中的大多数信息都是在特定的软件中应用增加本来在 excel 中的数据,最初由软件生成的。
因为每年都须要弄一次,每位共事都须要弄一次,整体上会破费 2 * 5 = 10 人 / 天的工作量(运气好的话),所以决定用自动化来实现一下。
因为需要不大,又是用于特定的场合下,所以对 UI 没有要求。决定尝试应用(人生苦短,我用)python3 来自动化一下。
装置
在 macos 下因为 brew 的加成,使其装置相干的软件都比较简单,当然了当提是咱们须要有一个还不错的网络环境。
panjie@panjies-iMac web % brew install python
==> Downloading
....
==> python@3.9
Python has been installed as
/usr/local/bin/python3
Unversioned symlinks `python`, `python-config`, `pip` etc. pointing to
`python3`, `python3-config`, `pip3` etc., respectively, have been installed into
/usr/local/opt/python@3.9/libexec/bin
You can install Python packages with
pip3 install <package>
They will install into the site-package directory
/usr/local/lib/python3.9/site-packages
tkinter is no longer included with this formula, but it is available separately:
brew install python-tk@3.9
See: https://docs.brew.sh/Homebrew-and-Python
看到上述后果,就示意 python 装置好了。装置好后的提示信息很重要,须要认真浏览一下。比方咱们应用上述命令装置的是 python3
,而后它的包管理器叫pip3
等。
如果咱们不小心遗记看相当提醒的话,其实还能够来到 brew 的官方网站,找到相应的包的地址,那个地址上也会有相应包装置胜利后的提醒.
这装实现后关上 shell,运行phtyon3 --version
panjie@panjies-iMac web % python3 --version
Python 3.9.5
装置胜利.
应用 python
应用 python 前我还是喜爱先下载一款得手的 IDE,比方 pycharm,下载后装置:
运行:
而后新建一个工程,全副抉择默认后点击实现:
点击运行,在控制台中胜利的显示了 Hi PyCharm,示意 Python 环境胜利。
读取 EXCEL
phtyon 只所以广受欢迎,与其有一个十分欠缺的社区是分不开的,基本上咱们想要的都会有包的反对,所以当咱们须要读取 excel 表格时,首先想要的就是去搜寻是否有可用的第三方包。
而后咱们失去一个要害的信息:应用 pandas 能够对 excel 进行操作。
装置 pandas
和很多优良的包管理器一样,pip3 同样提供了十分敌对的包治理性能。所以咱们想装置 pandas 只须要来到 pip3 的官方网站而后以 pandas 进行搜寻就能够了。
点击 User Guide 便进行了阐明页面,按此页面的阐明开始装置 panda。
按阐明咱们执行 python3 -m pip install pandas
便开始了 pandas 的装置:
panjie@panjies-iMac web % python3 -m pip install pandas
Collecting pandas
Downloading pandas-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl (11.6 MB)
|███▍ | 1.2 MB 53 kB/s eta 0:03:15
实际上 PIP 的官方站点是 https://pypi.org/,在下文中将拜访该站点来查问安装包。
因为咱们是首次装置,所以包管理器中基本上什么包都没有,此时便须要急躁的期待下载。pandas 以及其依赖的包全副装置实现后,将失去以下装置胜利的提醒:
Installing collected packages: six, pytz, python-dateutil, numpy, pandas
Successfully installed numpy-1.21.2 pandas-1.3.3 python-dateutil-2.8.2 pytz-2021.1 six-1.16.0
WARNING: You are using pip version 21.1.1; however, version 21.2.4 is available.
You should consider upgrading via the '/usr/local/opt/python@3.9/bin/python3.9 -m pip install --upgrade pip' command.
测试
按 pandas 的入门文档或是轻易由网上找一些示例代码,应用 pandas 来读取任意的 excel 来测试一下:
import pandas
def test():
pandas.read_excel('/Users/panjie/sync/work/task.xlsx')
if __name__ == '__main__':
test()
运行后果:
ImportError: Missing optional dependency 'openpyxl'. Use pip or conda to install openpyxl.
提醒我说须要装置 openpyxl
这个模块
插曲:装置完 pandas 后我并没有重启 pycharm,此时 pycharm 提醒我说没有找到 pandas。此时间接尝试应用 pycharm 提醒中的 install package 间接疾速解决了找不到的问题。至于为什么会这样,没有钻研。
装置 openpyxl
有了装置 pandas 的教训,装置 openpyxl 便显得非常简单了。
panjie@panjies-iMac web % python3 -m pip install openpyxl
Collecting openpyxl
Downloading openpyxl-3.0.8-py2.py3-none-any.whl (244 kB)
|████████████████████████████████| 244 kB 926 kB/s
Collecting et-xmlfile
Downloading et_xmlfile-1.1.0-py3-none-any.whl (4.7 kB)
Installing collected packages: et-xmlfile, openpyxl
Successfully installed et-xmlfile-1.1.0 openpyxl-3.0.8
WARNING: You are using pip version 21.1.1; however, version 21.2.4 is available.
You should consider upgrading via the '/usr/local/opt/python@3.9/bin/python3.9 -m pip install --upgrade pip' command.
应用 shell
装置后,pycharm 依然报错。这可能是因为 pycharm 与 shell 是两个作用域吧。于是在 pycharm 中关上 Terminal,而后持续运行python3 -m pip install openpyxl
,装置胜利后再次运行示例代码,胜利:
在减少点代码:
import pandas
def test():
xxx = pandas.read_excel('/Users/panjie/sync/work/task.xlsx')
print(xxx)
if __name__ == '__main__':
test()
打印一下:
/Users/panjie/PycharmProjects/pythonProject/venv/bin/python /Users/panjie/PycharmProjects/pythonProject/main.py
计划打算名 计划课组 课程号 ... 备注 备注.1 类型
0 软件 业余选修课 xxx ... 2~16 NaN 1
1 计算机 业余必修课 xxx ... 3~17 NaN 1
2 计算机 业余必修课 xxx ... 3~17 NaN 1
3 计算机 业余必修课 xxx ... 13*2+11*2 NaN 1
4 软件 学科平台课程 xxx ... 4~16 NaN 1
DBF 读写
想解决成可用的 dbf 文件,则须要对应用软件生成的 DBF 文件进行剖析。这时候则须要一个 python 下能够读写 dbf 文件的库。
而后找到了一个名为 dbfpy
的库来读写 dbf 库,但查看了一个最新的公布日期是 2015 年(它有可能只反对 python2),于是报着试试看的态度来装置一下。
(venv) panjie@panjies-iMac pythonProject % python3 -m pip install dbfpy
Collecting dbfpy
Downloading dbfpy-2.3.1.tar.gz (19 kB)
...
Installing collected packages: dbfpy
Successfully installed dbfpy-2.3.1
测试
同样,咱们按官网文档的示例代码来尝试进行读库:
import pandas
from dbfpy import dbf
def test():
xxx = pandas.read_excel('/Users/panjie/sync/work/task.xlsx')
print(xxx)
def testDbf():
db = dbf.Dbf("/Users/panjie/sync/work/x_kck.DBF")
for rec in db:
print
rec
print
if __name__ == '__main__':
testDbf()
而后运行的时候报错了:
print repr(_rec)
^
SyntaxError: invalid syntax
通过查问得悉 dbfpy 最大仅反对在 python2.7,而 python3 中无奈应用它。。。
于是开始转战另一个 dbf 库 —- dbf,看到它最新公布的日期是 2021 年,总算是释怀了:
(venv) panjie@panjies-iMac pythonProject % python3 -m pip install dbf
装置胜利后找到其官网文档,进行测试:
import pandas
from dbf import *
import dbf
def test():
xxx = pandas.read_excel('/Users/panjie/sync/work/task.xlsx')
print(xxx)
def testDbf():
db = dbf.Table(filename='/Users/panjie/sync/work/x_kck.DBF')
db.open(dbf.READ_WRITE)
for record in db:
print(record)
db.close()
if __name__ == '__main__':
testDbf()
测试后果:
0 - 课程编号 : '123'
1 - 课程名称 : '123'
2 - 备注 : ' '
3 - 简码 : ' '
4 - 标记 : ' '
5 - 输出人 : ' '
6 - 输出日期 : None
7 - 审核 : ' '
8 - 审核人 : ' '
9 - 审核日期 : None
测试写 DBF
读文件须要一行一行的来读,而写文件只须要追加记录即可:
def testDbf():
db = dbf.Table(filename='/Users/panjie/sync/work/x_kck.DBF')
db.open(dbf.READ_WRITE)
db.append({'课程编号': '456'})
for record in db:
print(record)
db.close()
上述代码,我尝试退出了 456 的记录,退出记录后再次打印记录值:
/Users/panjie/PycharmProjects/pythonProject/venv/bin/python /Users/panjie/PycharmProjects/pythonProject/main.py
0 - 课程编号 : '123'
1 - 课程名称 : '123'
2 - 备注 : ' '
3 - 简码 : ' '
4 - 标记 : ' '
5 - 输出人 : ' '
6 - 输出日期 : None
7 - 审核 : ' '
8 - 审核人 : ' '
9 - 审核日期 : None
0 - 课程编号 : '456' 😄😄😄😄😄😄
1 - 课程名称 : ' '
2 - 备注 : ' '
3 - 简码 : ' '
4 - 标记 : ' '
5 - 输出人 : ' '
6 - 输出日期 : None
7 - 审核 : ' '
8 - 审核人 : ' '
9 - 审核日期 : None
而这,正是我想要的。
收尾
解决了应用 python 读 excel、写 dbf 的相干技术点后,前面的代码实现便只是逻辑性解决问题了。把代码实现后,再简略保留一份,明年的时候将 10 个工作日的工作缩短为 1 个工作日,而置信写代码的工夫应该会管制在 1 个工作日。
这显著是个划的来的交易。
总结
语言只是工具,咱们学习的应该是思维。当接到一个新的跳战时,第一工夫应该这个跳转中的技术难点找进去,而从技术难点并解决那一刻开始,整个挑战便开始有了预期实现工夫。