pythoncsv:使用 Python 和 pureXML 操作 CSV 数据

  开始的前

  本教程主要针对希望了解如何以 XML 格式将数据存储在数据库中、从 Python 应用连接到 DB2 以及将数据从 CSV 文件转换成 XML 文档开发人员学习本教程不要求具备 Python 知识(您将在本教程中了解如何安装 Python)但具有相关知识会有所帮助本教程假设您使用 Microsoft® Windows® 操作系统但所用代码应该可用于其他操作系统在学习完本教程的后您将能够创建强大 Python 应用它可以和 IBM DB2 数据库交互并利用 pureXML 提供功能

  有关本教程

  常用缩略词

  API:应用编程接口

  CSV:逗号分隔值

  DBA:数据库管理员

  SQL:结构化查询语言

  UI:用户界面

  URL:统资源定位符

  XML:可扩展标记语言

  IBM DB2 数据库管理系统早就成为关系数据管理方面主导者不过在最近几年对更加灵活和面向文档数据结构需求越来越大这种数据结构杰出例子就是 XML

  在许多关系数据库系统开始在其数据库中添加某种形式 XML 支持时IBM DB2 是唯允许将 XML 原生地储存在数据库中产品不需要对 XML 形式进行任何更改这种技术称为 pureXML — 它允许 DB2 开发人员和 DBA 以 XML 数据和关系数据形式操作报告并且不对 XML 纯度产生不良影响

  在本教程中中您将开发个 Python 脚本它连接到美国人口普查局 Web 站点并下载个包含有关国家、地区和州级别人口数据 CSV 文件 —— 包括 2000 年人口普查结果并且在后续年份中该数据根据估算值浮动您将学习如何处理该数据即将它转换成 XML 文档您并不导入这个大型文档然后使用 DB2 将其划分成单个而是使用 Python 将该数据插入到 DB2 中其中使用个 XML 文档来储存 CSV 文件中对应每个相关行最后您将创建个命令行应用它生成些有关该数据有用报告这些报告根据人口从多到少顺序显示州、地区或国家列表

  先决条件

  要遵循本教程中步骤您需要安装以下软件Software:

  IBM DB2 Express-C 9.5 或更新版本

  Python Version 2.6 或 3.0 的前任何版本

  本教程假设您使用 Microsoft Windows 操作系统最好是 XP 或更新版本为了安装 Python 和针对 Python IBM DB2 扩展您需要具有管理员权限

  创建数据库

  在这个小节中在创建系列用于储存 XML 格式人口普查数据表的前您将使用 DB2 Command Editor 实用创建个新 IBM DB2 数据库您将创建这 3 个表:country、region 和 state每个表将为表中每个行储存个唯 ID以及储存个用于保存人口普查数据 XML 文档(在本教程后面从美国人口普查局 CSV 文件导入)

  创建数据库

  让我们开始创建数据库打开 DB2 Command Editor (Start>Programs>IBM DB2>[DB2 Instance Name]>Command Line Tools) 并输入以下命令:create database census using code UTF-8 territory US

  完成该过程需要两分钟请耐心等待完成的后您将收到条这样响应消息:DB20000I The CREATE DATABASE command completed successfully

  窍门技巧:您可以在 Command Editor 中按 Ctrl+Enter 快速执行命令

  现在使用以下命令连接到新创建人口普查数据库:connect to census

  在这里您还应该收到条来自 DB2 服务器响应消息:A JDBC connection to the target has succeeded

  现在已经创建好数据库您可以创建用于储存应用数据表了

  创建数据库表

  您将把人口数据装载到数据库并将其储存在 3 个独立表中:country、region 和 state现在让我们通过 清单 1 创建这些表

清单 1. 用于创建表 DDL SQL 语句

create table country ( 
  id  not null generated by default as identity, 
  data xml not null, 
  primary key(id) 
); 
 
create table region ( 
  id  not null generated by default as identity, 
  data xml not null, 
  primary key(id) 
); 
 
