Модули в python: Модуль shutil | Python 3 для начинающих и чайников

Модуль shutil | Python 3 для начинающих и чайников

Модуль shutil содержит набор функций высокого уровня для обработки файлов, групп файлов, и папок. В частности, доступные здесь функции позволяют копировать, перемещать и удалять файлы и папки. Часто используется вместе с модулем os.

Операции над файлами и директориями

shutil.copyfileobj(fsrc, fdst[, length]) — скопировать содержимое одного файлового объекта (fsrc) в другой (fdst). Необязательный параметр length — размер буфера при копировании (чтобы весь, возможно огромный, файл не читался целиком в память).

При этом, если позиция указателя в fsrc не 0 (т.е. до этого было сделано что-то наподобие fsrc.read(47)), то будет копироваться содержимое начиная с текущей позиции, а не с начала файла.

shutil.copyfile(src, dst, follow_symlinks=True) — копирует содержимое (но не метаданные) файла src в файл dst. Возвращает dst (т.е. куда файл был скопирован). src и dst это строки — пути к файлам. dst должен быть полным именем файла.

Если src и dst представляют собой один и тот же файл, исключение shutil.SameFileError.

Если dst существует, то он будет перезаписан.

Если follow_symlinks=False и src является ссылкой на файл, то будет создана новая символическая ссылка вместо копирования файла, на который эта символическая ссылка указывает.

shutil.copymode(src, dst, follow_symlinks=True) — копирует права доступа из src в dst. Содержимое файла, владелец, и группа не меняются.

shutil.copystat(src, dst, follow_symlinks=True) — копирует права доступа, время последнего доступа, последнего изменения, и флаги src в dst. Содержимое файла, владелец, и группа не меняются.

shutil.copy(src, dst, follow_symlinks=True) — копирует содержимое файла src в файл или папку dst. Если dst является директорией, файл будет скопирован с тем же названием, что было в src. Функция возвращает путь к местонахождению нового скопированного файла.

Если follow_symlinks=False, и src это ссылка, dst будет ссылкой.

Если follow_symlinks=True, и src это ссылка, dst будет копией файла, на который ссылается src

copy() копирует содержимое файла, и права доступа.

shutil.copy2(src, dst, follow_symlinks=True) — как copy(), но пытается копировать все метаданные.

shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False) — рекурсивно копирует всё дерево директорий с корнем в src, возвращает директорию назначения.

Директория dst не должна существовать. Она будет создана, вместе с пропущенными родительскими директориями.

Права и времена у директорий копируются copystat(), файлы копируются с помощью функции copy_function (по умолчанию shutil.copy2()).

Если symlinks=True, ссылки в дереве src будут ссылками в dst, и метаданные будут скопированы настолько, насколько это возможно.

Если False (по умолчанию), будут скопированы содержимое и метаданные файлов, на которые указывали ссылки.

Если symlinks=False, если файл, на который указывает ссылка, не существует, будет добавлено исключение в список ошибок, в исключении shutil.

Error в конце копирования.

Можно установить флаг ignore_dangling_symlinks=True, чтобы скрыть данную ошибку.

Если ignore не None, то это должна быть функция, принимающая в качестве аргументов имя директории, в которой сейчас copytree(), и список содержимого, возвращаемый os.listdir(). Т.к. copytree() вызывается рекурсивно, ignore вызывается 1 раз для каждой поддиректории. Она должна возвращать список объектов относительно текущего имени директории (т.е. подмножество элементов во втором аргументе). Эти объекты не будут скопированы.

shutil.ignore_patterns(*patterns) — функция, которая создаёт функцию, которая может быть использована в качестве ignore для copytree(), игнорируя файлы и директории, которые соответствуют glob-style шаблонам.

Например:

copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))
# Скопирует все файлы, кроме заканчивающихся на .pyc или начинающихся с tmp

shutil.rmtree(path, ignore_errors=False, onerror=None) — Удаляет текущую директорию и все поддиректории; path должен указывать на директорию, а не на символическую ссылку.

Если ignore_errors=True, то ошибки, возникающие в результате неудавшегося удаления, будут проигнорированы. Если False (по умолчанию), эти ошибки будут передаваться обработчику onerror, или, если его нет, то исключение.

