原标题:如何用 Python 读取数据?
这是林骥的第 36 篇文章
1. 序言
读取数据往往是做数据分析的第一步,本文没有讲那些艰涩难懂的概念,只有一些问题的解决方案,当你遇到类似的问题的时候,可以拿来参考借鉴。
首先,我们下载并安装最新的 Python 集成环境:Anaconda,其次,在命令行输入 jupyter lab,系统将用浏览器打开下面的网址:
http://localhost:8888/lab
然后,在其中新建一个 Notebook,接下来就可以开始写代码了。
我们将统一使用 Pandas 来读取数据:
# 导入 pandas 模块
importpandas aspd
这是每次重新开始数据分析之前,都需要运行的代码,以后凡是见到包含 pd. 的代码,就表示我们已经运行了这行代码。
输入 pd.read 后,按 Tab 键,系统将把以 read 开头的函数和模块都列出来。
运行以下代码:
pd.*read*?
返回的结果是 Pandas 中所有包含 read 的函数和模块,可以看出 Pandas 能够读取的数据类型有很多,我选择几个常用的函数进行简要的介绍。
2. 如何从 Excel 文件中读取数据?
我们直接看 Python 代码:
# 导入 Excel 文件
df = pd.read_excel( '文件名.xlsx')
其中 pd.read_excel 函数,有很多可选参数,如果你忘记了具体用法,可以运行:
# 查询帮助文档
pd.read_excel?
你将会看到比较详细的帮助文档,还有一些例子。
我觉得使用问号( ? )是一个非常好的方法,适用于各种对象。
如果一个问号还解决不了问题,那么还可以试试双问号( ?? ):
# 查询帮助文档和源代码
pd.read_excel??
3. 如何从 MySQL 数据库中读取数据?
在第一次运行之前,需要先安装 pymysql ,在 Jupyter Notebook 中运行:
# 安装或更新 pymysql
!pip3 install --upgrade pymysql
安装成功后,可以用下面的代码实现从 MySQL 数据库中读取数据:
# 从 sqlalchemy 导入创建引擎的功能
fromsqlalchemy importcreate_engine
# 建立数据库连接,替换其中的用户名、密码、主机地址、端口、数据库名
con = create_engine( 'mysql+pymysql://root:xxxxxx@192.168.0.1:3306/testdb')
# 写 SQL 语句
sql = "SELECT * FROM table"
# 读取数据
df = pd.read_sql(sql, con)
df.head
如果相关信息正确,且能正常连通数据库,那么运行将得到一个数据框。
但是,上面的代码包含数据库密码这类敏感信息,建议不要直接把这类敏感信息直接写在代码中,一旦不小心上传到网上,就容易造成信息泄露。
我们可以把敏感信息保存在单独的文件中,首先,在当前运行环境的目录下面,新建一个文件夹,命名为 password;其次,在 password 文件夹中,新建一个文件,命名为 root@mysql.txt;然后,在该文件中,输入以下内容:
mysql+pymysql://root:xxxxxx@192.168.0.1:3306/testdb
接下来,我们就可以调用这个包含敏感信息的文件:
# 从 sqlalchemy 导入创建引擎的功能
fromsqlalchemy importcreate_engine
# 建立数据库连接,替换其中的用户名、密码、主机地址、端口、数据库名
db_info = open( 'password/root@mysql.txt')
con = create_engine(db_info.read)
# 写 SQL 语句
sql = "SELECT * FROM table"
# 读取数据
df = pd.read_sql(sql, con)
df.head
因为敏感信息已经隐藏到其他文件中了,所以信息相对更加安全。
4. 如何从 PostgreSQL 数据库中读取数据?
在第一次运行之前,需要先安装 py-postgresql ,在 Jupyter Notebook 中运行:
# 安装或更新 py-postgresql
!pip3 install --upgrade py-postgresql
安装成功后,可以用下面的代码实现从 PostgreSQL 数据库中读取数据:
# 从 sqlalchemy 导入创建引擎的功能
fromsqlalchemy importcreate_engine
# 建立数据库连接,替换其中的用户名、密码、主机地址、端口、数据库名
con = create_engine( 'postgres://linjiwx:xxxxxx@192.168.0.2:5432/testdb')
# 写 SQL 语句
sql = "SELECT * FROM table"
# 读取数据
df = pd.read_sql(sql, con)
df.head
类似地,你也可以参考前面介绍过的方法,把密码等敏感信息保存在单独的文件中,我们在这里就不重复演示了。
5. 如何从 Oracle 数据库中读取数据?
在第一次运行之前,需要先安装 cx_Oracle ,在 Jupyter Notebook 中运行:
# 安装或更新 cx_Oracle
!pip3 install --upgrade cx_Oracle
安装成功后,可以用下面的代码实现从 Oracle 数据库中读取数据:
# 防止中文乱码
importosos.environ[ 'NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
# 从 sqlalchemy 导入创建引擎的功能
fromsqlalchemy importcreate_engine
# 建立数据库连接,替换其中的用户名、密码、主机地址、端口、数据库名
con = create_engine( 'oracle+cx_oracle://system:xxxxxx@192.168.0.3:1521/orcl')
# 写 SQL 语句
sql = "SELECT * FROM table"
# 读取数据
df = pd.read_sql(sql, con)
从上面的几个例子,我们可以看到,利用 SQLAlchemy 框架,从不同数据库中读取数据的方法非常相似,只需要简单地修改一些参数即可。
6. 如何从网页中读取数据?
当访问 https 网页时,为了防止报错,需要用到 ssl 模块,解决证书不受信任的问题。
# 为了防止报错:SSLV3_ALERT...
importssl
ssl._create_default_https_context = ssl._create_unverified_context
# 网址
url = 'http://s.askci.com/stock/a/?reportTime=2019-03-31&pageNum=1'
# 读取网页中的表格数据
dfs = pd.read_html(url)
其中 read_html 函数会读取当前网页的所有表,我们可以用 dfs[0] 获取网页中的第一个表。
7. 小结
在正式开始进行数据分析之前,通常需要先读取数据,本文介绍了用 Python 从 5 种不同的地方读取数据,分别是从 Excel、MySQL、PostgreSQL、Oracle 数据库和网页中读取数据,其中有一些代码其实是伪代码,不是复制粘贴后就能直接运行得到结果的,需要你根据自己的实际情况,修改其中的参数和表名等信息。
最后,不要忘了去实践,就像你学骑自行车,就算你把理论知识都彻底搞明白了,如果不骑上自行车去试试,那么终究还是不会骑的。
责任编辑: