Экспортируем цитаты из greatwords.ru в sqlite и фильтруем по авторам

Разработка приложений на python. Советы, примеры и обсуждение найденных ошибок
Ответить
Аватара пользователя
ZEN
Администратор
Сообщения: 1350
Зарегистрирован: 27 сен 2012, 18:23
Темы: 206
Откуда: Украина, Одесса
Статус: Не в сети

Экспортируем цитаты из greatwords.ru в sqlite и фильтруем по авторам

Сообщение ZEN » 17 апр 2016, 13:18

В продолжение темы "Делаем дамп цитат из greatwords.ru".

Следующий скрипт считывает из текстового дампа цитаты и их авторов, а так же делает проверку на присутствие автора в белом списке (К сожалению, на сайте полно цитат от неизвестных людей, а так же спама и различных глупостей).

Код: Выделить всё

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import re
import sqlite3
import logging
from argparse import ArgumentParser

START_MARK = '### START ###'
COPYRIGHT_MARK = '(c)'
END_MARK = '### END ###'
AUTHOR_WHITELIST = [
    'Абу-ль-Фарадж бин Харун', 'Наринэ Абгарян', 'Пьер Абеляр', 'Кобо Абэ',
    'Бертольд Авербах', 'Аркадий Тимофеевич Аверченко', 'Авиценна',
    'Августин Блаженный Аврелий', 'Марк Аврелий', 'Генри Брукс Адамс',
    'Дуглас Адамс', 'Джозеф Аддисон', 'Альфред Адлер', 'Сергей Азарин',
    'Айзек Азимов', 'Шарль Азнавур', 'Чингиз Айтматов', 'Борис Акунин',
    'Рюноскэ Акутагава', 'Жан Лерон Д’Аламбер', 'Мухаммед Али', 'Альфонс Алле',
    'Вуди Аллен', 'Джеймс Аллен', 'Фред Аллен', 'Алексей Дмитриевич Алферов',
    'Валерио Альбисетти', 'Виктор Амазаспович Амбарцумян', 'Анри Амьель',
    'Леонид Андреев', 'Антисфен', 'Жан Ануй', 'Джон Апдайк', 'Али Апшерони',
    'Аристотель', 'Аристофан', 'Мария д’Арконвиль', 'Мэтью Арнолд', 'Архимед',
    'Сесилия Ахерн', 'Ахиакар', 'Анна Ахматова', 'Марсель Ашар',
    'Исаак Эммануилович Бабель', 'Джордж Байрон', 'Оноре де Бальзак',
    'Бриджит Бардо', 'Джулиан Барнс', 'Джеймс Барри', 'Джон Барримор',
    'Сэмюэль Батлер', 'Ричард Бах', 'Александр Башлачев', 'Август Бебель',
    'Фредерик Бегбедер', 'Анри Бек', 'Виссарион Григорьевич Белинский',
    'Моника Беллуччи', 'Генрих Теодор Бёлль', 'Нина Берберова',
    'Ингмар Бергман', 'Анри Бергсон', 'Николай Бердяев', 'Эдмунд Бёрк',
    'Гектор Берлиоз', 'Тристан Бернар', 'Людвиг Бёрне', 'Уильям Берроуз',
    'Джон Грегори Бетанкур', 'Людвиг ван Бетховен', 'Джош Биллингс',
    'Амброз Бирс', 'Отто фон Бисмарк', 'Генри Уорд Бичер',
    'Елена Петровна Блаватская', 'Уильям Блейк', 'Ванда Блоньская',
    'Александр Александрович Блок', 'Шарль Бодлер', 'Генри Томас Бокль',
    'Пьер Бомарше', 'Нильс Бор', 'Хорхе Луис Борхес', 'Пьер Эдмон Бошен',
    'Боэций', 'Роберт Браунинг', 'Джералд Бренан', 'Бертольт Брехт',
    'Эшли Бриллиант', 'Иосиф Бродский', 'Шарлотта Бронте', 'Эмили Бронтэ',
    'Веслав Брудзиньский', 'Джордано Бруно', 'Рэй Брэдбери', 'Ричард Брэнсон',
    'Николя Буало-Депрео', 'Пьер Буаст', 'Гаутама Будда', 'Хорхе Букай',
    'Чарльз Буковски', 'Юзеф Булатович', 'Эдуард Булвер-Литтон',
    'Михаил Афанасьевич Булгаков', 'Кароль Бунш', 'Бхартрихари',
    'Френсис Бэкон', 'Поль Валери', 'Вилле Вало', 'Маргарита Наваррская Валуа',
    'Александр Валентинович Вампилов', 'Александр Васильев',
    'Джордж Вашингтон', 'Карл Юлиус Вебер', 'Феликс Лопе де Вега',
    'Вегеций', 'Отто Вейнингер', 'Франциск Родольф Вейсс',
    'Михаил Иосифович Веллер', 'Бернар Вербер', 'Вергилий', 'Гор Видал',
    'Лууле Виилма', 'ВиКи', 'Леонардо да Винчи', 'Людвиг Витгенштейн',
    'Януш Вишневский', 'Ивлин Во', 'Люк де Клапье Вовенарг',
    'Елена Войнаровская', 'Вольтер', 'Билл Вон', 'Курт Воннегут',
    'Восточная мудрость', 'Элайджа Вуд', 'Владимир Высоцкий', 'Анна Гавальда',
    'Тимур Гагин', 'Галилео Галилей', 'Джордж Галифакс', 'Махатма Ганди',
    'Габриель Гарсиа Маркес', 'Эрнесто Че Гевара', 'Георг Гегель',
    'Нил Гейман', 'Генрих Гейне', 'Билл Гейтс', 'Томас Гексли',
    'Клод Адриан Гельвеций', 'Александр Генис', 'О. Генри', 'Майкл Э. Гербер',
    'Фрэнк Герберт', 'Геродот', 'Александр Герцен', 'Герман Гессе',
    'Иоганн Вольфганг Гёте', 'Владислав Гжегорчик', 'Владислав Гжещик',
    'Виталий Лазаревич Гинзбург', 'Саша Гитри', 'Дмитрий Глуховский',
    'Винсент Ван Гог', 'Николай Васильевич Гоголь', 'Жан-Люк Годар',
    'Шарль де Голль', 'Джон Голсуорси', 'Братья Гонкур', 'Иван Гончаров',
    'Гораций', 'Максим Горький', 'Теофиль Готье', 'Даниил Гранин',
    'Бальтасар Грасиан', 'Борис Гребенщиков', 'Джон Грин', 'Александр Грин',
    'Джермейн Грир', 'Евгений Гришковец', 'Ольга Громыко', 'Виктор Губарев',
    'Игорь Губерман', 'Терри Гудкайнд', 'Урсула ле Гуин', 'Виктор Гюго',
    'Делия Стейнберг Гусман', 'Аркадий Филиппович Давидович', 'Далай-лама',
    'Сальвадор Дали', 'Данте Алигьери', 'Чарльз Дарвин', 'Рене Декарт',
    'Адриан Декурсель', 'Поль Декурсель', 'Демокрит', 'Джонни Депп',
    'Джим Джармуш', 'Халиль Джебран', 'Уильям Джеймс', 'Томас Джефферсон',
    'Армен Джигарханян', 'Стив Джобс', 'Анджелина Джоли', 'Сэмюэль Джонсон',
    'Дени Дидро', 'Бенджамин Дизраэли', 'Филип Дик', 'Чарльз Диккенс',
    'Диоген', 'Марлен Дитрих', 'Сергей Довлатов', 'Артур Конан Дойл',
    'Виктор Рафаэльевич Дольник', 'Дон-Аминадо', 'Джон Драйден',
    'Федор Михайлович Достоевский', 'Теодор Драйзер', 'Элеонора Дузе',
    'Робертсон Дэвис', 'Шарль Дюкло', 'Александр Дюма', 'Еврипид',
    'Марина и Сергей Дяченко', 'Дмитрий Емец', 'Елена Ермолова',
    'Сергей Александрович Есенин', 'Иван Ефремов', 'Роджер Желязны',
    'Михаил Михайлович Жванецкий', 'Жозеф Жубер', 'Евгений Замятин',
    'Вадим Зеланд', 'Георг Зиммель', 'Эмиль Золя', 'Леонид Зорин',
    'Кароль Ижиковский', 'Иван Александрович Ильин', 'Ильф и Петров',
    'Роберт Ингерсолл', 'Янина Ипохорская', 'Фазиль Искандер', 'Клинт Иствуд',
    'Итальянская пословица', 'Вениамин Александрович Каверин', 'Альбер Камю',
    'Иммануил Кант', 'Петр Леонидович Капица', 'Трумен Капоте', 'Альфред Капю',
    'Томас Карлейль', 'Джордж Карлин', 'Дейл Карнеги', 'Альфонс Жан Карр',
    'Гарри Каспаров', 'Карлос Кастанеда', 'Франц Кафка', 'Джон Мейнард Кейнс',
    'Джон Кеннеди', 'Джек Керуак', 'Марта Кетро', 'Кен Кизи',
    'Роберт Кийосаки', 'Мартин Лютер Кинг', 'Стивен Кинг',
    'Китайская мудрость', 'Артур Кларк', 'Джереми Кларксон',
    'Тамара Клейман', 'Поль Клодель', 'Василий Ключевский', 'Андрей Кнышев',
    'Курт Кобейн', 'Жан Кокто', 'Сьюзен Коллинз', 'Чарльз Калеб Колтон',
    'Сэмюэл Кольридж', 'Кшиштоф Конколевский', 'Конфуций', 'Пьер Корнель',
    'Владимир Галактионович Короленко', 'Хулио Кортасар', 'Елена Котова',
    'Пауло Коэльо', 'Леонард Коэн', 'Карл Краус', 'Борис Юрьевич Кригер',
    'Агата Кристи', 'Петр Алексеевич Кропоткин', 'Эмиль Кроткий',
    'Камерон Кроу', 'Алистер Кроули', 'Борис Крутиер', 'Лешек Александр Кумор',
    'Абай Кунанбаев', 'Милан Кундера', 'Дин Кунц', 'Эмир Кустурица',
    'Станислав Васильевич Курилов', 'Сьерен Кьеркегор', 'Льюис Кэрролл',
    'Жан де Лабрюйер', 'Сергей Лазарев', 'Жан Батист Анри Лакордер',
    'Григорий Ландау', 'Лев Ландау', 'Нинон де Ланкло', 'Лао-цзы',
    'Франсуа де Ларошфуко', 'Габриэль Лауб', 'Фран Лебовиц', 'Владимир Леви ',
    'Марк Леви', 'Хит Леджер', 'Готфрид Лейбниц', 'Станислав Лем',
    'Роберт Лембке', 'Джон Леннон', 'Леонид Максимович Леонов',
    'Михаил Юрьевич Лермонтов', 'Готхольд Лессинг', 'Егор Летов',
    'Станислав Ежи Лец', 'Брюс Ли', 'Хорхе Анхель Ливрага', 'Авраам Линкольн',
    'Георг Лихтенберг', 'Михаил Васильевич Ломоносов', 'Генри Лонгфелло',
    'Джек Лондон', 'Софи Лорен', 'Дэвид Герберт Лоуренс', 'Джордж Лукас',
    'Сергей Васильевич Лукьяненко', 'Клайв Льюис', 'Малкольм Маггеридж',
    'Стефани Майер', 'Андрей Макаревич', 'Никколо Макиавелли',
    'Колин Маккалоу', 'Андрей Максимов', 'Геннадий Малкин',
    'Мераб Мамардашвили', 'Михаил Мамчич', 'Нельсон Мандела', 'Томас Манн',
    'Паоло Мантегацца', 'Александра Маринина', 'Граучо Маркс', 'Карл Маркс',
    'Боб Марли', 'Джордж Р. Р. Мартин', 'Марк Валерий Марциал',
    'Абрахам Маслоу', 'Мать Тереза', 'Владимир Владимирович Маяковский',
    'Цаль Меламед', 'Константин Мелихан', 'Генри Луис Менкен',
    'Вольфганг Менцель', 'Олег Меньшиков', 'Айрис Мердок', 'Фредди Меркьюри',
    'Генри Миллер', 'Алан Александр Милн', 'Джон Мильтон', 'Маргарет Митчелл',
    'Дэвид Митчелл', 'Вернер Мич', 'Жюль Мишле', 'Лиланд Экстон Модезитт',
    'Мэрилин Монро', 'Мацуо Монро', 'Мишель де Монтень', 'Анри де Монтерлан',
    'Шарль Луи де Монтескьё', 'Ги де Мопассан', 'Франсуа Мориак',
    'Аланис Мориссетт', 'Джим Моррисон', 'Вигго Мортенсен', 'Андре Моруа',
    'Уильям Сомерсет Моэм', 'Майкл Мур', 'Ольга Муравьёва', 'Харуки Мураками',
    'Рю Мураками', 'Майкл Муркок', 'Акрам Муртазаев', 'Антон Мусулин',
    'Юрий Игнатьевич Мухин', 'Ролло Мэй', 'Джойс Мэйнард', 'Мэрилин Мэнсон',
    'Эндрю Мэтьюз', 'Альфред де Мюссе', 'Татьяна Набатникова',
    'Владимир Владимирович Набоков', 'Алишер Навои', 'Мартина Навратилова',
    'Нагарджуна', 'Юрий Маркович Нагибин', 'Дмитрий Нагиев', 'Ашот Наданян',
    'Михаил Наими', 'Анатолий Найман', 'Фрэнк Найт', 'Флоренс Найтингейл',
    'Микаэл Налбандян', 'Софья Налковская', 'Фритьоф Нансен',
    'Стефан Наперский', 'Наполеон Бонапарт', 'Александр Глебович Невзоров',
    'Джон фон Нейман', 'Джон Нейсбитт', 'Николай Алексеевич Некрасов',
    'Борис Немцов', 'Джавахарлал Неру', 'Юрий Леонидович Нестеренко',
    'Иоганн Нестрой', 'Гарегин Нжде', 'Джек Николсон', 'Алексей Никонов',
    'Юрий Никулин', 'Фридрих Вильгельм Ницше', 'Огден Нэш', 'Овидий',
    'Владимир Одоевский', 'Аксель Оксеншерна', 'Генри Лайон Олди',
    'Ричард Олдингтон', 'Доминик Опольский', 'Роберт Орбен',
    'Хосе Ортега-и-Гассет', 'Джордж Оруэлл', 'Джейн Остин',
    'Николай Алексеевич Островский', 'Алескандр Николаевич Островский', 'Ошо',
    'Милорад Павич', 'Чак Паланик', 'Оксана Панкеева', 'Вадим Панов',
    'Марсель Паньоль', 'Блез Паскаль', 'Луи Пастер', 'Борис Пастернак',
    'Ларри Пейдж', 'Виктор Олегович Пелевин', 'Жарко Петан', 'Жан Пети-Сан',
    'Петрарка', 'Мариам Петросян', 'Алексей Пехов', 'Пабло Пикассо',
    'Валентин Саввич Пикуль', 'Лоуренс Джонстон Питер', 'Пифагор', 'Платон',
    'Авессалом Подводный', 'Жан Поль', 'Александр Поп', 'Терри Пратчетт',
    'Мильфорд Прентис', 'Михаил Михайлович Пришвин', 'Протагор',
    'Марсель Пруст', 'Козьма Прутков', 'Публилий Сир', 'Ольга Пулатова',
    'Александр Сергеевич Пушкин', 'Маргарита Пушкина', 'Марио Пьюзо',
    'Фаина Георгиевна Раневская', 'Валентин Григорьевич Распутин',
    'Бертран Рассел', 'Этьен Рей', 'Эрих Мария Ремарк',
    'Жан Николя Артюр Рембо', 'Жозеф Эрнест Ренан', 'Жюль Ренар',
    'Анри де Ренье', 'Антуан Ривароль', 'Райнер Мария Рильке', 'Гай Ричи',
    'Уилл Роджерс', 'Василий Васильевич Розанов', 'Джон Дэвисон Рокфеллер',
    'Ромен Роллан', 'Джим Рон', 'Жан Ростан', 'Джоан Роулинг', 'Данил Рудый',
    'Теодор Рузвельт', 'Жан-Жак Руссо', 'Айн Рэнд', 'Саади', 'Франсуаза Саган',
    'Ас-Самарканди', 'Жорж Санд', 'Карлос Сантана', 'Джордж Сантаяна',
    'Анджей Сапковский', 'Жан-Поль Сартр', 'Томас Сас', 'Эльчин Сафарли',
    'Моисей Сафир', 'Карлос Руис Сафон', 'Хораций Сафрин',
    'Валентин Свенцицкий', 'Джонатан Свифт', 'Ив Сен-Лоран', 'Сенека',
    'Айртон Сенна', 'Антуан де Сент-Экзюпери', 'Мигель Сервантес де Сааведра',
    'Жильбер Сесброн', 'Диана Сеттерфилд', 'Виктор Сизов', 'Мурасаки Сикибу',
    'Кармен Сильва', 'Роберт Сильвестр', 'Григорий Сковорода',
    'Мартин Скорсезе', 'Ридли Скотт', 'Казимеж Сломиньский', 'Сэмюэл Смайлс',
    'Логан Пирсалл Смит', 'Сократ', 'Александр Исаевич Солженицын', 'Соломон',
    'Софокл', 'Бенедикт Спиноза', 'Анна-Луиза де Сталь', 'Джон Стейнбек',
    'Стендаль', 'Роберт Льюис Стивенсон', 'Том Стоппард', 'Братья Стругацкие',
    'Борис Натанович Стругацкий', 'Александр Васильевич Суворов', 'Сунь Цзы',
    'Эмиль Сьоран', 'Джером Дэвид Сэлинджер', 'Хань Сян-цзы',
    'Рабиндранат Тагор', 'Майк Тайсон', 'Майкл Талбот',
    'Шарль де Талейран-Перигор', 'Тацит Публий Корнелий', 'Марк Твен',
    'Никола Тесла', 'Петер Тилле', 'Джон Рональд Руэл Толкин', 'Экхарт Толле',
    'Лев Николаевич Толстой', 'Хантер Томпсон', 'Р. Торо', 'Генри Торо',
    'Анатолий Тосс', 'Юлиан Тувим', 'Иван Сергеевич Тургенев',
    'Владимир Леонидович Туровский', 'Михаил Туровский', 'Маргарет Тэтчер',
    'Оскар Уайльд', 'Митчел Уилсон', 'Уолт Уитмен', 'Мигель де Унамуно',
    'Нил Доналд Уолш', 'Энди Уорхол', 'Константин Дмитриевич Ушинский',
    'Герберт Уэллс', 'Мишель Уэльбек', 'Фалес Милетский',
    'Жюльен де Фалкенаре', 'Джон Роберт Фаулз', 'Людвиг Андреас Фейербах',
    'Франсуа Фенелон', 'Уилл Фергюсон', 'Генри Филдинг', 'Дэвид Финчер',
    'Иоганн Готлиб Фихте', 'Френсис Скотт Фицджеральд',
    'Валентен Эспри Флешье', 'Гюстав Флобер', 'Фэнни Флэгг', 'Фома Аквинский',
    'Денис Иванович Фонвизин', 'Бернар Фонтенель', 'Генри Форд', 'Макс Фрай',
    'Стивен Фрай', 'Макс Фрай и Линор Горалик', 'Виктор Франкл',
    'Бенджамин Франклин', 'Анатоль Франс', 'Зигмунд Фрейд', 'Жак Фреско',
    'Эрих Фромм', 'Роберт Фрост', 'Томас Фуллер', 'Френк Хаббард',
    'Кин Хаббард', 'Элберт Хаббард', 'Фридрих Август фон Хайек',
    'Роберт Хайнлайн', 'Омар Хайям', 'Олдос Хаксли', 'Даниил Хармс',
    'Джоанн Харрис', 'Оливер Хассенкамп', 'Эдгар Хау', 'Фридрих Хеббель',
    'Питер Хёг', 'Луиза Хей', 'Ричард Хелл', 'Эрнест Хемингуэй',
    'Джимми Хендрикс', 'Одри Хепбёрн', 'Наполеон Хилл', 'Альфред Хичкок',
    'Стивен Хокинг', 'Оливер Холмc', 'Филип Сеймур Хоффман', 'Хун Цзычэн',
    'Уильям Хэзлитт', 'Стефан Цвейг', 'Марина Цветаева', 'Юлий Цезарь',
    'Константин Эдуардович Циолковский', 'Марк Туллий Цицерон', 'Виктор Цой',
    'Ямамото Цунэтомо', 'Петр Ильич Чайковский', 'Карел Чапек', 'Чарли Чаплин',
    'Павезе Чезаре', 'Адриано Челентано', 'Николай Гаврилович Чернышевский',
    'Уинстон Черчилль', 'Гилберт Честертон', 'Филип Честерфилд',
    'Антон Павлович Чехов', 'Чингисхан', 'Шри Чинмой', 'Корней Чуковский',
    'Тупак Шакур', 'Николя де Шамфор', 'Коко Шанель', 'Мечислав Шарган',
    'Робин Шарма', 'Франсуа Рене де Шатобриан', 'Евгений Шварц',
    'Рихард Рихардович Шварц', 'Альберт Швейцер', 'Роберт Шекли',
    'Уильям Шекспир', 'Фридрих Шиллер', 'Артур Шницлер', 'Фредерик Шопен',
    'Артур Шопенгауэр', 'Джордж Бернард Шоу', 'Генри Шоу', 'Освальд Шпенглер',
    'Василий Макарович Шукшин', 'Михаэль Шумахер', 'Георг Эберс',
    'Мария фон Эбнер-Эшенбах', 'Ясон Эвангелу', 'Эзоп', 'Альберт Эйнштейн',
    'Экклезиаст', 'Жорж Элгози', 'Йозеф Эметс', 'Фридрих Энгельс',
    'Квинт Энний', 'Эпиктет', 'Эпикур', 'Плутарх', 'Эразм Роттердамский',
    'Эдуар Эррио', 'Мауриц Эшер', 'Карл Гюстав Юнг', 'Хенрик Ягодзиньский',
    'Ли Якокка', 'Ирвин Ялом', 'Стас Янковский', 'Туве Янссон',
    'Надея Ясминска', 'Карл Ясперс', 'Виктор Ерофеев', 'Альфред Розенберг',
    'Адольф Гитлер', 'Генрих Гиммлер', 'Ральф Эмерсон', 'Аллан Маклеод Грей',
    'Эрлэнд Лу', 'Вудру Вильсон', 'Грэхам Форд Тауэрс', 'Джон Кеннет Гэлбрейт',
    'Марк Мэнсфилд', 'Реджинальд Маккена', 'Ирвин Фишер', 'Роберт Кемпхилл',
    'Эндрю Хаус', 'Валентина Мухина-Петринская', 'Альберт Бартлед',
    'Майер Амшель Ротшильд', 'Кеннет Болдинг', 'Элеонора Рузвельт',
    'Эмили Дикинсон', 'Папюс', 'Герберт Байярд Суоп', 'Збигнев Холодюк',
    'Эмиль Куэ', 'Адольф Книгге', 'Эрнст Хайне', 'Гиппократ', 'Эллен Гилкрист',
    'Пьер Кюри', 'Михаил Ефимович Литвак', 'Владимир Тарасов',
    'Ральф Уолдо Эмерсон', 'Люк Рейнхард', 'Александр Петрович Довженко',
    'Александр Сергеевич Грибоедов', 'Алексей Андреевич Жуковский',
    'Андрей Тарковский'
]


