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