На ОС, которые поддерживают функции на основе файловых дескрипторов, по умолчанию используется версия rmtree(), не уязвимая к атакам на символические ссылки.

На других платформах это не так: при подобранном времени и обстоятельствах «хакер» может, манипулируя ссылками, удалить файлы, которые недоступны ему в других обстоятельствах.

Чтобы проверить, уязвима ли система к подобным атакам, можно использовать атрибут rmtree.avoids_symlink_attacks.

Если задан onerror, это должна быть функция с 3 параметрами: function, path, excinfo.

Первый параметр, function, это функция, которая создала исключение; она зависит от платформы и интерпретатора. Второй параметр, path, это путь, передаваемый функции. Третий параметр, excinfo — это информация об исключении, возвращаемая sys. exc_info(). Исключения, вызванные onerror, не обрабатываются.

shutil.move(src, dst, copy_function=copy2) — рекурсивно перемещает файл или директорию (src) в другое место (dst), и возвращает место назначения.

Если dst — существующая директория, то src перемещается внутрь директории. Если dst существует, но не директория, то оно может быть перезаписано.

shutil.disk_usage(path) — возвращает статистику использования дискового пространства как namedtuple с атрибутами total, used и free, в байтах.

shutil.chown(path, user=None, group=None) — меняет владельца и/или группу у файла или директории.

shutil.which(cmd, mode=os.F_OK | os.X_OK, path=None) — возвращает путь к исполняемому файлу по заданной команде. Если нет соответствия ни с одним файлом, то None. mode это права доступа, требующиеся от файла, по умолчанию ищет только исполняемые.

Архивация

Высокоуровневые функции для созданиия и чтения архивированных и сжатых файлов. Основаны на функциях из модулей zipfile и tarfile.

shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]]) — создаёт архив и возвращает его имя.

base_name это имя файла для создания, включая путь, но не включая расширения (не нужно писать «.zip» и т.д.).

format — формат архива.

root_dir — директория (относительно текущей), которую мы архивируем.

base_dir — директория, в которую будет архивироваться (т.е. все файлы в архиве будут в данной папке).

Если dry_run=True, архив не будет создан, но операции, которые должны были быть выполнены, запишутся в logger.

owner и group используются при создании tar-архива.

shutil.get_archive_formats() — список доступных форматов для архивирования.

>>> shutil.get_archive_formats()
[('bztar', "bzip2'ed tar-file"),
('gztar', "gzip'ed tar-file"),
('tar', 'uncompressed tar file'),
('xztar', "xz'ed tar-file"),
('zip', 'ZIP file')]

shutil. unpack_archive(filename[, extract_dir[, format]]) — распаковывает архив. filename — полный путь к архиву.

extract_dir — то, куда будет извлекаться содержимое (по умолчанию в текущую).

format — формат архива (по умолчанию пытается угадать по расширению файла).

shutil.get_unpack_formats() — список доступных форматов для разархивирования.

Запрос размера терминала вывода

shutil.get_terminal_size(fallback=(columns, lines)) — возвращает размер окна терминала.

fallback вернётся, если не удалось узнать размер терминала (терминал не поддерживает такие запросы, или программа работает без терминала). По умолчанию (80, 24).

>>> shutil.get_terminal_size()
os.terminal_size(columns=102, lines=29)
>>> shutil.get_terminal_size()  # Уменьшили окно
os.terminal_size(columns=67, lines=17)

Для вставки кода на Python в комментарий заключайте его в теги <pre><code>Ваш код</code></pre>

Модуль csv — чтение и запись CSV файлов

Формат CSV (Comma Separated Values) является одним из самых распространенных форматов импорта и экспорта электронных таблиц и баз данных. CSV использовался в течение многих лет до того, как был стандартизирован в RFC 4180. Запоздание четко определенного стандарта означает, что в данных, создаваемых различными приложениями, часто существуют незначительные различия. Эти различия могут вызвать раздражение при обработке файлов CSV из нескольких источников. Тем не менее, хотя разделители, символы кавычек и некоторые другие свойства различаются, общий формат достаточно универсален. Значит, возможно написать один модуль, который может эффективно манипулировать такими данными, скрывая детали чтения и записи данных от программиста.

Функции обработки CSV-файлов

csv.reader(csvfile, dialect=’excel’, **fmtparams) — возвращает объект reader, который построчно итерирует csvfile. Если csvfile является файловым объектом, то его нужно открыть с параметром newline=». Дополнительный параметр dialect используется для определения ряда параметров, характерных для специфического CSV диалекта. Он может быть подклассом Dialect или одной из строк, возвращаемой функцией list_dialects().

Также могут передаваться дополнительные ключевые аргументы fmtparams для переопределения отдельных параметров форматирования в текущем диалекте.

Подробнее см. раздел «Диалекты и параметры форматирования».

Каждая строка, считанная из файла csv, возвращается в виде списка строк. Автоматическое преобразование типов данных не выполняется, если не указан параметр формата QUOTE_NONNUMERIC (в этом случае все поля без кавычек преобразуются в числа с плавающей точкой).

Короткий пример использования:

>>> import csv
>>> with open('eggs.csv', 'r', newline='') as csvfile:
...     spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
...     for row in spamreader:
...         print(', '.join(row))
Spam, Spam, Spam, Spam, Spam, Baked Beans
Spam, Lovely Spam, Wonderful Spam

csv.writer(csvfile, dialect=’excel’, **fmtparams) — возвращает объект writer, конвертирующий пользовательские данные в CSV-файл csvfile. csvfile может быть любым объектом с методом write(). Если csvfile является файловым объектом, то его нужно открыть с параметром newline=». Параметры dialect и fmtparams идентичны параметрам в функции csv.reader.

Необходимые методы экземпляра класса writer:

csvwriter.writerow(row) — записывает данные, представляющие одну строку CSV в файл, форматируя согласно текущему диалекту writer.

csvwriter.writerows(rows) — записывает данные, представляющие несколько строк CSV в файл, форматируя согласно текущему диалекту writer.

Пример использования writer:

import csv
with open('eggs.csv', 'w', newline='') as csvfile:
    spamwriter = csv.writer(csvfile, delimiter=' ',
                            quotechar='|', quoting=csv.QUOTE_MINIMAL)
    spamwriter.writerow(['Spam'] * 5 + ['Baked Beans'])
    spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])

csv.field_size_limit([new_limit]) — текущий максимальный размер поля. Если задан new_limit, то он становится новым макс. размером.

class csv. DictReader(f, fieldnames=None, restkey=None, restval=None, dialect=’excel’, *args, **kwds) — как reader, но отображает информацию о столбцах в словарь, ключи которого заданы в параметре fieldnames.

fieldnames это последовательность ключей. Если параметр опущен, в качестве ключей используются значения из первой строки файла. Если строка имеет больше полей, чем длина fieldnames, оставшиеся данные будут помещены в список с ключом из переменной restkey. Если строка имеет меньше полей, оставшиеся значения будут установлены в значение restval.

Остальные аргументы пробрасываются далее в экземпляр reader.

Пример использования:

>>> import csv
>>> with open('names.csv', newline='') as csvfile:
...     reader = csv.DictReader(csvfile)
...     for row in reader:
...         print(row['first_name'], row['last_name'])
...
Eric Idle
John Cleese
>>> print(row)
{'first_name': 'John', 'last_name': 'Cleese'}

class csv. DictWriter(f, fieldnames, restval=», extrasaction=’raise’, dialect=’excel’, *args, **kwds) — как writer, но отображает словари в CSV-файл.

Обязательный параметр fieldnames — последовательность ключей, определяющие порядок, в котором значения из словаря будут записаны в строке CSV-файла f.

Параметр restval определяет значение в случае, если в словаре будет отсутствовать запись с данным ключом. Если словарь содержит лишние ключи, то поведение определяется параметром extrasaction. Если он ‘raise’, то выдаст ошибку. Если ‘ignore’, то такие ключи игнорируются.

Остальные аргументы пробрасываются далее в экземпляр writer.

Помимо методов writerow и writerows, DictWriter имеет также метод

Пример использования DictWriter:

import csv
with open('names.csv', 'w', newline='') as csvfile:
    fieldnames = ['first_name', 'last_name']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})
    writer. writerow({'first_name': 'Lovely', 'last_name': 'Spam'})
    writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})

Диалекты и параметры форматирования

class csv.Dialect — для упрощения задания формата входных и выходных записей, конкретные параметры форматирования группируются в диалекты, подклассы csv.Dialect. Диалекты поддерживают следующие атрибуты:

