Uživatelské nástroje

Nástroje pro tento web


navody:python_modules

Vestavěné moduly Pythonu 3

argparse

nargs

  • N - počet
  • ? - $0-1$
  • + - $1-\infty$
  • * - $0-\infty$
  • argparse.REMAINDER - všechny argumenty jako seznam

příklady

parsování argumntů

import argparse
 
def parse_args():
    parser = argparse.ArgumentParser(description='description')
    parser.add_argument('-s', '--something', metavar='SOM',
                        type=str, help='help message', required=True,  dest="something")
    parser.add_argument('-ch', '--choice', metavar='CHOICE', choices=["first", "second"],
                        type=str, help='help message', default="first",  dest="something")
    parser.add_argument('-b', '--bool_arg', action='store_true', help='help message', dest="bool_arg")
    parser.add_argument('positions_arg', metavar='P', type=str, nargs='+', help='help message')
 
    return parser.parse_args()

base64

kodování/dekodování base64

import base64
encoded = base64.b64encode(b"text")
decoded = base64.b64decode(encoded)

bisect

najde pozici pro vložení prvku do seřazeného seznamu půlením intervalů

from bisect import bisect_left
pozice = bisect_left([1,2,8,15], 3)

calendar

vrátí název prvního měsíce a zkratku středy (pokud se nastaví locale, tak třeba i česky)

import calendar
 
calendar.month_name[1]
calendar.day_abbr[2]

iteruje přes všechny dny měsíce (iteruje i přes dny předchozího a následujícího měsíce, pokud zasahují do prvního nebo posledního týdne)

from calendar import Calendar
 
cal = Calendar()
for month_date in cal.itermonthdates(year, month):
    print(month_date)

csv

Iteruje přes položky csv souboru. K položkám se přistupuje přes klíč, který se vezme z prvního řádku.

import csv
 
with open("soubor.csv") as csvfile:
    csv_reader = csv.DictReader(csvfile, delimiter=";", quotechar='"')
    for row in csv_reader:
        yield row

collections

pojmenovaná ntice

from collections import namedtuple
 
Point = namedtuple("Point", ("x", "y"))
p = Point(x=10, y=11)
print(p.x, p.y)

colorsys

převede barvu vyjádřenou jako HSV do RGB

from colorsys import hsv_to_rgb
 
(red, green, blue) = hsv_to_rgb(0.8, 0.5, 0.3)

datetime

from datetime import datetime, timedelta
 
now = datetime.now()
now -= timedelta(hours=6)
date = now.strftime("%y%m%d")
hour = now.hour

parsuje datum v různých formátech

from datetime import datetime
 
datetime.strptime("2013-11-1", "%Y-%m-%d")
datetime.strptime("2016-05-26 20:56:35", "%Y-%m-%d %H:%M:%S")

enum

from enum import Enum
class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

glob

soubory v UNIX stylu - vrátí seznam bmp souborů z adresáře database

from glob import glob
 
files = glob("database/*.bmp")

hashlib

vrátí hexadecimální vyjádření hashe z textu

from hashlib import sha256
 
sha256(b"text").hexdigest()

heapq

spojí dva seřazené seznamy

from heapq import merge
 
merge([1,5,12], [3,4,18,19])

itertools

z více iterátorů udělá jeden, který iteruje přes všechny prvky

import itertools
ab = itertools.chain(['a', 'b'], ['c'], ['d', 'e'])
list(ab)

json

načte data ze souboru soubor.json

import json
 
with open("soubor.json") as f:
    data = json.load(f)

locale

nastaví českou lokalizaci všeho

import locale
 
locale.setlocale(locale.LC_ALL, ("cs_CZ"))

logging

základní logování

import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
 
logger.info("Nějaka zpráva.")

logování do souboru

import logging
logging.basicConfig(filename="file.log", level=logging.DEBUG)

os

  • os.linesep - řetězec nového řádku podle OS
  • os.stat(<soubor>) - informace o souboru (práva, datum vytvoření, velikost, …)
  • os.unlink(<soubor>) - smaže soubor

os.path

nahradí ~ za správný domácí adresář na Linuxu i ve Windows

os.path.expanduser("~/<zbytek cesty>")

vrátí pouze jméno souboru

os.path.basename("<cesta/k/souboru>")

vrátí absolutní cestu

os.path.abspath("<cesta/k/souboru>")

časy souboru

import os
from datetime import datetime
# datum poslední změny souboru
print(datetime.fromtimestamp(os.path.getctime(<sobor>)))
# datum poslední změny obsahu souboru
print(datetime.fromtimestamp(os.path.getmtime(<sobor>)))
# datum posledního přístupu k souboru
print(datetime.fromtimestamp(os.path.getatime(<sobor>)))

rozdělí název souboru na příponu a zbytek

import os
fileName, fileExtension = os.path.splitext('/path/to/somefile.ext')

pathlib

rodičovský adresář

from pathlib import Path
parent = Path("path/to/file").parent

vytvoří rekurzivně všechny adresáře, pokud neexistují

from pathlib import Path
Path("/my/directory").mkdir(parents=True, exist_ok=True)

spojí cestu

from pathlib import Path
Path("/my/directory").joinpath("file.txt")

rekurzivně najde ve všech podadresářích včetně aktuálního soubory s příponou py

from pathlib import Path
files = Path('.').glob('**/*.py')

random

seed() inicializuje generátor podle času

náhodně vybere položku

from random import choice
choice(("a", "b", "c"))

náhodně vybere cele číslo z rozsahu 0-9

from random import randrange
randrange(10)

náhodně spřehází položky v seznamu

from random import shuffle
my_list = list(range(1,11))
shuffle(my_list)

re

  • *?, +? - nehladové vyhledávání
  • \s - bílý znak
  • \S - nebílý znak

použití regulárního výrazu s jeho předkompilováním (dá se využít k optimalizaci)

from re import compile
 
RE_BOOKMARK = compile("(.+/)(\d+)(.*)")
match = RE_BOOKMARK.match("Spojité/60,Black,notBold,notItalic,open,TopLeftZoom,48,77,0.0")
page = int(match.group(2))

shlex

rozdělí řetězec podle mezer, ale bere ohled na závorky jak v terminále

import shlex
shlex.split('1 2 "3 4"')
# vysledek je ['1', '2', '3 4']

shutil

Přesune adresář rekurzivně i s obsahem.

import shutil
shutil.move("/cesta/k/zdroji", "/cesta/k/cily")

socket

vytvoří TCP spojení k serveru localhost na port 8000 a pošle mu zprávu

import socket
 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)
server_address = ('localhost', 8000)
sock.connect(server_address)
message = b"nejaka zprava"
sock.sendall(message)
sock.close()

sqlite3

from sqlite3 import connect
 
connection = connect(<cesta k souboru>)
cursor = connection.cursor()
cursor.execute("""CREATE TABLE "tabulka" (
                  "id" INTEGER PRIMARY KEY,
                  "sloupec1" TEXT,
                  "sloupec2" BLOB)""")
text = "text"
data = b"data"   
cursor.execute("insert into tabulka(sloupec1, sloupec2) values(?, ?)", (text, data))
print(cursor.lastrowid)
connection.commit()
cursor.execute("select id, sloupec1, sloupec2 from tabulka")
for (id, sloupec1, sloupec2) in cursor:
    print(id, sloupec1, sloupec2)
connection.close()

subprocess

spustí gnuplot a na stdin přesměruje řetězec

from subprocess import Popen, PIPE
 
p = Popen(("gnuplot",), stdin=PIPE)
p.communicate(GNUPLOT_SCRIPT.encode())

spustí program s parametry a jeho výstup uloží do proměnné dump

from subprocess import check_output
 
dump = check_output(("pdftk", "<soubor pdf>", "dump_data_utf8")).decode()

spustí program a návrátovou hodnotu programu uloží do proměnné status

from subprocess import call
 
args = ["pdftk"] + files + ["cat", "output"] + [output]
status = call(args)

uloží výstup programu ls do souboru test.txt

with open("test.txt", "w") as f_output:
    call(["ls", "-l"], stdout=f_output)

sys

vytiskne verzi pythonu

import sys
print(sys.version)

nastaví základní cestu do vnořeného adresáře lib

import os, sys
base_dir = sys.path[0]
sys.path[0] = os.path.join(base_dir, "lib")

tempfile

vytvoří dočasný soubor, uloží do něj text něco s ním provede a pak ho smaže

from tempfile import NamedTemporaryFile
from subprocess import call
from os import unlink
 
f = NamedTemporaryFile(mode="w", delete=False, prefix='moje', suffix=".txt")
f.write(bookmarks)
f.close()
call(("jpdfbookmarks_cli", file, "--apply", f.name, "--out", file, "--force"))
unlink(f.name)

unittest

import unittest
from lib import is_leap_year
 
class TestLeapYear(unittest.TestCase):
    VALUES = {1999: self.assertFalse,
              2000: self.assertTrue,
              2004: self.assertTrue}
 
    def setUp(self):
        # nastavení před testem
 
    def test_is_leap_year(self):
        for year in self.VALUES:
            VALUES[year](is_leap_year(year))
 
    @unittest.skip("preskoci test")
    def test_skip(self):
        self.fail("kdyby se sem dostal, tak by selhal")
 
    def tearDown(self):
        # nastavení po testu

mock

starou metodu nahradí novou, která vrací text „Ahoj“

from unittest.mock import MagicMock
 
class Pozdrav:
    def zdrav(self):
        return "Dobry den"
 
p=Pozdrav()
print(p.zdrav())
p.zdrav = MagicMock(return_value="Ahoj")
print(p.zdrav())

urllib

parse

převádí non ASCII znaky do ASCII pro url

import urllib
url="https://cs.wikipedia.org/wiki/P%C5%99esmy%C4%8Dka"
print(urllib.parse.quote(urllib.parse.unquote(url)))

parsování url

from urllib.parse import urlparse
print(urlparse("http://vojta.kalcik.cz/doku.php?id=navody:python_modules#parse"))
# ParseResult(scheme='http', netloc='vojta.kalcik.cz', path='/doku.php', params='', query='id=navody:python_modules', fragment='parse')

request

vytiskne kód stránky

from urllib.request import urlopen, HTTPError
from sys import stderr
 
url = "http://www.neco.cz/index.html"
try:
    req = urlopen(url)
    print(req.read())
except HTTPError:
    print("Stránka neexistuje!", file=stderr)
navody/python_modules.txt · Poslední úprava: 2020/12/14 10:00 autor: jules