
консоль 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'