Архив рубрики: Python

Python и SQLite – скрипт для работы с базой данных

Для работы с базой данных мы используем скрипт-обработчик. Если вы решите сменить базу данных на PostgreSQL или другую, то нет необходимости переписывать все скрипты в проекте. Достаточно изменить только скрипт-обработчик.

И главное, это красиво ) Сравните:

import sqlite3
    
    
with sqlite3.connect('db.sqlite3') as conn:
    cur = conn.cursor()
    cur.execute("""
        SELECT title, price, sku 
        FROM products
        WHERE sku = (?)
    """, (sku, ))
    rows = cur.fetchall()
    for item in rows:
        row = {
            "title": item[0],
            "price": item[1],
            "sku": item[2]
        }
        print(row)
import db


rows = db.fetchall(
    database='db.sqlite3',
    table='products',
    columns=["title", "price", "sku"],
    where=f"WHERE sku = '{sku}'"
)
for row in rows:
    print(row)

 

Python — как читать большие XML файлы при ограничении оперативной памяти

Рассмотрим на конкретном примере, как обработать большой каталог книг в формате XML размером 3 Гб.

Задача: скачать каталог по ссылке https://www.litres.ru/static/ds/detailed_data.xml.gz и узнать количество книг в каталоге.

Пример структуры полного каталога книг Литрес в формате XML
Пример структуры полного каталога книг Литрес в формате XML

Читать

Python — переводчик Google, Bing и etc.

Для автоматизации работы с taobao я столкнулся с необходимостью перевода с китайского на русский. С этим отлично справилась библиотека translators. Читать

Python — как подключиться к базе данных MySQL на хостинге

Для работы с MySQL в Python используется библиотека pymysql. Но чтобы подключиться с локальной машины к базе данных, которая расположена на сервере, используем библиотеку sshtunnel.

По сути – мы сначала подключаемся к хостингу через защищённое соединение, а уже через это соединение подключаемся к базе данных.

Перед подключением убедитесь, что на хостинге разрешен доступ по SSH. Читать

Замена значений отметок по осям в matplotlib

Допустим, подписи к отметкам на горизонтальной оси у графика выглядят так:

А хочется заменить «4000» на «четыретыщи»:

Для этого перед сохранением файла и перед plt.show() пишем код:

from matplotlib.ticker import FuncFormatterdef my_formatter(x, pos): return str(‘%.0f’ % x).replace(‘4000′, u’четыретыщи’)ax.xaxis.set_major_formatter(FuncFormatter(my_formatter))

Вторая строка определяет функцию my_formatter(x, pos), зависящую от двух переменных: x — значение подписи к отметки, pos — позиция подписи (наверное).

Третья строка описывает, что должна выполнять данная функция, а именно она должна возвращать str(‘%.0f’ % x).replace(‘-‘, u’–’). В моём случае нужно взять ‘%.0f’ % x, т.е. целую часть (чтобы получить 3 цифры после запятой, смените 0 на 3. Однако будьте внимательны, надписи могут заезжать друг на друга, поэтому контролируйте количество цифр после запятой при построении графика). Чтобы можно было делать замену, нужно ещё обратить ‘%.0f’ % x в строку: str(‘%.0f’ % x). В скобках после replace идёт через запятую, что и на что нужно заменить. А заменить мы хотим минус (справа от нуля на клавиатуре) на, например, N-тире (про N-тире, M-тире и дефис см. тут). Можете просто скопировать отсюда: — (дефис), – (N-тире), — (M-тире). Обратите внимание на букву u перед ‘–’, она означает, что надо использовать юникод. Без неё не сработает вставка таких спецсимволов.

Четвёртая строка применяет нашу функцию к горизонтальной оси. Для воздействия на вертикальную ось замените xaxis на yaxis.

Также возможен вариант return str(‘%.0f’ % x).replace(‘-‘, ‘$-$’). То, что внутри долларов, будет обработано LaTeX’ом. Значит, можно там вставить ‘$endash$’, ‘$emdash$’ и т.д. Но тогда по plt.show() при наведении курсора на отрицательную координату будет показано, например, x=$endash$4000, хотя на сохранённом графике всё будет в порядке.

