使用从 URL / Postcode 到 NUTS1 映射的文本文件创建 SQLite 数据库

Creating an SQLite database using a text file from a URL / Postcode to NUTS1 mapping

我已经通读了这里的其他 SQLite 问题 - 但不幸的是,我无法深入了解我的问题(即第 1 部分)。

所以我的问题分为两部分:

(1) 我正在尝试使用 sqlite3 python 模块将文本文件中的数据(以逗号分隔)获取到 SQLite 数据库中。我尝试的代码如下 - 虽然我收到一个错误 "parameters are of unsupported type" - 我认为这意味着我定义参数的方式不正确(假设有些包含字母和数字),虽然我已经尝试了多种格式,但似乎无法破解正确的组合

示例 URL:http://prod1.publicdata.landregistry.gov.uk.s3-website-eu-west-1.amazonaws.com/pp-monthly-update.txt

示例代码:

# Connect to the database (or create if it doesn't exit)
conn = sqlite3.connect("LandRegistry.db")

# Define the cursor
c = conn.cursor()

# Create a table
def create_table():
    c.execute("""CREATE TABLE IF NOT EXISTS PricePaidData(
    unique_ID TEXT, 
    price_paid INT, 
    deed_date TEXT, 
    postcode TEXT,
    property_type TEXT,
    new_build TEXT,
    estate_type TEXT,
    address_1 TEXT,
    address_2 TEXT,
    address_3 TEXT,
    address_4 TEXT,
    address_5 TEXT,
    address_6 TEXT,
    address_7 TEXT,
    transaction_category_1 TEXT,
    transaction_category_2 TEXT)""")

# Populate the database
def update_table():
    url = "http://prod1.publicdata.landregistry.gov.uk.s3-website-eu-west-1.amazonaws.com/pp-monthly-update.txt"
    data = urllib.request.urlopen(url).read()
    c.executemany("""INSERT INTO PricePaidData (
    unique_ID,
    price_paid,
    deed_date,
    postcode,
    property_type,
    new_build,
    estate_type,
    address_1,
    address_2,
    address_3,
    address_4,
    address_5,
    address_6,
    address_7,
    transaction_category_1,
    transaction_category_2) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);""", data)
    conn.commit()


create_table()
update_table()
c.close()
conn.close()

(2) 不确定这里是否适合提出这个问题 - 但我还想将地址从这里(我想邮政编码对这样做最有帮助)映射到 NUTS1 区域(如定义在下面 link)。之前的一个问题提到了一个 R 包,它在这里可能会有帮助——我最好在 Python 中这样做。我认为这样做的最佳方法是 (a) 在每个 NUTS 区域内下载 link 前缀邮政编码(到 csv?),(b) 运行 某种查找SQLite 数据库中邮政编码的前 2 个字母到 NUTS csv 和 return 单独列中的适当区域。任何有关我可以执行此操作的方法的指示都将不胜感激!

NUTS1 个地区:https://en.wikipedia.org/wiki/NUTS_1_statistical_regions_of_England

在此先感谢大家!

因此,urllib.request.urlopen(url).read() 只是 returns 通过获取给定的 URL 作为一大块字节返回的数据(或者可能是一个字符串?我不确定)。您必须将其拆分成行,并使用 CSV 解析库(python 附带一个)将每一行拆分成要插入的值。

或者你可以用几行shell脚本得到同样的效果:

#!/bin/sh
url="http://prod1.publicdata.landregistry.gov.uk.s3-website-eu-west-1.amazonaws.com/pp-monthly-update.txt"
curl -s -O "$url" && sqlite3 -batch -csv LandRegistry.db <<EOF
CREATE TABLE IF NOT EXISTS PricePaidData(
    unique_ID TEXT, 
    price_paid INTEGER, 
    deed_date TEXT, 
    postcode TEXT,
    property_type TEXT,
    new_build TEXT,
    estate_type TEXT,
    address_1 TEXT,
    address_2 TEXT,
    address_3 TEXT,
    address_4 TEXT,
    address_5 TEXT,
    address_6 TEXT,
    address_7 TEXT,
    transaction_category_1 TEXT,
    transaction_category_2 TEXT);
.import pp-monthly-update.txt PricePaidData
.quit
EOF
rm -f pp-monthly-update.txt

这使用 curl 将 CSV 数据下载到文件中,并使用 sqlite3 shell 的 CSV 导入功能将内容加载到 PricePaidData table(在创建所述 table 如果它还不存在。)