# -*- coding: utf-8 -*-
'''
на входе папка или файл, на выходе CSV: имя файла;сумма мд5;папка полностью;имя компа
'''
import os
import hashlib
import platform
import time
import sys
class MyItem:
def __init__(self, f):
self.hostname = hostname
self.md5sum = md5(f)
self.size = os.path.getsize(f)
self.created = "%s" % time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(os.path.getctime(f)))
self.modified = "%s" % time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(os.path.getmtime(f)))
self.ext = os.path.splitext(f)[1]
self.full_dir, self.file_name = os.path.split(os.path.abspath(f))
def md5(fname): # https://stackoverflow.com/questions/3431825/generating-an-md5-checksum-of-a-file
hash_md5 = hashlib.md5()
with open(fname, "rb") as f:
for chunk in iter(lambda: f.read(4096), b""):
hash_md5.update(chunk)
return hash_md5.hexdigest()
hostname = platform.node()
result_header = "file_name;md5sum;size;created;modified;ext;full_path;hostname\n"
result_file = open('./result.csv','w')
result_file.write(result_header)
targets = []
if len(sys.argv) > 1:
targets = sys.argv[1::]
else:
targets.append(".")
for t in targets:
if os.path.exists(t):
if os.path.isdir(t):
for current_dir, dirs, files in os.walk(t):
for f in files:
try:
i = os.path.join(current_dir, f)
print(i)
item = MyItem(i)
result_file.write('%s;%s;%s;%s;%s;%s;%s;%s\n'%(item.file_name, item.md5sum, item.size, item.created, item.modified, item.ext, item.full_dir, item.hostname))
except:
print('Error!')
if os.path.isfile(t):
try:
i = t
print(i)
item = MyItem(i)
result_file.write('%s;%s;%s;%s;%s;%s;%s;%s\n'%(item.file_name, item.md5sum, item.size, item.created, item.modified, item.ext, item.full_dir, item.hostname))
except:
print('Error!')
result_file.close()
Архив метки: исходники
Консольный калькулятор для Windows на Python