Возможно, чтобы Латех заработал, в начало программы придётся добавить строки:

import matplotlib as mplmpl.rcParams[‘text.usetex’]=Truempl.rcParams[‘text.latex.unicode’]=True
но у меня работает и без них.

Если что-то не заработало, пожалуйста, сообщите, попробуем разобраться.

Транслитерация имён файлов с Python

У меня есть похожая запись о транслитерации содержимого файла. Здесь же будут транслитерированы только имена файлов.

Если активно пользуешься терминалом, часто возникает желание убрать пробелы из имён файлов и иногда даже кириллицу.

Итак, перед нами стоит задача группового переименования файлов. Например, нужно поменять имена всех файлов в директории. Хотим избавиться от пробелов — заменить их на нижние подчёркивания. Все кириллические буквы хотим поменять на латинские (на «транслит»).

Вот скрипт, написанный на питоне, который совершает такое массовое переименование файлов. Надо создать файл renamer.py с приведённым ниже содержанием, положить его в папку с переименовываемыми файлами и выполнить:

user $python3 renamer.py -p

И в выводе программы будет показано, как будут переименованы файлы, но изменений не произойдёт. Если Вы окажетесь довольны результатами, сделайте на всякий случай резервную копию директории и выполните python3 renamer.py. За ключик -p спасибо комментарию от hombit’a.

Файл Русский Текст.TXT переименуется в russkiy_tekst.txt. Поведение скрипта благодаря его простоте очень легко подстроить под свои нужды, даже совсем не разбираясь в питоне. В строках с 13 по 82 в левом столбце в кавычках стоит то, что подлежит замене; в правом столбце — то, на что нужно заменять. Добавляйте свои замены и корректируйте существующие по своему усмотрению.

renamer.py

Скачать

#! /usr/bin/env python#coding=utf8import osfrom sys import argvdef latinizator(letter, dic): for i, j in dic.items(): letter = letter.replace(i, j) return letterlegend = {‘ ‘:’_’,’,’:»,’а’:’a’,’б’:’b’,’в’:’v’,’г’:’g’,’д’:’d’,’е’:’e’,’ё’:’yo’,’ж’:’zh’,’з’:’z’,’и’:’i’,’й’:’y’,’к’:’k’,’л’:’l’,’м’:’m’,’н’:’n’,’о’:’o’,’п’:’p’,’р’:’r’,’с’:’s’,’т’:’t’,’у’:’u’,’ф’:’f’,’х’:’h’,’ц’:’c’,’ч’:’ch’,’ш’:’sh’,’щ’:’shch’,’ъ’:’y’,’ы’:’y’,’ь’:»‘»,’э’:’e’,’ю’:’yu’,’я’:’ya’,’А’:’A’,’Б’:’B’,’В’:’V’,’Г’:’G’,’Д’:’D’,’Е’:’E’,’Ё’:’Yo’,’Ж’:’Zh’,’З’:’Z’,’И’:’I’,’Й’:’Y’,’К’:’K’,’Л’:’L’,’М’:’M’,’Н’:’N’,’О’:’O’,’П’:’P’,’Р’:’R’,’С’:’S’,’Т’:’T’,’У’:’U’,’Ф’:’F’,’Х’:’H’,’Ц’:’Ts’,’Ч’:’Ch’,’Ш’:’Sh’,’Щ’:’Shch’,’Ъ’:’Y’,’Ы’:’Y’,’Ь’:»‘»,’Э’:’E’,’Ю’:’Yu’,’Я’:’Ya’,}for file_old in os.listdir(‘.’): file_new = latinizator(file_old, legend)

#Раскомментируйте, чтобы сделать первую букву в имени файла Прописной

#file_new = file_new.capitalize() if ‘-p’ in argv: if file_old == file_new: print (‘{0: <30}’.format(file_old), ‘не будет переименован’ ) else: print (‘{0: <30}’.format(file_old), ‘будет переименован в ‘, file_new ) else: if file_old != file_new: print (‘{0: <30}’.format(file_old), ‘переименован в ‘, file_new ) os.rename(file_old, file_new)

P.S. Функцию для замены ключа словаря на его значение подсмотрел тут.