Выбрать главу

'47494638396101000100800000000000ffffff21f9' +

'0401000000002c000000000100010000020144003b'

>>> import binascii

>>> hex_str = '47494638396101000100800000000000ffffff21f9' + \

…·····'0401000000002c000000000100010000020144003b'

>>> gif = binascii.unhexlify(hex_str)

>>> len(gif)

42

13. Байты, содержащиеся в переменной gif, определяют однопиксельный прозрачный GIF-файл. Этот формат является одним из самых распространенных. Корректный файл формата GIF начинается со строки GIF89a. Является ли этот файл корректным?

>>> gif[:6] == b'GIF89a'

True

Обратите внимание на то, что нам нужно использовать b, чтобы указать, что строка состоит из байтов, а не из символов Unicode. Вы можете сравнить байты с байтами, но не можете сравнивать байты и символы:

>>> gif[:6] == 'GIF89a'

False

>>> type(gif)

<class 'bytes'>

>>> type('GIF89a')

<class 'str'>

>>> type(b'GIF89a')

<class 'bytes'>

14. Ширина файла формата GIF является шестнадцатибитным целым числом с обратным порядком байтов, которое начинается со смещения 6 байт. Его высота имеет такой же размер и начинается со смещения 8 байт. Извлеките и выведите на экран эти значения для переменной gif. Равны ли они 1?

>>> import struct

>>> width, height = struct.unpack('<HH', gif[6:10])

>>> width, height

(1, 1)

Глава 8. Данные должны куда-то попадать

1. Присвойте строку 'This is a test of the emergency text system' переменной test1 и запишите переменную test1 в файл с именем test.txt:

>>> test1 = 'This is a test of the emergency text system'

>>> len(test1)

43

Вот как можно сделать это с помощью функций open, write и close:

>>> outfile = open('test.txt', 'wt')

>>> outfile.write(test1)

43

>>> outfile.close()

Или можете использовать with и избежать вызова close (Python сделает это за вас):

>>> with open('test.txt', 'wt') as outfile:

…·····outfile.write(test1)

43

2. Откройте файл test.txt и считайте его содержимое в строку test2. Совпадают ли строки test1 и test2?

>>> with open('test.txt', 'rt') as infile:

…·····test2 = infile.read()

>>> len(test2)

43

>>> test1 == test2

True

3. Сохраните следующие несколько строк в файл books.csv. Обратите внимание на то, что, если поля разделены запятыми, вам нужно заключить поле в кавычки, если оно содержит запятую:

author,book

J R R Tolkien,The Hobbit

Lynne Truss,"Eats, Shoots & Leaves"

>>> text = '''author,book

… J R R Tolkien,The Hobbit

… Lynne Truss,"Eats, Shoots & Leaves"

… '''

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

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

73

4. Используйте модуль csv и его метод DictReader, чтобы считать содержимое файла books.csv в переменную books. Выведите на экран значения переменной books. Обработал ли метод DictReader кавычки и запятые в заголовке второй книги?

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

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

…·····for book in books:

…·········print(book)

{'book': 'The Hobbit', 'author': 'J R R Tolkien'}

{'book': 'Eats, Shoots & Leaves', 'author': 'Lynne Truss'}

5. Создайте CSV-файл с именем books.csv и запишите его в следующие строки:

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

>>> 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)''')

<sqlite3.Cursor object at 0x1006e3b90>

>>> 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']))

<sqlite3.Cursor object at 0x1007b21f0>