Python скрипт для сбора информации по файлам в папке

# -*- 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

Консольный калькулятор на 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» — таймер будет включаться нажатием одной кнопки на смартфоне.