关于macos:macos如何安装phthon并处理excel及dbf的

47次阅读

共计 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 个工作日。

这显著是个划的来的交易。

总结

语言只是工具,咱们学习的应该是思维。当接到一个新的跳战时,第一工夫应该这个跳转中的技术难点找进去,而从技术难点并解决那一刻开始,整个挑战便开始有了预期实现工夫。

正文完
 0