create table state ( 
  id  not null generated by default as identity, 
  data xml not null, 
  primary key(id) 
); 


  所有这些表都储存相同类型数据 —— 每插入个行时 DB2 自动生成标识符以及用于为每个行储存个 XML 文档 XML 数据列严格来说您可以在这里仅使用个表然后在其上创建个类型列来决定行是 country、region 还是 state但是将数据储存在 3 个表中为以后操作带来更多灵活性

  当您执行以上 SQL 语句时DB2 将为每个表返回以下响应消息:DB20000ISQL 命令成功完成

  配置好数据库的后您可以安装 Python 和针对 Python ibm_db 扩展了

  安装和配置 Python

  Python 是非常关注代码可读性高级编程语言和许多其他缩进和编程风格由开发人员决定编程语言区别Python 要求您必须使用缩进来表示代码块(比如类、语句和循环)Python 易于学习、生成代码非常干净美观、适用于许多区别平台因此它是开发许多应用项目不错选择

  有关 Python

  尽管 Python 通常预安装在 Mac OS X 和 Linux® 操作系统上但它并没有预安装在 Microsoft Windows 操作系统上幸运您可以从 Web 下载 Python 并将其安装到 Windows 操作系统上 —— 下个小节将进行介绍不过在开始的前您应该知道下载 Python for Windows 有许多可选方式

  第个选择是使用开源官方 2进制安装可从 Python 官方站点下载这种方式提供最新 Python 版本并且是根据开源许可提供在本教程中您将使用这个版本 Python

  另外商业性 ActiveState Python 提供些额外资源来方便使用 Python 开发基于 Win32 API 应用这些资源包括完整文档和其他 Python 扩展包括针对 Windows 扩展

  安装 Python

  安装 Python 步是从官方 Python Web 站点下载它在撰写本教程时Python 当前生产版本是 2.6.4 和 3.1.1本教程假设您使用 2.6.* 版本 Python由于 3.0 以后版本是非向后兼容因此我强烈建议您下载 3.0 的前版本(2.x.x)完成下载的后将文件保存到硬盘中然后打开 .msi 文件启动安装

  在安装启动时它将询问您是供所有用户使用还是仅供个人使用(在 Windows Vista® 中没有这个选项)使用默认选项 Install for all users 并按 Next 继续现在将询问您选择个目标目录默认目录类似于 C:\Python26\;在这里也使用默认值并按 Next 继续您将可以从这里定制 Python 安装选择您需要安装特性默认情况下将选择所有特性因此使用默认设置并按 Next 开始安装过程这个过程需要几分钟时间安装完成的后您将看到个类似于 图 1 窗口

图 1. Completing the Python 2.6.4 Installer 窗口


  按下 Finish 退出安装在进入下个步骤的前您应该检查 Python 是否能够正常工作您可以使用添加到 Windows 开始菜单栏快捷方式不过我建议您从命令提示符启动 Python您将以这种方式运行在本教程后面创建脚本

  首先通过运行对话框打开 Windows 命令提示符窗口(Start>Run然后输入 cmd)或导航到 Start>Programs>Accessories>Command Prompt在命令提示符处输入命令:python

  现在您应该在 Python 提示符处即 图 2 中 >>>

图 2. Python 提示符


  注意:如果您看到消息 python is not recognized as an ernal or external command, operable program or batch file这表明 Python 目录没有在 Windows Path 中要退出 Python 提示符输入以下命令:quit

  在 Python 提示符处输入了该命令的后您将返回到 Windows 命令提示符在下个小节中您将学习如何安装 ibm_db Python 扩展该扩展允许您通过 Python 连接到 DB2 数据库

  安装 ibm_db Python 扩展

  针对 Python ibm_db 扩展允许您使用 Python 代码连接到 IBM DB2 数据库并和的交互要安装该扩展首先需要安装 easy_ 实用(uptools)导航到 uptools package 页面将这个文件下载到硬盘中下载完成的后打开它将 easy_.exe 应用安装到 Python Scripts 目录中(通常为 C:\Python26\Scripts)

  安装 ibm_db 扩展是非常简单打开个 Windows 命令提示符窗口(Start>Run>cmd)并输入以下命令如果您将 Python 安装到其他目录要相应地更改引用:C:\Python26\Scripts\easy_ ibm_db

  这将自动地搜索、下载、提取和安装 ibm_db 扩展完成的后您将返回到 Windows 命令提示符如 图 3 所示

