консоль python в роли командной строки часть 2

заглянуть

Модули



Шоу Энтони «Внутри CPython» 2023

узнать конфигурацию сборки python
python3 -m sysconfig

документация по модулям
pydoc -p 8080
http://localhost:8080/

импорт из github.com
https://github.com/nvbn/import_from_github_com
pip install import_from_github_com

чтобы загрузить модуль нужно его импортировать: import модуль, например
import os
удалить модуль (или переменную)
del os

узнать все модули:
pydoc3 -b
pydoc -b

или вбить в консоли python
help('modules')
pip freeze

узнать что входит в модуль:
import sys
sys. # нажать на Tab

узнать где расположен файл с модулем
import модуль
print(модуль.__file__)

Встроенные функции Python содержатся в модуле __builtin__(импортировать его для использования функций не нужно):
dir(__builtins__)
__builtins__. # нажать на Tab

В возвращаемом функцией dir() списке не содержится встроенных функций и переменных. Если вы хотите получить их список, то они определены в стандартном модуле builtins
builtins - встроенные модули, у которых отсутствует имя файла
>>> import builtins
>>> dir(builtins)
>>> import pprint, sys
>>> pprint.pprint(sys.modules)
>>> pprint.pprint(sys.path)

sys.path представляет собой список файловых путей, в которых лежат модули
интерпретарор ищет модули вначале в текущем каталоге, а затем в каталогах, указанных в переменной окружения PYTHONPATH

Получаем список переменных внутри функции
>>> print(locals())
>>> print(globals())
Функция locals() возвращает словарь переменных из текущего пространства имён Ключи словаря — названия переменных, а значения — это их значения.
С помощью похожей функции globals() можно получить все переменные конкретного модуля в таком же виде


пути загрузки модулей
import sys
print(sys.path)

автоматический путь к каталогу с модулями
import sys
sys.path.append(f"/usr/lib/python{sys.version_info.major}.{sys.version_info.minor}/mprdaemon")

import platform
print(f'/usr/lib/python{platform.python_version()[:3]}/distutils') # каталог distutils дан для примера
sys.path.append(f'/usr/lib/python{platform.python_version()[:3]}/distutils')

Откуда грузятся модули?
__import__
sys.modules
sys.path
.pth файлы
sys.meta_path
sys.path_hooks
sys.path_import_cache
http://pep8.ru/doc/tutorial-3.1/6.html
http://asvetlov.blogspot.ru/2010/05/2.html

Решение проблем с модулями и пакетами Python

impotr time
time.ctime(time.time()) # показать текущее время с датой
time.asctime()

import os
os.system('команда') # запустит команду, напр. os.system('mc')
os.getcwd() # узнать местонахождение
os.chdir('/home') # переместится в /home
os.listdir('/usr/src') # узнать что находится в /usr/src
print os.path.isfile('fname') # проверить, существует ли файл
os.stat('/home/user/2') # узнать сведения о файле или каталоге /home/user/2
os.path.getsize('/home/user/path/hello.txt') # узнать размер файла
list(os.popen('du -sh /home/user/path')) # узнать размер каталога path
os.mkdir('/home/user/path') # создать каталог /home/user/path
os.makedirs('/home/user/path/1/1/1/1') # Создать каталог и промежуточные каталоги
os.rmdir('/home/user/path') # удалить каталог /home/user/path
os.removedirs('/home/user/path/1/1/1/1') # автоматически удалит все пустые родительские каталоги (~/1/1/1)
os.remove('/home/user/path/hello.txt') # удалит файл hello.txt
os.rename('/home/user/path', '/home/user/tmp/path') # переименует (или перенесёт в существующий каталог) каатог или файл
os.symlink('/home/user/path', '/home/user/22') # создаст символическую ссылку с именем 22
os.system('id') # узнать свой id
os.chown('/home/user/path', uid, gid ) # сменить владельца -uid, группу - gid
uid root - 0, gid root - 0
os.chmod('/home/user/path' 0o100644) # дать права (в восьмеричной системе)

oct(число) # число в восьмеричной системе
hex(число) # в шестнадцатеричной
bin(число) # в двоичной
int(0o1000) # 512 в десятеричной
int(0b1000) # 8
int(0x1000) # 4096

import shutil
shutil.copyfile('/home/user/path/hello.txt', '/home/user/tmp/hel.txt') # cкопирует файл с именем hel.txt, метаданные (права и тд) не копирует
shutil.copy('/home/user/path/hello.txt', '/home/user/tmp/hel.txt') # cкопирует файл с именем hel.txt, копирует метаданные
shutil.copy2('/home/user/path/hello.txt', '/home/user/tmp/hel.txt') # cкопирует файл с именем hel.txt, полное копирование метаданных
shutil.move('/home/user/path', '/home/user/tmp/tmp/tmp') # переместить/переименовать каталог/файл если промежуточных каталогов нет, то создаст оные
shutil.move('/home/user/path/hello.txt', '/home/user/tmp') # перенесёт с тем же именем в каталог tmp
shutil.copytree('/home/user/path', '/home/user/tmp/new') # скопирует каталог path со всем содержимым (дерево каталогов) в tmp с именем new
shutil.rmtree('/home/user/tmp/new') # удалит каталог new со всем содержимым


Управление модулями, pip



wget https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py

$ pip help # помощь по доступным командам.
$ pip install package_name # установка пакета(ов).
$ pip uninstall package_name # удаление пакета(ов).
$ pip-autoremove package_name # удаление пакета(ов), с установленными зависимостями
$ pip install -U # обновление пакета(ов).
$ pip install --force-reinstall # при обновлении, переустановить пакет, даже если он последней версии.
$ pip list # Смотрим на список установленных (доступных) библиотек
$ pip list -o # узнать, какие библиотеки можно обновить
$ pip show package_name # узнать версию, местонахождение на диске и зависимости.
$ pip search pycp # покажет список всех пакетов, в названии которых есть pycp
$ pip --proxy user:passwd@proxy.server:port # использование с прокси.
$ pip completion --bash >> ~/.bashrc # Автодополнение
http://asvetlov.blogspot.ru/2014/05/pip.html

Как обновить существующие пакеты? (пользоваться осторожно, лучше в virtualenv или pyenv )

$ pip install pip-review
$ pip-review --local --interactive
или
$ pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U
$ for i in $(pip list -o | awk 'NR > 2 {print $1}'); do sudo pip install -U $i; done
$ sudo pip install -U $(pip freeze | awk '{split($0, a, "=="); print a[1]}')
$ sudo pip install -U $(pip freeze | cut -d '=' -f 1)

http://python.cx/blog/article/3
http://xgu.ru/wiki/Работа_с_модулями_в_Python

Удаление ненужных пакетов

$ pip install pip-autoremove
$ pip install Flask Sphinx
$ pip-autoremove Flask Sphinx -y
http://python.cx/blog/article/PyPi_pip_python


Проверка наличия



Проверка существования переменной в локальной видимости
if 'myVar' in locals():
# myVar exists

Проверка существования переменной в глобальной видимости
if 'myVar' in globals():
# myVar exists

Проверка существования переменной используя исключения
try:
myVar
except NameError:
myVar = None

Проверка существования ключа в словаре способ 1
if key in dictname:
# key exists in dictname

Проверка существования ключа в словаре способ 2
try:
dictname['key']
except KeyError:
dictname['key'] = None

Проверка существования индекса в списке
try:
dictname['1']
except IndexError:
dictname['1'] = None

Проверка наличия метода, свойства в объекте
if hasattr(obj, 'attr_name'):
# obj.attr_name exists


Оболочки, библиотеки



https://ipython.org/
http://xon.sh/
https://amoffat.github.io/sh/
https://github.com/selectel/pyte
https://github.com/eliangcs/http-prompt
http://bpython-interpreter.org/
https://github.com/jonathanslenders/ptpython
https://github.com/jonathanslenders/pymux/
https://github.com/jonathanslenders/python-prompt-toolkit


Исходный код



Посмотреть код функции:
>>> import inspect
>>> import abc
>>> print(inspect.getsourcefile(abc))
/usr/lib/python3.4/abc.py
>>> print(inspect.getsource(abc))
# Copyright 2007 Google, Inc. All Rights Reserved.
# Licensed to PSF under a Contributor Agreement.

"""Abstract Base Classes (ABCs) according to PEP 3119."""

from _weakrefset import WeakSet
.................
>>> print(inspect.getmodule(abc))
<module 'abc' from '/usr/lib/python3.4/abc.py'>
при попытке посмотреть код созданной в интерпретаторе функции выдаст ошибку:
 
>>> def object():
...     print("hello")
... 
>>> print(inspect.getsource(object))
..................
OSError: could not get source code

но это возможно в IPython:

In [1]: def object():
   ...:     print("hello")
   ...:     

In [2]: import inspect

In [3]: print(inspect.getsource(object))
def object():
    print("hello")

или с помощью сторонних модулей:
нужно установить dill
sudo apt install python3-dill
или
sudo pip3 install dill

>>> def object():
...     print("hello")
... 
>>> import dill
>>> print(dill.source.getsource(object))
def object():
    print("hello")

>>> import dis
>>> dis.dis(object)
  2           0 LOAD_GLOBAL              0 (print)
              3 LOAD_CONST               1 ('hello')
              6 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
              9 POP_TOP
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE
>>> 


Операции с числами



round(632.742774, 3) # округлит до 632.743 (3 - сколько знаков после запятой)

a=[1, 2, 3, 4]
for x in a: print(x + 3, end = ',')
list(map((lambda x: x + 3), a))

from math import *
D={'S':sin, 'C':cos, 'E':exp}
D['S'](pi/2)
D['C'](pi)
D['E'](1)

http://ru_python.livejournal.com/337028.html
>>> from decimal import Decimal
>>> Decimal('0.1')+Decimal('0.1')+Decimal('0.1')-Decimal('0.3')
Decimal('0.0')
>>> from fractions import Fraction
>>> Fraction(1,10)+Fraction(1,10)+Fraction(1,10)-Fraction(3,10)
Fraction(0, 1)

from fractions import Fraction as fr
>>> fr('1/3') + fr('1/3') + fr('1/3')
Fraction(1, 1)
>>> fr('9/7') - fr('20/21')
Fraction(1, 3)
>>>
>>> from sympy import *
>>> x = Symbol('x')
>>> y = Symbol('y')
>>> x + x + y*3 -y
2*x + 2*y
>>> expand((x+1)*(y-1)**3)
x*y**3 - 3*x*y**2 + 3*x*y - x + y**3 - 3*y**2 + 3*y - 1
>>> expand(cos(x+y), trig=True)
-sin(x)*sin(y) + cos(x)*cos(y)
>>> simplify((x+x*x*y)/x)
x*y + 1
>>> solve(x**2 - y, x)
[-sqrt(y), sqrt(y)]
>>> solve(exp(x)+1, x)
[I*pi]

особенности двоичной математики
>>> 0.1+0.1+0.1-0.3
5.551115123125783e-17
>>> 0.7-0.5-0.2
-5.551115123125783e-17
>>> (0.1+0.1+0.1-0.3)-(0.7-0.5-0.2)
1.1102230246251565e-16
>>> (0.7-0.5-0.2)-(0.1+0.1+0.1-0.3)
-1.1102230246251565e-16

зато тут магия куда то делась
>>> (0.1+0.1+0.1-0.3)+(0.7-0.5-0.2)
0.0

>>> 0.1 + 0.1 + 0.1 - 0.3 == 1.0 / (2**54)
True
>>> 0.7-0.5-0.2 == -1.0 / (2**54)
True
>>> 5.551115123125783e-17 == 1.0 / (2**54)
True
>>> 0.1 + 0.1 + 0.1 - 0.3 == math.pow(2, -54)
True


Работа с файлами



open('/home/user/path/hello.txt', 'w') # создаст пустой файл (аналог touch hello.txt)

f=open('/home/user/path/hello.txt', 'w') # создать или открыть существующий файл hello.txt на запись
'r' открытие на чтение (является значением по умолчанию).
'w' открытие на запись, содержимое файла удаляется, если файла не существует, создается новый.
'x' открытие на запись, если файла не существует, иначе исключение.
'a' открытие на дозапись, информация добавляется в конец файла.
'b' открытие в двоичном режиме.
't' открытие в текстовом режиме (является значением по умолчанию).
'+' открытие на чтение и запись
'r+' означает, что файл доступен как для чтения, так и  для записи,
при этом содержимое существующих файлов сохраняется
'w+', позволяет выполнять операции чтения и записи, но создает файл заново,
уничтожая прежнее его содержимое

f.write('Привет, всё норм.')
f.close()# закрыть файл

f=open('/home/user/path/hello.txt', 'r') # открыть файл на чтение

f.read(8) # читает 8 символов
f.readline() # читает построчно
f.__next__()
next(f)
f.readlines() # читает файл целиком
f.readlines(200) # читает 200 символов
f.seek(0) # перейти в начало файла # цифры - позиция
f.close()

f=open('/home/user/path/hello.txt', 'a') # открыть файл на дозапись
ABC='очень,очень,многобукав' # создание переменной ABC

f.writelines('ABC') # допишет в файл буквы ABC
f.writelines(ABC) # допишет в файл очень,очень,многобукав

for line in output.splitlines(): print(line) # разбить текст на отдельные строки

file.writelines(['Hello file world!\n', 'Bye file world.\n']) # записывает все строки из списка

list(map(str.rstrip, open('/home/user/path/hello.txt').readlines(200))) # прочтёт 200 символов, без /n перевода строки

list(map(str.splitlines, open('/home/user/path/hello.txt').readlines(200)))

open('somefile.txt', 'w').write("G'day Bruce\n") # записать во временный файл
open('somefile.txt', 'r').read() # прочитать временный файл

После окончания работы с файлом его обязательно нужно закрыть с помощью метода close:
file.close()
with open(filename) as myfile # с применением менеджера контекста (гарантировано закрыть файл после использования)

пример передачи данных с текстового файла в переменную
cat /path/to/file
NAME="file1"
VERSION=1.1.1

def get_version():
    with open('/path/to/file','r') as myfile:
        content = myfile.read()
        values = content.split("\n")
        get_version_file = str(content.split("\n")[content.count('VERSION')]).split('=')[-1]
    return get_version_file

#file_src = get_version()
file_src = '"{0}"'.format(str(get_version())) # чтоб в кавычках было
print("version = ", file_src )

поиск файлов

import glob
glob.glob('/usr/src/*.deb') # покажет список deb пакетов в /usr/src, поиск файлов по маске
os.system('grep -r /usr/lib/python3 -e __all__ ')

сравнение файлов

import filecmp
filecmp('/home/user/path/hello.txt', '/home/user/tmp/hello.txt') # сравнение файлов True - совпадают, False - нет

сравнение каталогов

filecmp.dircmp('/home/user/path', '/home/user/tmp').report() # сравнение каталогов
diff_files - сообщает о разнице меж одноимёнными файлами
same_files - сообщает о идентичных файлах в двух каталогах
common - выводит список общих имён и каталогов
report() - подробный отчёт о сравнении каталогов
report_full_closure() - подробный отчёт сравнения всех каталогов, вложенных файлов и каталогов

http://iakovlev.org/index.html?p=577&m=1&l1=2

Сортируем файлы с помощью Python
https://github.com/lesskop/file-sorter


Работа с БД



C:\...\PP4E\Dbase> python
>>> import dbm                  # получить интерфейс: bsddb, gnu, ndbm, dumb
>>> file = dbm.open('movie', 'c') # создать файл DBM с именем 'movie'
>>> file['Batman'] = 'Pow!'        # сохранить строку с ключом 'Batman'
>>> file.keys()                    # получить список ключей в файле
[b'Batman']
>>> file['Batman']                 # извлечь значение по ключу 'Batman'
b'Pow!'
>>> who = ['Robin', 'Cat-woman', 'Joker']
>>> what = ['Bang!', 'Splat!', 'Wham!']
>>> for i in range(len(who)):
...     file[who[i]] = what[i]     # добавить еще 3 "записи"
...
>>> file.keys()
[b'Cat-woman', b'Batman', b'Joker', b'Robin']
>>> len(file), 'Robin' in file, file['Joker']
(4, True, b'Wham!')
>>> for key in file.keys(): print(key, file[key])
>>> for key in file: print(key.decode(), file[key].decode())
>>> file['Batman'] = 'Ka-Boom!' # изменить значение ключа Batman
>>> del file['Robin']            # удалить запись Robin
>>> file.close()                   # иногда требуется закрывать явно


упаковка объектов

pickle
>>> table = {'a': [1, 2, 3],
             'b': ['spam', 'eggs'],
             'c': {'name':'bob'}}
>>>
>>> import pickle
>>> mydb = open('dbase', 'wb')
>>> pickle.dump(table, mydb)

C:\...\PP4E\Dbase> python
>>> import pickle
>>> mydb = open('dbase', 'rb')
>>> table = pickle.load(mydb)
>>> table
{'a': [1, 2, 3], 'c': {'name': 'bob'}, 'b': ['spam', 'eggs']}


shelve
import shelve
dbase = shelve.open("mydbase")
dbase['key'] = object # сохранить объект
value = dbase['key'] # извлечь объект
len(dbase) # количество хранящихся элементов
dbase.keys() # список ключей хранящихся элементов


JSON
http://python-lab.ru/documentation/27/stdlib/json.html
https://pythonworld.ru/moduli/modul-json.html
Кодирование JSON
>>> import json
>>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
'["foo", {"bar": ["baz", null, 1.0, 2]}]'

>>> import json
>>> json.dumps([1,2,3,{'4': 5, '6': 7}], separators=(',',':'))
'[1,2,3,{"4":5,"6":7}]'

Красивый вывод:
>>> import json
>>> print json.dumps({'4': 5, '6': 7}, sort_keys=True,
...                  indent=4, separators=(',', ': '))
{
    "4": 5,
    "6": 7
}

Декодироние JSON

>>> import json
>>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')
[u'foo', {u'bar': [u'baz', None, 1.0, 2]}]

Использование json.tool из шелла для проверки и красивого вывода:
$ echo '{"json":"obj"}' | python -mjson.tool
{
    "json": "obj"
}


sqlite3
>>> import sqlite3
>>> conn = sqlite3.connect('dbase1') # при необходимости используйте полный путь к файлу
# мож­но пе­ре­дать спе­ци­аль­ную стро­ку «:memory:», что­бы соз­дать вре­мен­ную ба­зу дан­ных в па­мя­ти
>>> curs = conn.cursor()
>>> tblcmd = 'create table people (name char(30), job char(10), pay int(4))'
>>> curs.execute(tblcmd)
>>> curs.executemany('insert into people values (?, ?, ?)',
...          [ ('Sue', 'mus', '70000'),
...            ('Ann', 'mus', '60000')])
>>> rows = [['Tom', 'mgr', 100000],
...         ['Kim', 'adm', 30000],
...         ['pat', 'dev', 90000]]
>>> for row in rows:
...     curs.execute('insert into people values (? , ?, ?)', row)
...
>>> conn.commit() # сохранить изменения в базе
>>> curs.execute('select * from people') # выбрать записи
>>> curs.fetchall() # из­влечь записи
[('Bob', 'dev', 5000), ('Sue', 'mus', 70000), ('Ann', 'mus', 60000), ('Tom',
'mgr', 100000), ('Kim', 'adm', 30000), ('pat', 'dev', 90000)]

>>> for (name, job, pay) in curs.fetchall():
...     print(name, ':', pay)

>>> curs.execute('select * from people')
>>> colnames = [desc[0] for desc in curs.description]
>>> colnames
['name', 'job', 'pay']
>>> for row in curs.fetchall():
...     for name, value in zip(colnames, row):
...        print(name, '\t=>', value)
...    print()

>>> curs.execute('delete from people where name = ?', ['Bob'])
>>> curs.execute('delete from people where pay >= ?',(90000,))
>>> curs.execute('select * from people')
>>> curs.fetchall()
[('Sue', 'mus', 70000), ('Ann', 'mus', 65000), ('Kim', 'adm', 65000)]
>>> conn.commit()

>>> curs.execute('select * from people')
>>> colnames = [desc[0] for desc in curs.description]
>>> rowdicts = [dict(zip(colnames, row)) for row in curs.fetchall()]
>>> rowdicts[0]
{'pay': 70000, 'job': 'mus', 'name': 'Sue'}

>>> from sqlite3 import connect
>>> conn = connect('dbase1')
>>> curs = conn.cursor()
>>> curs.execute('delete from people')      # очистить таблицу
>>> curs.execute('select * from people')
>>> curs.fetchall()
[]
>>> file = open('data.txt')
>>> rows = [line.rstrip().split(',') for line in file]
>>> rows[0]
['bob', 'devel', '50000']

>>> curs.execute("select sum(pay), avg(pay) from people where job = 'devel'")
>>> curs.fetchall()
[(150000, 50000.0)]

http://www.internet-technologies.ru/articles/article_2190.html


records
>>> import records 
>>> db = records.Database('sqlite:///mydb.db') 
>>> 
>>> rows = db.query('SELECT * FROM cheese') 
>>> print(rows.dataset) 
name         |price 
-------------|----- 
red leicester|1.0 
wensleydale  |2.2 
>>> 
>>> print(rows.export('json')) 
[{"name": "red leicester", "price": 1.0}, {"name": "wensleydale", "price": 2.2}]

$ records 'SELECT * FROM cheese' yaml --url=sqlite:///mydb.db 
- {name: red leicester, price: 1.0} 
- {name: wensleydale, price: 2.2} 
$ records 'SELECT * FROM cheese' xlsx --url=sqlite:///mydb.db > cheeses.xlsx



Работа с архивами



создание архива
$ python3
>>> import shutil
>>> shutil.make_archive('/home/user/каталог/имя_архива', 'zip', '/home/user/path')

сделает архив содержимого каталога path и положит в указанном месте с указанным именем,
добавив расширение сжатия (zip), форматы сжатия zip gztar bztar xz

распаковка архива
$ python3
>>> import zipfile
>>> zipfile.ZipFile('/home/user/file.zip').extractall('/home/user/tmp/new')

распакует архив в папку new, папка будет создана, если её нет

или просто в консоли использовать модули python:
https://docs.python.org/3/library/tarfile.html

$ python3 -m tarfile -c $HOME/tmp/new_archiv.tar.bz2 $HOME/tmp/rt/ - создать архив
$ python3 -m tarfile -e $HOME/tmp/new_archiv.tar.bz2 $HOME/tmp/rt/1 - распаковать архив

аналогично для форматов tar.gz и tar.xz


Работа со строками



Строки. Функции и методы строк
Использование регулярных выражений в Python для новичков
41 вопрос о работе со строками в Python
в python3 достаточно просто присвоить строку
$ python3
>>> str='Самой используемой кодировкой в мире является utf8'
>>> str
'Самой используемой кодировкой в мире является utf8'

в python2 чуть больше телодвижений
$ python
>>> str=u'Самой используемой кодировкой в мире является utf8'
>>> print str
Самой используемой кодировкой в мире является utf8

Кодировки в python

Методы строк
str.find(substr)
Вы­пол­ня­ет по­иск под­стро­ки.
str.replace(old, new)
Вы­пол­ня­ет под­ста­нов­ку под­стро­ки.
str.split(delimiter)
Раз­би­ва­ет стро­ку по ука­зан­но­му раз­де­ли­те­лю или про­бель­ным сим­во­лам.
str.join(iterable)
Объ­еди­ня­ет под­стро­ки, встав­ляя раз­де­ли­те­ли ме­ж­ду ни­ми.
str.strip()
Уда­ля­ет ве­ду­щие и за­вер­шаю­щие про­бель­ные сим­во­лы.
str.rstrip()
Уда­ля­ет толь­ко за­вер­шаю­щие про­бель­ные сим­во­лы, ес­ли они име­ют­ся.
str.rjust(width)
Вы­рав­ни­ва­ет стро­ку по пра­во­му краю в по­ле фик­си­ро­ван­ной ши­ри­ны.
str.upper()
Пе­ре­во­дит все сим­во­лы в верх­ний ре­гистр.
str.isupper()
Про­ве­ря­ет – все ли сим­во­лы в стро­ке яв­ля­ют­ся сим­во­ла­ми верх­не­го ре­ги­ст­ра.
str.isdigit()
Про­ве­ря­ет – все ли сим­во­лы в стро­ке яв­ля­ют­ся циф­ра­ми.
str.endswith(substr-or-tuple)
Про­ве­ря­ет при­сут­ст­вие под­стро­ки (или од­но­го из ва­ри­ан­тов в кор­те­же) в кон­це дан­ной стро­ки.
str.startswith(substr-or-tuple)
Про­ве­ря­ет при­сут­ст­вие под­стро­ки (или од­но­го из ва­ри­ан­тов в кор­те­же) в на­ча­ле дан­ной стро­ки.


преобразование строк в кортеж, список и обратно
>>> 'spam eggs ham'.split()
['spam', 'eggs', 'ham']
>>> tuple(['spam', 'eggs', 'ham'])
('spam', 'eggs', 'ham')
>>> list(('spam', 'eggs', 'ham'))
['spam', 'eggs', 'ham']
>>> list('spam eggs ham')
['s', 'p', 'a', 'm', ' ', 'e', 'g', 'g', 's', ' ', 'h', 'a', 'm']
>>> ''.join(['s', 'p', 'a', 'm', ' ', 'e', 'g', 'g', 's', ' ', 'h', 'a', 'm'])
'spam eggs ham'
>>> '*'.join('spam eggs ham')
's*p*a*m* *e*g*g*s* *h*a*m'
>>> 's*p*a*m* *e*g*g*s* *h*a*m'.split('*')
['s', 'p', 'a', 'm', ' ', 'e', 'g', 'g', 's', ' ', 'h', 'a', 'm']
>>> ''.join(['s', 'p', 'a', 'm', ' ', 'e', 'g', 'g', 's', ' ', 'h', 'a', 'm'])
'spam eggs ham'

вредный совет
выпрямить вложенные списки с помощью функции sum()
>>> l=[['a', 'b', 'c'], ['1', '2'], ['#']]
>>> sum(l, [])
['a', 'b', 'c', '1', '2', '#']



столбик
типа 
perl -pa0e'$_=join",",@F' 1.txt > 2.txt
sed ':a;N;$!ba;s/\n/ /g' my.txt > my1.txt

>>> s="""
... Keujiuz8 
... ze5iiFee 
... chuF7hae 
... Quah8equ 
... UZiloh9A 
... quiWin0d 
... Fael9uo8 
... pheeph7M
... """
>>> s
'\nKeujiuz8 \nze5iiFee \nchuF7hae \nQuah8equ \nUZiloh9A \nquiWin0d \nFael9uo8 \npheeph7M\n'
>>> ' '.join(s.split())
'Keujiuz8 ze5iiFee chuF7hae Quah8equ UZiloh9A quiWin0d Fael9uo8 pheeph7M'

>>> d=s.split()
>>> for i in range(len(d)): print(d[i])
... 
Keujiuz8
ze5iiFee
chuF7hae
Quah8equ
UZiloh9A
quiWin0d
Fael9uo8
pheeph7M

>>> a=['sjdej', 'jsjjjsj', 'jdeechfeo']
>>> for i in a: print(i)
... 
sjdej
jsjjjsj
jdeechfeo

>>> for i in range(1,4): print ("abc"*i)
... 
abc
abcabc
abcabcabc

>>> for i in range(2, 22, 3): print('Номер ('+ str(i)+')')
... 
Номер (2)
Номер (5)
Номер (8)
Номер (11)
Номер (14)
Номер (17)
Номер (20)

>>> supplers = ['pens', 'staplers', 'binders']
>>> for i in range(len(supplers)):
...     print('Index ' + str(i) + ' in supplers is: ' + supplers[i])
... 
Index 0 in supplers is: pens
Index 1 in supplers is: staplers
Index 2 in supplers is: binders


регистр строки
>>> str='blablabla'
>>> str=str.upper()
>>> str
'BLABLABLA'
>>> str=str.lower()
>>> str
'blablabla'
>>> str=str.capitalize()
>>> str
'Blablabla'
>>> str=str.swapcase()
>>> str
'bLABLABLA'
>>> str=str.title()
>>> str
'Blablabla'
>>> 'bLABLABLA'.casefold()
'blablabla'


перевернуть строку
>>> a=list('habrahabr')
>>> a.reverse()
>>> ''.join(a)
'rbaharbah'

>>> 'hanrahabr'[::-1]
'rbaharnah'


Работа с ошибками
>>> import difflib 
>>> capitals = ('Montgomery', 'Juneau', 'Phoenix', 'Little Rock') 
>>> difflib.get_close_matches('Fenix', capitals) 
['Phoenix']


разные манипуляции
>>> 'spam eggs ham'[5:10]            # извлечение среза: подстрока
'eggs '
>>> 'spam ' + 'eggs ham'             # конкатенация (и *, len(), [ix])
'spam eggs ham'
>>> 'spam %s %s' % ('eggs', 'ham') # выражение форматирования: подстановка
'spam eggs ham'
>>> 'spam {} {}'.format('eggs', 'ham') # метод форматирования: альтернатива %
'spam eggs ham'
>>> 'spam = "%-5s", %+06d' % ('ham', 99) # более сложное форматирование
'spam = "ham ", +00099'
>>> 'spam = "{0:<5}", {1:+06}'.format('ham', 99)
'spam = "ham ", +00099'

>>> '-'.join([str(i) for i in range(10)])
'0-1-2-3-4-5-6-7-8-9'
>>> "bla {} blabl {} lala {}".format(1,2,3) 
'bla 1 blabl 2 lala 3'
>>> "bla {2} blabl {0:=10} lala {1}".format(1,2,3) 
'bla 3 blabl          1 lala 2'
>>> "bla   blabl  lala ".split()
['bla', 'blabl', 'lala']
>>> "blahblablhlala".split('h')
['bla', 'blabl', 'lala']
>>> "blahblablhlala".replace('a','z')
'blzhblzblhlzlz'
>>> '_'.join([str(i) for i in range(10)])
'0_1_2_3_4_5_6_7_8_9'

>>> y = {c.upper() * 4 for c in 'spamham'} # генератор множеств
>>> y
{'SSSS', 'AAAA', 'MMMM', 'HHHH', 'PPPP'}
>>>
>>> list(set([1, 2, 3, 1, 2]))             # удалит дубликаты из списка
[1, 2, 3]

>>> L = [{'n':3}, {'n':20}, {'n':0}, {'n':9}]
>>> L.sort(key=lambda x: x['n'])
>>> L
[{'n': 0}, {'n': 3}, {'n': 9}, {'n': 20}]

>>> L = [2, 4, 1, 3, 5]
>>> L.reverse()
>>> L
[5, 3, 1, 4, 2]
>>> L = [2, 4, 1, 3, 5]
>>> list(reversed(L))
[5, 3, 1, 4, 2]

>>> 'A B C D'.split()
['A', 'B', 'C', 'D']
>>> 'A+B+C+D'.split('+')
['A', 'B', 'C', 'D']
>>> '--'.join(['a', 'b', 'c'])
'a--b--c'

>>> 'aaa--bbb--ccc'.split('--')
['aaa', 'bbb', 'ccc']
>>> 'aaa--bbb--ccc'.replace('--', '...') 
'aaa...bbb...ccc' 

>>> x=[34,56]
>>> print((''.join(list(map(str,x)))),)
3456

удалить общие строки из двух списков

>>> a="abb bbb ccc eee".split()
>>> b="aab bbb ccd eee".split()
>>> aa=set(a)
>>> bb=set(b)
>>> c = bb.difference(aa)
>>> print(c)
{'aab', 'ccd'}

удаление повторяющихся в списке значений:

>>> nums = [1, 3, 2, 3, 1, 2, 3, 1, 2]
>>> unique_nums = list(set(nums))
>>> unique_nums
[1, 2, 3]



замена символов
Замена в строке с помощью Python

аналог sed 's/Windows/Linux/g'
>>> s='Windows Windows Windows'
>>> s.replace('Windows', 'Linux')
'Linux Linux Linux'

аналог sed -i 's/Windows/Linux/g' text
>>> old="Windows"
>>> new="Linux"
>>> text="Windows Windows Windows"
>>> import re
>>> print(re.sub(r'\bWindows\b', 'Linux', line))


бы­ст­ро за­ме­нить в фай­ле ка­ж­дый сим­вол та­бу­ля­ции че­тырь­мя точ­ка­ми
from sys import *
stdout.write(('.' * 4).join(stdin.read().split('\t'))) 

[a-zA-Z0-9_]+ со­от­вет­ст­ву­ет са­мой длин­ной стро­ке из од­но­го или бо­лее сим­во­лов букв, цифр или под­чер­ки­ва­ний. 
\w Лю­бой ал­фа­вит­но-циф­ро­вой сим­вол ([a-zA-Z0-9_] для ASCII)
[\t ]* со­от­вет­ст­ву­ет ну­лю или бо­лее та­бу­ля­ций и про­бе­лов        

>>> table = "".maketrans('12', '34', 'cs')
>>> '1212cs 5612cs cscs'.translate(table)
'3434 5634 '

>>> intab = "aeiou"
>>> outtab = "12345"
>>> trantab = str.maketrans(intab, outtab)
>>> str = "this is string example....wow!!!"
>>> print (str.translate(trantab))
th3s 3s str3ng 2x1mpl2....w4w!!!

strip() удаляет начальные и конечные пробелы
replace() удаляет все пробелы из строки
translate() избавиться от всех пробелов, а также от символов новой строки
" ".join(s.split()) избавиться от всех повторяющихся пробелов и символов новой строки
'строка'[1:] удалить первый символ строки

добавить символы в начало и конец строки
yourstring = "L{0}LL".format(yourstring) 
yourstring = ''.join(('L','yourstring','LL'))
yourstring = "L%sLL" % yourstring
yourstring = "L" + yourstring + "LL"

yourstring = '"'{0}'"'.format(yourstring) добавить кавычки в начало и конец строки



Очистка входных строковых данных
Полезные советы по Python, которых вы ещё не встречали
user_input = "This\nstring has\tsome whitespaces...\r\n"

character_map = {
 ord('\n') : ' ',
 ord('\t') : ' ',
 ord('\r') : None
}
user_input.translate(character_map)  # This string has some whitespaces... "


модуль re
аналог sed -i 's/Windows/Linux/g' text
>>> old="Windows"
>>> new="Linux"
>>> text="Windows Windows Windows"
>>> import re
>>> print(re.sub(r'\bWindows\b', 'Linux', line))

>>> import re
>>> re.split('--', 'aaa--bbb--ccc')
['aaa', 'bbb', 'ccc']
>>> re.sub('--', '...', 'aaa--bbb--ccc')    # случай с единственным разделителем
'aaa...bbb...ccc'
>>> re.split('--|==', 'aaa--bbb==ccc')      # разбить по -- или ==
['aaa', 'bbb', 'ccc']
>>> re.sub('--|==', '...', 'aaa--bbb==ccc') # заменить -- или ==
'aaa...bbb...ccc'
>>> re.split('[-=]', 'aaa-bbb=ccc')      # односимвольные альтернативы
['aaa', 'bbb', 'ccc']
>>> re.split('(--)|(==)', 'aaa--bbb==ccc')     # результат разбиения
['aaa', '--', None, 'bbb', None, '==', 'ccc'] # включает группы
>>> re.split('(?:--)|(?:==)', 'aaa--bbb==ccc') # часть выражения, не группы
['aaa', 'bbb', 'ccc']


использование обратного слэша
>>> a='Это не будет развернуто: \nновая строка'
>>> print(a)
Это не будет развернуто: 
новая строка
>>> a='Это не будет развернуто: \tновая строка'
>>> print(a)
Это не будет развернуто: 	новая строка
>>> a='Это не будет развернуто: \vновая строка'
>>> print(a)
Это не будет развернуто: 
                         новая строка
>>> a='Это не будет развернуто: \fновая строка'
>>> print(a)
Это не будет развернуто: 
                         новая строка
>>> a='Однажды Арнольд сказал: "I\'ll be back"'
>>> print(a)
Однажды Арнольд сказал: "I'll be back"


5 СПОСОБОВ ФОРМАТИРОВАНИЯ СТРОК
https://shultais.education/blog/python-f-strings

>>> name = "User"
>>> age = 100
>>> print("Меня зовут " + name + ". Мне " + str(age) + " лет.")
>>> Меня зовут User. Мне 100 лет.

>>> name = "User"
>>> age = 100
>>> print("Меня зовут %s. Мне %d лет." % (name, age))
>>> Меня зовут User. Мне 100 лет.
>>> print("Меня зовут %(name)s. Мне %(age)d лет." % {"name": name, "age": age})
>>> Меня зовут User. Мне 100 лет.

>>> from string import Template
>>> name = "User"
>>> age = 100
>>> s = Template('Меня зовут $name. Мне $age лет.')
>>> print(s.substitute(name=name, age=age))
>>> Меня зовут User. Мне 100 лет.

>>> name = "User"
>>> age = 100
>>> print("Меня зовут {}. Мне {} лет.".format(name, age)
>>> Меня зовут User. Мне 100 лет.
>>> print("Меня зовут {name} Мне {age} лет.".format(age=age, name=name)
>>> Меня зовут User. Мне 100 лет.

# начиная с Python 3.6
>>> name = "User" 
>>> age = 100
>>> print(f"Меня зовут {name} Мне {age} лет.")
>>> Меня зовут User. Мне 100 лет.


ПОГРУЖЕНЕ В F-СТРОКИ
>>> "обычная строка"
>>> f"f-строка"

f-строки также поддерживают расширенное форматирование чисел:
>>> from math import pi
>>> print(f"Значение числа pi: {pi:.2f}")
>>> Значение числа pi: 3.14

С помощью f-строк можно форматировать дату без вызова метода strftime():
>>> from datetime import datetime as dt
>>> now = dt.now()
>>> print(f"Текущее время {now:%d.%m.%Y %H:%M}")
>>> Текущее время 24.02.2017 15:51

Они поддерживают базовые арифметические операции. Да, прямо в строках:
>>> x = 10
>>> y = 5
>>> print(f"{x} x {y} / 2 = {x * y / 2}")
>>> 10 x 5 / 2 = 25.0

Позволяют обращаться к значениям списков по индексу:
>>> planets = ["Меркурий", "Венера", "Земля", "Марс"]
>>> print(f"Мы живим не планете {planets[2]}")
>>> Мы живим не планете Земля

А также к элементам словаря по ключу:
>>> planet = {"name": "Земля", "radius": 6378000}
>>> print(f"Планета {planet['name']}. Радиус {planet['radius']/1000} км.")
>>> Планета Земля. Радиус 6378.0 км. 

Причем вы можете использовать как строковые, так и числовые ключи. Точно также как в обычном Python коде:
>>> digits = {0: 'ноль', 'one': 'один'}
>>> print(f"0 - {digits[0]}, 1 - {digits['one']}")
>>> 0 - ноль, 1 - один

Вы можете вызывать в f-строках методы объектов:
>>> name = "User"
>>> print(f"Имя: {name.upper()}")
>>> Имя: User

А также вызывать функции:
>>> print(f"13 / 3 = {round(13/3)}")
>>> 13 / 3 = 4


zip + list

http://blog.lerner.co.il/implementing-zip-list-comprehensions/
>>> s = 'abc'
>>> t = (10, 20, 30)
>>> u = (-5, -10, -15)
>>> list(zip(s,t,u))
[('a', 10, -5), ('b', 20, -10), ('c', 30, -15)]
>>> [(s[i], t[i]) for i in range(len(s))] 
[('a', 10), ('b', 20), ('c', 30)]
>>> [(s[i], t[i]) for i in range(len(sorted((s,t), key=len)[0]))]
[('a', 10), ('b', 20), ('c', 30)]
>>> def shortest_sequence_range(*args):
...     return range(len(sorted(args, key=len)[0]))
... 
>>> [(s[i], t[i]) for i in shortest_sequence_range(s,t) ]
[('a', 10), ('b', 20), ('c', 30)]
>>> g = ((s[i], t[i]) for i in shortest_sequence_range(s,t) )
>>> for item in g: print(item)
... 
('a', 10)
('b', 20)
('c', 30)

>>> names = ['Tom', 'Dick', 'Harry']
>>> ages = [50, 35, 60]
>>> dict(zip(names, ages))
{'Harry': 60, 'Dick': 35, 'Tom': 50}



Работа с текстом




Сравнение содержания двух текстовых файлов
http://www.cyberforum.ru/python/thread1452346.html
http://aidalinux.ru/w/Grep
grep: коллекция примеров использования
вместо
grep -F -f 2.txt 1.txt > 3.txt (все совпадающие)
grep -Fv -f 2.txt 1.txt > 3.txt (разница)
grep -i -Fv -f 2.txt 1.txt > 3.txt (разница без учёта регистра)
pcregrep -vFf 2.txt 1.txt

эти точнее
diff --old-line-format=$'%l\n' --new-line-format='' --unchanged-line-format='' <(sort -u 2.txt) <(sort -u 1.txt)
comm -23 1.txt 2.txt
comm -13 <(sort -u 1.txt) <(sort -u 2.txt)|cat > output
Compare-Object (gc 1.txt) (gc 2.txt)  -PassThru


$ cat 1.txt
one two three four
$ cat 2.txt
two three one

вначале привести к одинаковому регистру 
типа
$ tr '[:upper:]' '[:lower:]'  lower.txt

Все буквы будут большими:
$ sed -i 's/.*/\U&/' 1.txt

Все буквы будут маленькими:
$ sed -i 's/.*/\L&/' 1.txt

>>> with open('1.txt', 'r',  encoding='utf-8-sig') as fileinput: fileinput.read().lower();

>>> data = [set(open(i).read().split()) for i in ('1.txt', '2.txt')]
>>> print(data[0].difference(data[1]))

nano diff_files1.py


python3 -m diff_files1


# запись
with open("filename.txt", "w") as file: file.write("hello world")

# чтение целиком
for line in open('filename.txt'): print(line)


# построчное чтение

for line in open('filename.txt').xreadlines(): print(line)
# в python2x

for line in open('filename.txt').readlines(): print(line, end='') # в python3x

B = 'spamspamspam'
open('savetree.txt', 'w').write(str(B))
# Сохранить в файл для последующего просмотра
open('latindata', 'w', encoding='latin-1').write(B) # Запись в latin-1
open('utf8data', 'w', encoding='utf-8').write(B) # Запись в utf-8
open('latindata', 'r', encoding='latin-1').read() # Декодирование выполняется при чтении
open('utf8data', 'r', encoding='utf-8').read() # в соответствии с названием кодировки
open('latindata', 'rb').read() # Прочитать двоичные данные


import pysed
print(pysed.replace("очень очень много букв", 'о', '!!!!'))
http://rtfm.co.ua/python-modul-pysed-rasshirennyj-analog-redaktora-sed/
https://pypi.python.org/pypi/pysed

правильное чтение



найти слово в тексте
https://pynative.com/python-search-for-a-string-in-text-files/



транслитерация

pip install transliterate
>>> from transliterate import translit
>>> print(translit(u"всякий разный текст", 'ru', reversed=True))



Кодировки



# -*- coding: utf-8 -*-
или
# coding: utf8

import sys
sys.getdefaultencoding() # Кодировка по умолчанию
import encodings.aliases
list(encodings.aliases.aliases)
print(encodings.aliases.aliases)
import encodings.aliases
arr = encodings.aliases.aliases
keys = list(arr.keys())
keys.sort() 
for key in keys: 
    print("%s => %s"% (key, arr[key]))

>>> from encodings.aliases import aliases
>>> def find(q):
...     return [(k,v) for k, v in aliases.items() if q in k or q in v]
...
>>> find('1252') # multiple aliases
[('1252', 'cp1252'), ('windows_1252', 'cp1252')]
>>> find('koi')
[('cskoi8r', 'koi8_r')]
>>> a=find('')
>>> a.sort()
>>> print(a)
[большой список]

import pkgutil
import encodings
false_positives = set(["aliases"])
found = set(name for imp, name, ispkg in pkgutil.iter_modules(encodings.__path__) if not ispkg)
found.difference_update(false_positives)
print(found)

>>> import chardet
>>> s = '\xe2\x98\x83' # ☃
>>> chardet.detect(s)
{'confidence': 0.505, 'encoding': 'utf-8'}

from encodings.aliases import aliases
print aliases.keys()

import os
import encodings
os.listdir(os.path.dirname(encodings.__file__))

https://docs.python.org/3/library/codecs.html#standard-encodings
https://docs.python.org/3/library/codecs.html#python-specific-encodings
http://stackoverflow.com/questions/1728376/get-a-list-of-all-the-encodings-python-can-encode-to


Ше­ст­на­дца­терич­ное зна­че­ние ко­да ASCII



>>> hex(ord('&'))
'0x26'
>>> hex(ord('+'))
'0x2b'

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

Profile

uzverss: (Default)
uzverss

December 2024

S M T W T F S
12345 67
891011121314
15161718192021
22232425262728
293031    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 22nd, 2026 08:22 am
Powered by Dreamwidth Studios