Управление: стрелки на клавиатуре и Enter, выход из программы — Esc
Исходник calc.py:
# -*- coding: utf-8 -*-
# kmsvsr.ru 2020-06-06
import msvcrt
from decimal import *
def makeDisplayString(s):
result = " " * (20 - len(s)) + s
return result
class MyCalculator:
def __init__(self):
self.last_result = Decimal('99999999999999999999.0')
self.result = Decimal('0.0')
self.display_default='''
=====Калькулятор==========
|[ 00000000000000000000 ]|
|========================|
| |
|[ 1 ] [ 2 ] [ 3 ] [ + ]|
| |
|[ 4 ] [ 5 ] [ 6 ] [ - ]|
| |
|[ 7 ] [ 8 ] [ 9 ] [ x ]|
| |
|[ 0 ] [ . ] [ = ] [ / ]|
| |
==========================
'''
self.display = self.display_default
self.keys=("123+", "456-", "789x", "0.=/")
self.ACTION_EMPTY = 0
self.ACTION_PLUS = 1
self.ACTION_MINUS = 2
self.ACTION_MULTIPLY = 3
self.ACTION_DIVIDE = 4
self.last_action = self.ACTION_EMPTY
self.visible = 1
self.display_digits = "0" # цифры, которые видно на калькуляторе, не больше 20
self.last_display_digits = ""
self.updateDigitsOnDisplay()
# положение курсора слева сверху
self.curx=0
self.cury=0
self.needNewDigit = 0 # 1 после кнопки действия
def updateKeysOnDisplay(self):
self.display = self.display.replace('[ %s ]' % self.keys[self.cury][self.curx], '[>%s<]' % self.keys[self.cury][self.curx])
def updateDigitsOnDisplay(self):
if len(self.display_digits) > 0:
self.display = self.display.replace('00000000000000000000', makeDisplayString(self.display_digits) )
else:
self.display = self.display.replace('00000000000000000000', makeDisplayString(self.last_display_digits) )
def resetDisplay(self):
self.display = self.display_default
def show(self):
self.visible = 1
self.redraw()
def redraw(self):
self.resetDisplay()
self.updateDigitsOnDisplay()
self.updateKeysOnDisplay()
if self.visible == 1:
print(self.display)
def calc(self):
try:
new_value = Decimal('%s' % self.display_digits)
except:
new_value = Decimal('99999999999999999999.0')
if self.last_action == self.ACTION_PLUS:
self.result = self.last_result + new_value
if self.last_action == self.ACTION_MINUS:
self.result = self.last_result - new_value
if self.last_action == self.ACTION_MULTIPLY:
self.result = self.last_result * new_value
if self.last_action == self.ACTION_DIVIDE:
self.result = self.last_result / new_value
if self.last_action == self.ACTION_EMPTY:
self.result = new_value
if self.last_action != self.ACTION_EMPTY:
self.display_digits = "%s" % self.result
self.last_result = self.result
self.needNewDigit = 1
self.last_display_digits = self.display_digits
'''
H
KPM
'''
calc = MyCalculator()
calc.show()
while True:
if calc.needNewDigit == 1:
calc.display_digits = ""
calc.needNewDigit = 0
lastkey = msvcrt.getch()
#print(lastkey)
if lastkey == b'\x1b': # Esc
break
if lastkey == b'K': # left
if calc.curx > 0:
calc.curx -= 1
calc.updateKeysOnDisplay()
if lastkey == b'P': # down
if calc.cury < 3:
calc.cury += 1
calc.updateKeysOnDisplay()
if lastkey == b'M': # right
if calc.curx < 3:
calc.curx += 1
calc.updateKeysOnDisplay()
if lastkey == b'H': # up
if calc.cury > 0:
calc.cury -= 1
calc.updateKeysOnDisplay()
if lastkey == b'\r':
#Разбираемся, какая кнопка нажата на калькуляторе
selected = calc.keys[calc.cury][calc.curx]
if calc.curx < 3 and calc.cury < 3: # цифры больше 0
newd = selected # новая нажатая цифра
if calc.display_digits == "0":
calc.display_digits = newd
elif len(calc.display_digits) < 20:
calc.display_digits += newd
if calc.curx == 0 and calc.cury == 3: # 0
if calc.display_digits != "0" and len(calc.display_digits) < 20:
calc.display_digits += selected
if calc.curx == 1 and calc.cury == 3: # . (точка)
if len(calc.display_digits) < 20 and '.' not in calc.display_digits:
calc.display_digits += selected
#.needNewDigit
#.last_action
if calc.curx == 3 and calc.cury == 0: # +
calc.calc()
calc.last_action = calc.ACTION_PLUS
if calc.curx == 3 and calc.cury == 1: # -
calc.calc()
calc.last_action = calc.ACTION_MINUS
if calc.curx == 3 and calc.cury == 2: # x
calc.calc()
calc.last_action = calc.ACTION_MULTIPLY
if calc.curx == 3 and calc.cury == 3: # /
calc.calc()
calc.last_action = calc.ACTION_DIVIDE
if calc.curx == 2 and calc.cury == 3: # =
calc.calc()
calc.last_action = calc.ACTION_EMPTY
print('\n'*25)
calc.redraw()
Скачать: Скачать
https-клиент на python
Скрипт читает в переменную содержимое html-страницы:
# -*- coding: utf-8 -*- import http.client import ssl print('Program started') #выполнить http-запрос print('Sending request to site...') #https://stackoverflow.com/questions/39945702/httplib-httpsconnection-issue-certificate-verify-failed#39945733 conn = http.client.HTTPSConnection('kmsvsr.ru', timeout=5, context=ssl._create_unverified_context()) conn.request("GET", "/") resp = conn.getresponse() print(resp.status, resp.reason) print('Reading answer...') data = resp.read().decode() print (data)
Скрипт не дописан, кто будет пользоваться — не забудьте добавить сюда обработку ошибок. А так по быстрому спарсить страницу пойдёт.
Из обобенностей: здесь в примере открывается сайт не по HTTP, а по HTTPS, при чём включен игнор ошибок, то есть код можно использовать для парсинга сайтов с самоподписанными сертификатами.
mssql как узнать, сколько места занимают таблицы в базе
Не моё, нашёл где-то в инете, но проверил, код рабочий, запрос очень помог
SELECT t.NAME AS TableName, s.Name AS SchemaName, p.rows AS RowCounts, SUM(a.total_pages) * 8 AS TotalSpaceKB, SUM(a.used_pages) * 8 AS UsedSpaceKB, (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB FROM sys.tables t INNER JOIN sys.indexes i ON t.OBJECT_ID = i.object_id INNER JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id LEFT OUTER JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE t.NAME NOT LIKE 'dt%' AND t.is_ms_shipped = 0 AND i.OBJECT_ID > 255 GROUP BY t.Name, s.Name, p.Rows ORDER BY -- t.Name UsedSpaceKB desc
Кухонный таймер на Bash для Raspberry Pi
Добавил своей малинке функцию кухонного таймера. Написал короткий скрипт для воспроизведения звукового файла через назначенный пользователем интервал времени. Скрипт получился такой:
#!/bin/bash # kmstimer echo "Таймер сработает через $1 минут" for ((i=0; i<$1; i++)) do echo "Прошло $i минут" sleep 60 done echo "Время вышло!" echo "Время вышло" | festival --tts --language russian mpg123 /home/pi/usr/share/sounds/default.mp3
Если на системе установлен синтезатор речи festival, то система получеловеческим голосом объявит, что время вышло, после чего воспроизведёт указанный в скрипте музыкальный файл.
Пример использования скрипта следующий:
/bin/kmstimer 15
где 15 — время в минутах.
Получившимся скриптом удобно пользоваться с android-смартфона, например через программу Raspi SSH. Добавляем новые кнопки с названием вроде «Таймер 15 минут (гречка)» и соответственно кодом «kmstimer 15» — таймер будет включаться нажатием одной кнопки на смартфоне.