图 3. 成功安装 ibm_db 扩展


  接下来您将通过连接到您在前面创建 DB2 数据库来测试 ibm_db 扩展是否正常工作

  从 Python 连接到 DB2

  创建了 DB2 数据库并安装和配置好 Python 和 ibm_db 扩展的后您现在可以检查是否可以从 Python 连接到 DB2打开 Windows 命令提示符并发出 python 命令来启动 Python 解释器

  在提示符处输入以下命令以连接到 DB2 并计算 country 表中行数注意这里包含 Python 提示符 (>>> 和 ...) 仅用于演示目您不能将它们输入到解释器中此外确保使用您实际 DB2 证书替换 清单 2 中证书

清单 2. 连接到 DB2 Python 代码

>>> import ibm_db 
>>> conn = 
 ibm_db.connect("DATABASE=census;HOSTNAME=localhost;PORT=50000; 
PROTOCOL=TCPIP;UID=username;PWD=password;", "", "") 
>>> sql = "SELECT COUNT(*) FROM country" 
>>> stmt = ibm_db.exec_immediate(conn, sql) 
>>> result = ibm_db.fetch_both(stmt) 
>>> while result != False: 
...   pr "Count: ", result[0] 
...   result = ibm_db.fetch_both(stmt) 
... 


  在输入最后行代码的后按下 Enter 键将执行该代码您将看到类似于 图 4 所示结果 (Count: 0)

图 4. DB2 连接测试结果


  如果您不能从 Python 代码连接到 DB2请检查 ibm_db 扩展是否正确安装以及是否按照本教程前面描述创建了 DB2 数据库此外还要检查您用于连接到 DB2 证书是正确

  设置好数据库并配置好 Python 的后您现在可以进入本教程主题了在下个小节中您将从美国人口普查局下载、解析和转换 CSV 数据并以 XML 格式将其保存在 DB2 数据库中然后您将学习如何从数据库读取这些数据并将其呈现给用户

  下载和转换 CSV 数据

  在这个小节中您将学习如何创建个从美国人口普查局 Web 站点下载 CSV 文件 Python 脚本接下来您将处理该 CSV 数据并将其转换成可以储存在先前创建 DB2 数据库中 XML 数据

  在开始的前您需要在硬盘任意位置创建个用于储存项目文件目录我将数据储存在 C:\pycensus 目录下我建议您也使用该目录

  从美国人口普查局 Web 站点下载 CSV 文件

  美国人口普查局提供多种格式数据供您下载不幸2000 年及往后年份人口统计数据仅以 CSV 格式提供但这并不构成问题您可以使用 Python 从人口普查局 Web 站点下载 CSV 文件然后将其转换成可以储存在 DB2 pureXML 数据库中 XML 数据

  您还可以选择将 Web 浏览器指向 CSV 文件项目文件夹 URL不过在这里您通过构建 Python 脚本来完成该任务在您文本编辑器中创建个新文件并以 download.py 为名称将其保存在项目文件夹中(例如 C:\pycensus)将 清单 3 中代码添加到该文件中

清单 3. download.py

import httplib 
conn = httplib.HTTPConnection("www.census.gov") 
conn.request("GET", "/popest/national/files/NST-EST2008-alldata.csv") 
response = conn.getresponse 
f = open('data.csv', 'w') 
f.write(response.read) 
f.close 
conn.close 


  在该脚本中您使用 httplib 模块连接到 census.gov Web 站点并发出请求所需 CSV 文件 GET 请求接下来您将获取响应并将其写到名为 data.csv 文件中要运行该脚本打开 Windows 命令提示符并按照以下方式切换到项目目录:cd \pycensus

  接下来通过以下命令运行 Python 脚本:python download.py

  在脚本运行完毕的后您将返回到命令提示符处您可能会问 “为什么没有生成消息” —— 不用担心这表明没有发生任何在 Windows Explorer 浏览器中打开您项目文件夹现在您将注意到在 data.csv 文件夹下多了个文件如果您安装了 Microsoft Excel®它就是这种文件类型默认处理打开该文件将生成类似于 图 5 结果

图 5. Microsoft Excel 中 data.csv


  警告:不要在 Excel 中保存该文件这样做会改变 CSV 文件格式Python 可能不能识别这种格式如果 Excel 询问您是否保存文件选择 No如果意外保存了该文件那么删除它并重新运行 download.py Python 脚本在下个小节中您将学习如何获取这个 CSV 文件并将其转换成 XML

  将 CSV 数据转换成 XML 文档

  要将 CSV 转换成 XML您首先必须明白应该如何储存数据是否分开储存区别记录并检查是否存在应该删除无用记录在您刚才下载样例 CSV 文件中您将注意到它包含 3 种类型数据:1 行针对整个国家数据;4 行针对地区 Northeast、Midwest、South 和 West 数据、51 行针对美国 50 个州和哥伦比亚特区数据还有 1 行针对 Puerto Rico Commonwealth 数据该文件行是个标题行用作列名

  您在本小节中创建脚本将选择标题行并使用该数据构成 XML 文档中记录应该具有每个元素标记名该脚本将根据前 4 列决定特定行引用 country、region 还是 state并相应地设置标记名以表明引用哪个 XML 文档最后该脚本将选择排除 Puerto Rico Commonwealth 记录它包含不完整数据

  在您文本编辑器中创建个新文件并以 convert.py 为名保存它将 清单 4 中代码添加到该文件中

清单 4. convert.py

import csv 
 
reader = csv.reader(open('data.csv'), delimiter=',', quoting=csv.QUOTE_NONE) 
 
pr "<data>" 
for record in reader: 
   reader.line_num  1: 
    header = record 
  : 
    innerXml = "" 
    dontShow = False 
    type = "" 
    for i, field in enumerate(record): 
      innerXml  "<%s>" % header[i].lower + field + "</%s>" 
% header[i].lower 
       i  1 and field  "0": 
        type = "country" 
      el type  "" and i  3 and field  "0": 
        type = "region" 
      el type  "" and i  3 and field != "0": 
        type = "state" 
 
       i  1 and field  "X": 
        dontShow = True 
 
     dontShow  False: 
      xml = "<%s>" % type 
      xml  innerXml 
      xml  "</%s>" % type 
      pr xml 
pr "</data>" 


  在这个文件中您使用 csv 库来读取 data.csv 文件您以打开 <data> 和关闭 </data> XML 标记包围输入仅生成个文档输出然后您将遍历 CSV 文件如果当前行是文件就将该记录设置为标题这在后面被用作脚本中 country、region 或 state 记录中每个字段元素名如果当前行不是标题记录您将遍历该记录中每个列并创建个内部 XML 元素其名称来自标题记录然后检查处理行是否引用 country、region 或 state并将内部 XML 元素相应地包围在外部标记 <country>、<region> 或 <state> 中最后您将检查该记录是否在特定字段中包含 X如果是将布尔指示器设置为 True它将阻止将特定行添加到 XML 文档中运行该脚本方式的是发出命令:python convert.py

  以这种方式运行该脚本将生成类似于 图 6 结果

图 6. convert.py 输出


  如您所见该脚本直接在屏幕上显示数据如果将数据保存在个文件中作用就更加大了您不需要创建其他 Python 代码来完成该任务仅需更改发出命令告诉命令提示符将输出保存到个名为 data.xml 文件中:python convert.py > data.xml

  这将在项目目录中创建个名为 data.xml 新文件如果您在个能够读取和格式化 XML 应用中(比如 Firefox)打开该文件将看到类似于 图 7 输出

Tags:  db2purexml purexml pythoncsv中文 pythoncsv

延伸阅读

最新评论

发表评论