Простой Python — страница 62 из 66

Small Gods,Terry Pratchett,1992

>>> text = '''title,author,year

… The Weirdstone of Brisingamen,Alan Garner,1960

… Perdido Street Station,China Miéville,2000

… Thud!Terry Pratchett,2005

… The Spellman Files,Lisa Lutz,2007

… Small Gods,Terry Pratchett,1992

… '''

>>> with open('books.csv', 'wt') as outfile:

…·····outfile.write(text)

201

6. Используйте модуль sqlite3, чтобы создать базу данных SQLite books.db и таблицу books, содержащую следующие поля: title (text), author (text) и year (integer):

>>> import sqlite3

>>> db = sqlite3.connect('books.db')

>>> curs = db.cursor()

>>> curs.execute('''create table book (title text, author text, year int)''')

>>> db.commit()

7. Считайте данные из файла books.csv и добавьте их в таблицу book:

>>> import csv

>>> import sqlite3

>>> ins_str = 'insert into book values(???)'

>>> with open('books.csv', 'rt') as infile:

…·····books = csv.DictReader(infile)

…·····for book in books:

…·········curs.execute(ins_str, (book['title'], book['author'], book['year']))

>>> db.commit()

8. Считайте и выведите на экран графу title таблицы book в алфавитном порядке:

>>> sql = 'select title from book order by title asc'

>>> for row in db.execute(sql):

…·····print(row)

('Perdido Street Station',)

('Small Gods',)

('The Spellman Files',)

('The Weirdstone of Brisingamen',)

('Thud!',)

Если вы хотите вывести на экран значение title, не пользуясь конструкциями для работы с кортежем (круглыми скобками и запятой), попробуйте следующее:

>>> for row in db.execute(sql):

…·····print(row[0])

Perdido Street Station

Small Gods

The Spellman Files

The Weirdstone of Brisingamen

Thud!

Если хотите проигнорировать начальное слово 'The' в заголовках, вам нужно написать еще одну строку SQL:

>>> sql = '''select title from book order by

… case when (title like "The %") then substr(title, 5) else title end'''

>>> for row in db.execute(sql):

…·····print(row[0])

Perdido Street Station

Small Gods

The Spellman Files

Thud!

The Weirdstone of Brisingamen

9. Считайте и выведите на экран все графы таблицы book в порядке публикации:

>>> for row in db.execute('select * from book order by year'):

…·····print(row)

('The Weirdstone of Brisingamen', 'Alan Garner', 1960)

('Small Gods', 'Terry Pratchett', 1992)

('Perdido Street Station', 'China Miéville', 2000)

('Thud!', 'Terry Pratchett', 2005)

('The Spellman Files', 'Lisa Lutz', 2007)

Чтобы вывести на экран все поля каждого ряда, просто разделите их запятой и пробелом:

>>> for row in db.execute('select * from book order by year'):

…·····print(*row, sep=', ')

The Weirdstone of Brisingamen, Alan Garner, 1960

Small Gods, Terry Pratchett, 1992

Perdido Street Station, China Miéville, 2000

Thud! Terry Pratchett, 2005

The Spellman Files, Lisa Lutz, 2007

10. Используйте модуль sqlalchemy, чтобы подключиться к базе данных sqlite3 books.db, которую вы только что создали в упражнении 6. Как и в упражнении 8, считайте и выведите на экран графу title таблицы book в алфавитном порядке:

>>> import sqlalchemy

>>> conn = sqlalchemy.create_engine('sqlite:///books.db')

>>> sql = 'select title from book order by title asc'

>>> rows = conn.execute(sql)

>>> for row in rows:

…·····print(row)

('Perdido Street Station',)

('Small Gods',)

('The Spellman Files',)

('The Weirdstone of Brisingamen',)

('Thud!',)

11. Установите сервер Redis и библиотеку Python Redis (с помощью команды pip install redis) на свой компьютер. Создайте хеш Redis с именем test, содержащий поля count (1) и name ('Fester Bestertester'). Выведите все поля хеша test:

>>> import redis

>>> conn = redis.Redis()

>>> conn.delete('test')

1

>>> conn.hmset('test', {'count': 1, 'name': 'Fester Bestertester'})

True

>>> conn.hgetall('test')

{b'name': b'Fester Bestertester', b'count': b'1'}

12. Увеличьте поле count хеша test и выведите его на экран:

>>> conn.hincrby('test', 'count', 3)

4

>>> conn.hget('test', 'count')

b'4'

Глава 9. Распутываем Всемирную паутину

1. Если вы еще не установили Flask, сделайте это сейчас. Это также установит werkzeug, jinja2 и, возможно, другие пакеты.

2. Создайте скелет сайта с помощью веб-сервера Flask. Убедитесь, что сервер начинает свою работу по адресу Localhost на стандартном порте 5000. Если ваш компьютер уже использует порт 5000 для чего-то еще, воспользуйтесь другим портом.

Так выглядит файл flask1.py:

from flask import Flask

app = Flask(__name__)

app.run(port=5000, debug=True)

Поехали:

$ python flask1.py

* Running on http://127.0.0.1:5000/

* Restarting with reloader

3. Добавьте функцию home(), которая обрабатывает запросы к домашней странице. Укажите ей возвращать строку запроса It's alive!.

Как нам назвать этот файл, flask2.py?

from flask import Flask

app = Flask(__name__)

@app.route('/')

def home():

····return "It's alive!"

app.run(debug=True)

Запустим сервер:

$ python flask2.py

* Running on http://127.0.0.1:5000/

* Restarting with reloader

Наконец, получим доступ к домашней странице через браузер, HTTP-программы командной строки вроде curl, или wget, или даже telnet:

$ curl http://localhost:5000/

It's alive!

4. Создайте шаблон для jinja2, который называется home.html и содержит следующий контент:

I'm of course referring to {{thing}}, which is {{height}} feet tall and {{color}}.