Dialect.delimiter — разделитель столбцов в строке CSV-файла. По умолчанию ‘,’.

Dialect.quotechar — символ, использующийся для «склейки» поля, содержащего специальные символы, такие как delimiter, quotechar, или символы новой строки. По умолчанию используется значение ‘»‘.

Dialect.doublequote — как Dialect.quotechar, появляющийся внутри поля, должен экранироваться. Когда True, символ удваивается. Когда False, Dialect.escapechar используется как префикс к quotechar. По умолчанию True.

При записи файла, если doublequote=False и не установлен escapechar, выдаст ошибку при обнаружении quotechar в столбце.

Dialect.escapechar — символ, используемый writer для экранирования delimiter, если quoting установлен в QUOTE_NONE и quotechar, если doublequote=False. При чтении escapechar удаляет какое-либо особое значение со следующего символа. По умолчанию используется значение None, которое отключает экранирование.

Dialect.lineterminator — символы, используемые для завершения строки при записи. По умолчанию ‘\r\n’.

Dialect.skipinitialspace — если True, пробелы, непосредственно следующие за delimiter, игнорируются. Значение по умолчанию — False.

Dialect.strict — когда True, поднимает исключение если CSV файл не распознается. По умолчанию — False.

Dialect.quoting — контролирует, когда кавычки должны генерироваться writer и распознаваться reader. Он может принимать любые константы QUOTE_* и по умолчанию имеет значение QUOTE_MINIMAL.

csv.QUOTE_ALL — writer оборачивает в кавычки все поля.

csv. QUOTE_MINIMAL — writer оборачивает в кавычки только поля, содержащие специальные символы (delimiter, quotechar, lineterminator).

csv.QUOTE_NONNUMERIC — writer оборачивает в кавычки все поля, не являющиеся числами. reader преобразует все поля без кавычек к типу float.

csv.QUOTE_NONE — writer не оборачивает никакие поля в кавычки. Если в данных попадается delimiter или lineterminator, он предваряется символом escapechar, если установлен (исключение, если не установлен). reader не обрабатывает кавычки.

csv.register_dialect(name[, dialect[, **fmtparams]]) — связывает dialect с именем name. Подробности о диалектах см. в разделе «Диалекты и параметры форматирования»

csv.unregister_dialect(name) — удаляет связь диалекта с данным именем.

csv.get_dialect(name) — возвращает класс диалекта, свзанного с именем name.

csv.list_dialects() — список доступных диалектов. На данный момент это ‘excel’, ‘excel-tab’, ‘unix’.

Предустановленные диалекты

class csv. excel — диалект CSV-файла, обычно генерируемого программой Excel.

class csv.excel_tab — диалект CSV-файла, обычно генерируемого программой Excel с настройкой «разделитель с помощью TAB».

class csv.unix_dialect — диалект CSV-файла, обычно генерируемого в UNIX-системах (‘\n’ для новой строки, закавычивание всех полей).

Определение диалекта

class csv.Sniffer — используется для угадывания диалекта CSV-файла. Имеет следующие методы:

csvsniffer.sniff(sample, delimiters=None) — анализирует пример и возвращает Dialect, соответствующий обнаруженным параметрам. Если задан параметр delimiters, он интерпретируется как все возможные разделители.

Методы определения диалекта являются эвристическими; это означает, что Sniffer может ошибаться.

Пример использования Sniffer:

with open('example.csv', newline='') as csvfile:
    dialect = csv.Sniffer().sniff(csvfile.read(1024))
    csvfile.seek(0)
    reader = csv.reader(csvfile, dialect)
    # . .. process CSV file contents here ...

Примеры

Простейший пример чтения CSV файла:

import csv
with open('some.csv', newline='') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

Чтение файла формата passwd:

import csv
with open('passwd', newline='') as f:
    reader = csv.reader(f, delimiter=':', quoting=csv.QUOTE_NONE)
    for row in reader:
        print(row)

Простейший пример записи CSV файла:

import csv
with open('some.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerows(someiterable)

Для вставки кода на Python в комментарий заключайте его в теги <pre><code>Ваш код</code></pre>

Инициализация пути поиска модуля sys.path — документация по Python 3.11.3

Путь поиска модуля инициализируется при запуске Python. Этот путь поиска модуля можно получить по адресу sys.path .

Первая запись в пути поиска модуля — это каталог, содержащий входной скрипт, если он есть. В противном случае первая запись является текущей. каталог, как в случае запуска интерактивной оболочки, a -c команда или -m 9Модуль 0004.

Переменная среды PYTHONPATH часто используется для добавления каталогов. на путь поиска. Если эта переменная среды найдена, содержимое добавлен в путь поиска модуля.

Примечание

PYTHONPATH повлияет на все установленные версии/среды Python. Будьте осторожны, устанавливая это в своем профиле оболочки или глобальных переменных среды. Модуль site предлагает более тонкие методы, как указано ниже.

Следующие добавленные элементы — это каталоги, содержащие стандартные модули Python, такие как а также любые модули расширения, от которых зависят эти модули. Расширение модули представляют собой файлы .pyd в Windows и файлы .so на других платформах. каталог с независимыми от платформы модулями Python называется с префиксом . Каталог с модулями расширения называется exec_prefix .

Переменная среды PYTHONHOME может использоваться для установки 9префикс 0003 и местоположения exec_prefix . В противном случае эти каталоги находятся с помощью исполняемый файл Python в качестве отправной точки, а затем ищет различные «ориентиры» файлы и каталоги. Обратите внимание, что все символические ссылки используются, поэтому настоящие Местоположение исполняемого файла Python используется в качестве отправной точки поиска. Питон исполняемый файл называется home .

Как только домашний определен, каталог с префиксом находится при первом просмотре. на python основная версия дополнительная версия .zip ( python311.zip ). В Windows zip архив ищется в домашняя а на Unix архив ожидается быть в lib . Обратите внимание, что ожидаемое расположение zip-архива добавляется в путь поиска модуля, даже если архив не существует. Если архив не найден, Python в Windows продолжит поиск префикса , выполнив поиск Lib\os.py . Python в Unix будет искать lib/python основная версия . дополнительная версия /os.py ( lib/python3.11/os.py ). В Windows префикс и exec_prefix одинаковы, однако на других платформах lib/python majorversion . младшая версия /lib-dynload ( lib/python3.11/lib-dynload ) ищется и используется как якорь для exec_prefix . На некоторых платформах lib может быть lib64 или другим значением, см. sys.platlibdir и PYTHONPLATLIBDIR .

После обнаружения префикс и exec_prefix доступны по адресу sys.prefix и sys.exec_prefix соответственно.

Наконец, обработан модуль сайта и пакетов сайтов каталогов добавляются в путь поиска модулей. Обычный способ настроить путь поиска: чтобы создать сайт , настройте пользователя или , настройте модули , как описано в 9Документация модуля 0003 сайта .

Примечание

Некоторые параметры командной строки могут дополнительно влиять на расчет пути. Дополнительные сведения см. в -E , -I , -s и -S .

Виртуальные среды

Если Python запускается в виртуальной среде (как описано в разделе Виртуальные среды и пакеты) тогда префикс и exec_prefix специфичны для виртуальной среды.

Если pyvenv.cfg находится рядом с основным исполняемым файлом или в каталог на один уровень выше исполняемого файла, применяются следующие варианты:

_pth файлы

Чтобы полностью переопределить sys.path , создайте файл ._pth с тем же имя в качестве общей библиотеки или исполняемого файла ( python. _pth или python311._pth ). Путь к общей библиотеке всегда известен в Windows, однако он может быть неизвестен. доступны на других платформах. В файле ._pth укажите по одной строке для каждого пути добавить к системный путь . Файл, основанный на имени общей библиотеки, переопределяет тот, который основан на исполняемом файле, который позволяет ограничивать пути для любого программа, загружающая среду выполнения, если это необходимо.

Когда файл существует, все переменные реестра и среды игнорируются, изолированный режим включен, и сайт не импортируется, если только одна строка в файл указывает сайт импорта . Пустые пути и строки, начинающиеся с # , являются игнорируется. Каждый путь может быть абсолютным или относительным относительно местоположения файла. Импорт операторов, отличных от сайт не разрешен, и произвольный код не может быть указан.

Обратите внимание, что файлы . pth (без подчеркивания в начале) будут обрабатываться нормально модулем сайта , если был указан сайт импорта .

Встроенный Python

Если Python встроен в другое приложение Py_InitializeFromConfig() и структура PyConfig может использоваться для инициализации Python. Конкретный путь подробности описаны в разделе Конфигурация пути Python. В качестве альтернативы старше Py_SetPath() можно использовать для обхода инициализации пути поиска модуля.

См. также

Даты Python

❮ Предыдущая Далее ❯


Даты Python

Дата в Python не является собственным типом данных, но мы можем импортировать модуль named datetime для работы с датами как с датами объекты.

Пример

Импортируйте модуль datetime и отобразите текущую дату:

импорт даты и времени

x = datetime.datetime.now ()
print(x)

Попробуйте сами »


Вывод даты

Когда мы выполним код из приведенного выше примера, результатом будет:

Дата содержит год, месяц, день, час, минуту, секунду и микросекунда.

Модуль datetime имеет множество методов для возврата информации о дате объект.

Вот несколько примеров, вы узнаете о них позже в этом глава:

Пример

Возвращает год и название дня недели:

import datetime

x = datetime.datetime.now()

print(x.year)
print(x.strftime(«%A»))

Попробуйте сами »


Создание объектов даты

Для создания дату, мы можем использовать класс datetime() (конструктор) модуль даты и времени .

Класс datetime() требует три параметра для создания даты: год, день месяца.

Пример

Создать объект даты:

import datetime

x = datetime.datetime(2020, 5, 17)

print(x)

Попробуйте сами »

Класс datetime() также принимает параметры для времени и часового пояса (час, минута, секунда, микросекунда, tzone), но они являются необязательными и имеют значение по умолчанию. значение 0 , ( Нет для часового пояса).



Метод strftime()

Объект datetime имеет метод для форматирования объектов даты в читаемые строки.

Метод называется strftime() и принимает один параметр, формат , чтобы указать формат возвращаемой строки:

Пример

Показать название месяца:

import datetime

x = datetime.datetime(2018, 6, 1)

print(x.strftime(«%B»))

Попробуйте сами »

Справочник всех кодов юридических форматов:

Директива Описание Пример 903:00 Попробуйте
Будний день, короткая версия Ср Попробуй »
Будний день, полная версия Среда Попробуй »
% вес День недели в виде числа 0-6, 0 — воскресенье 3 Попробуй »
День месяца 01-31 31 Попробуй »
%b Название месяца, короткая версия декабря Попробуй »
Название месяца, полная версия декабря Попробуй »
Месяц в виде числа 01-12 12 Попробуй »
Год, короткая версия, без века 18 Попробуй »
Год, полная версия 2018 Попробуй »
%H Час 00-23 17 Попробуй »
%I Час 00-12 05 Попробуй »
утра/вечера вечера Попробуй »
Минута 00-59 41 Попробуй »
%S Секунда 00-59 08 Попробуй »
%f Микросекунды 000000-999999 548513 Попробуй »
%z Смещение UTC +0100
%Z Часовой пояс КНТ
%j Номер дня года 001-366 365 Попробуй »
%U Номер недели в году, воскресенье как первый день недели, 00-53 52 Попробуй »
%W Номер недели в году, понедельник как первый день недели, 00-53 52 Попробуй »
Локальная версия даты и времени Пн Дек 31 17:41:00 2018 Попробуй »
Век 20 Попробуй »
Локальная версия даты 31. 12.18 Попробуй »
Локальная версия времени 17:41:00 Попробуй »
%% Символ % % Попробуй »
%G ИСО 8601 год 2018 Попробуй »
ISO 8601 рабочий день (1-7) 1 Попробуй »
%V Номер недели ISO 8601 (01-53) 01 Попробуй »

❮ Предыдущий Следующий ❯


ВЫБОР ЦВЕТА



Лучшие учебники
Учебник по HTML
Учебник по CSS
Учебник по JavaScript
Учебник How To
Учебник по SQL
Учебник по Python
Учебник по W3.CSS
Учебник по Bootstrap
Учебник по PHP
Учебник по Java
Учебник по C++
Учебник по jQuery
9000 5

Лучшие ссылки
Справочник по HTML
Справочник по CSS
Справочник по JavaScript
Справочник по SQL
Справочник по Python
Справочник по W3.
Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *