使用从 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 如果它还不存在。)
我已经通读了这里的其他 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 如果它还不存在。)