def get_db_connection(db_file):
    con = sqlite3.connect(db_file)
    cur = con.cursor()
    query = """
        CREATE TABLE IF NOT EXISTS quotes (
            id INTEGER PRIMARY KEY,
            quote TEXT UNIQUE,
            author TEXT
        )
    """
    logging.debug(' '.join(query.split()))
    cur.execute(query)
    return con


def add_quote(db, quote, author):
    assert isinstance(db, sqlite3.Connection), "%r is not a db connection" % db
    cur = db.cursor()
    query = """
        INSERT OR IGNORE INTO quotes
            (quote, author)
        VALUES
            (?, ?)
    """
    params = (quote, author)

    log_query = query
    for value in params:
        log_query = log_query.replace(
            '?', "'" + value.replace("'", "\'") + "'", 1)
    logging.debug(' '.join(log_query.split()))

    cur.execute(query, params)


def process_file(filename, db):
    assert isinstance(db, sqlite3.Connection), "%r is not a db connection" % db
    with open(filename, 'r') as fd:
        quote = ''
        author = ''
        in_progress = False
        is_quote = False
        good = 0
        bad = 0
        for line in fd:
            if not line:
                continue

            line = line.replace('…', '...')
            line = line.replace('„', '"')
            line = line.replace('“', '"')

            if line.startswith(START_MARK):
                quote = ''
                author = ''
                in_progress = True
                is_quote = True
                continue
            elif line.startswith(COPYRIGHT_MARK):
                is_quote = False
                continue
            elif line.startswith(END_MARK):
                quote = quote.strip()
                author = author.strip()
                in_progress = False
                if not (quote and author):
                    bad += 1
                    continue
                if not any(x in author for x in AUTHOR_WHITELIST):
                    bad += 1
                    continue
                good += 1
                add_quote(db, quote, author)
                continue

            if in_progress and is_quote:
                if re.match(r'^(—|-)', line.lstrip()):
                    quote = quote.rstrip()
                    line = line.lstrip()
                    if line[0] == '-' and line[1] != '-':
                        sep = '—'
                        if line[1] != ' ':
                            sep = '— '
                        line = line.replace('-', sep, 1)
                    quote += '\n' + line
                else:
                    quote = ' '.join([quote.rstrip(), line.strip()])
            elif in_progress and not is_quote:
                author = ' '.join([author, line.strip()])
        logging.info("Processed %s quotes and %s was ignored" % (good, bad))

if __name__ == "__main__":
    def parse_args():
        parser = ArgumentParser()
        parser.add_argument(
            '-f', '--file', metavar='FILE',
            help='txt file with quotes dump', required=True)
        parser.add_argument(
            '-d', '--db', metavar='FILE',
            help='sqlite file with db', required=True)
        parser.add_argument(
            "--debug", help="turn on debug output", action='store_const',
            const='DEBUG', default='INFO', dest='log_level')
        return parser, parser.parse_args()

    parser, args = parse_args()

    logging.basicConfig(
        format='[%(asctime)s] [%(levelname)s] %(message)s',
        level=args.log_level
    )

    try:
        db = get_db_connection(args.db)
        process_file(args.file, db)
        db.commit()
        db.close()
    except KeyboardInterrupt:
        pass
После выполнения скрипта следующим образом:
$ ./dump_to_sqlite.py -f quotes_dump.txt -d quotes.db
[2016-04-17 13:10:00,373] [INFO] Processed 10170 quotes and 5462 was ignored
Получим на выходе файл quotes.db. С которым теперь можно как угодно работать локально. Например, вытащить случайную цитату и её автора можно следующей командой:
$ echo 'SELECT quote, author FROM quotes ORDER BY RANDOM() LIMIT 1;' | sqlite3 quotes.db -separator ' (c) '
Хорошо организованное время — это верный признак хорошо организованного ума. (c) Робин Шарма

$ echo 'SELECT quote, author FROM quotes ORDER BY RANDOM() LIMIT 1;' | sqlite3 quotes.db -separator ' (c) '
Кто любит наставление, тот любит знание, а кто ненавидит обличение, тот невежда. (c) Соломон

$ echo 'SELECT quote, author FROM quotes ORDER BY RANDOM() LIMIT 1;' | sqlite3 quotes.db -separator ' (c) '
Судорожная веселость гораздо грустнее, чем открыто выраженная грусть. (c) Франц Кафка
git репозиторий с скриптами и дампом: https://github.com/zen-tools/greatwords
бог создал труд и обезьяну
чтоб получился человек
а вот пингвина он не трогал
тот сразу вышел хорошо

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей