Есть модуль gzip . Использование:
Пример того, как создать сжатый файл GZIP:
import gzip
content = b"Lots of content here"
f = gzip.open('/home/joe/file.txt.gz', 'wb')
f.write(content)
f.close()
Пример того, как GZIP сжать существующий файл:
import gzip
f_in = open('/home/joe/file.txt')
f_out = gzip.open('/home/joe/file.txt.gz', 'wb')
f_out.writelines(f_in)
f_out.close()
f_in.close()
РЕДАКТИРОВАТЬ :
Ответ Джейса Браунинга с использованием with
в Python> = 2.7, очевидно, более краткий и читаемый, поэтому мой второй фрагмент будет (и должен) выглядеть так:
import gzip
with open('/home/joe/file.txt', 'rb') as f_in, gzip.open('/home/joe/file.txt.gz', 'wb') as f_out:
f_out.writelines(f_in)
Если ваша СУБД не накладывает ограничений на то, из какой таблицы вы выбираете при выполнении вставки, попробуйте:
INSERT INTO x_table(instance, user, item)
SELECT 919191, 123, 456
FROM dual
WHERE NOT EXISTS (SELECT * FROM x_table
WHERE user = 123
AND item = 456)
В данном случае dual
- это таблица с одной строкой только (изначально найден в Oracle, теперь и в mysql). Логика состоит в том, что оператор SELECT генерирует одну строку данных с необходимыми значениями, но только тогда, когда значения еще не найдены.
В качестве альтернативы, посмотрите на оператор MERGE.
Хотя перед вставкой данных хорошо проверять дублирование, я предлагаю вам установить уникальное ограничение / индекс для ваших столбцов, чтобы по ошибке нельзя было вставить повторяющиеся данные.
Insert into x_table (instance, user, item) values (919191, 123, 456)
where ((select count(*) from x_table where user=123 and item=456) = 0);
Синтаксис может отличаться в зависимости от вашей БД ...
Если вы добавите ограничение, которое (x_table.user, x_table.item) является уникальным, то вставка другой строки с тем же пользователем и элементом не удастся.
например:
mysql> create table x_table ( instance integer primary key auto_increment, user integer, item integer, unique (user, item));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into x_table (user, item) values (1,2),(3,4);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> insert into x_table (user, item) values (1,6);
Query OK, 1 row affected (0.00 sec)
mysql> insert into x_table (user, item) values (1,2);
ERROR 1062 (23000): Duplicate entry '1-2' for key 2
С UNIQUE (пользователь, элемент)
, выполните:
Insert into x_table (instance, user, item) values (919191, 123, 456)
ON DUPLICATE KEY UPDATE user=123
бит user = 123
- это "не-операция" для сопоставления синтаксис предложения ON DUPLICATE
без каких-либо действий при наличии дубликатов.