Создание базы данных SQLite с использованием текстового файла из сопоставления URL / почтового индекса с NUTS1 - PullRequest
0 голосов
/ 23 января 2019

Здесь я прочитал другие вопросы по SQLite, но, к сожалению, не смог докопаться до сути моего вопроса (часть 1, то есть).

Итак, мой вопрос состоит из 2 частей:

(1) Я пытаюсь получить данные из текстового файла, разделенного запятыми, в базу данных SQLite с помощью модуля python sqlite3. Мой попытанный код приведен ниже - хотя я получаю сообщение об ошибке, в котором говорится, что «параметры неподдерживаемого типа» - я предполагаю, что это означает, что способ, которым я определил мои параметры, неверен (учитывая, что некоторые содержат как буквы, так и цифры), хотя я Я поиграл с несколькими форматами и, похоже, не смог подобрать правильную комбинацию

Пример URL: http://prod1.publicdata.landregistry.gov.uk.s3 -website-eu-west-1.amazonaws.com / pp-month-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 (как определено в ссылка ниже). В предыдущем вопросе упоминался пакет R, который может быть полезен здесь - я бы предпочел сделать это на Python. Я полагаю, что наилучшим способом сделать это было бы (а) загрузить ссылку прекодных почтовых индексов в каждой области NUTS (в csv?), (Б) запустить какой-то поиск первых 2 букв почтового кода в SQLite базы данных в NUTS CSV и вернуть соответствующий регион в отдельном столбце. Буду признателен за любые указания на то, как я могу это сделать!

NUTS1 регионов: https://en.wikipedia.org/wiki/NUTS_1_statistical_regions_of_England

Заранее всем спасибо!

1 Ответ

0 голосов
/ 23 января 2019

Итак, urllib.request.urlopen(url).read() просто возвращает данные, возвращаемые путем извлечения указанного URL-адреса в виде большого двоичного объекта (или, может быть, строки? Я не уверен).Вы должны разделить это на строки и использовать библиотеку разбора CSV (одна поставляется с python), чтобы разбить каждую из этих строк на значения для вставки.

Или вы можете получить тот же эффект с помощью нескольких строксценария оболочки:

#!/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 в файл и функция импорта CSV оболочки sqlite3 для загрузки содержимого в таблицу PricePaidData (после создания указанной таблицы, если она не 'т уже существует.)

...