Архив метки: программирование

Строковая функция includes() в JavaScript с примерами

JavaScript предоставляет функцию includes() для поиска заданной строки по определенной подстроке. Существуют и другие методы для поиска в строковом массиве определенной строки.

Синтаксис функции includes()

Функция includes() обеспечивается строковой переменной или строковым литералом, чтобы найти заданный поисковый термин в заданной строке.

STRING.icludes(SEARCH_TERM,START);

  • STRING является строковой переменной или строковым литералом, в котором будет выполняться поиск SEARCH_TERM.
  • includes() — это функция, которую мы будем использовать со следующими параметрами. Эта функция будет возвращать логические результаты true и false в зависимости от ситуации и соответствия. Если он не соответствует, он вернет false, если есть совпадение, он вернет true.
  • SEARCH_TERM это термин, который мы будем искать в строке, который может быть строковой переменной или строковым литералом.
  • STARTэто начальный индекс поиска, из которого с указанного индекса START поиск начнется в строке STRING. START является необязательным, если он не указан, поиск начнется с начала STRING.

 

Поиск заданного термина во всей строке

Мы начнем с простого примера, где мы будем искать простой термин в данной строке. В этом примере мы создадим строковую переменную greeting и ищем «andreyex.ru» внутри переменной приветствия с помощью функции include().

var greeting="Здравствуйте, вы на сайте andreyex.ru. Вы можете найти очень хорошие статьи на этом сайте.";



var match = greeting.includes("andreyex.ru");



console.log(match);

/Печатает true



var match = "Здравствуйте, вы на сайте andreyex.ru. Вы можете найти очень хорошие статьи на этом сайте.".includes("andreyex.ru");



console.log(match);

/Печатает true



var greeting="Здравствуйте, вы на сайте andreyex.ru. Вы можете найти очень хорошие статьи на этом сайте.";



var match = greeting.includes("ANDREYEX.RU");



console.log(match);

//Печатает false

Поиск заданного термина во всей строке

include () — это функция без учета регистра, где «andreyex.ru» и «ANDREYEX.RU» не совпадают. Таким образом, они не будут совпадать в поиске.

 

Поиск заданного термина в указанной части строки

Функция includes() также принимает индекс начала поиска, где поиск будет выполняться после этого индекса. В следующем примере мы будем искать термин «andreyex.ru» после 10-го символа.

var greeting="Здравствуйте, вы на сайте andreyex.ru. Вы можете найти очень хорошие статьи на этом сайте.";



var match = greeting.includes("andreyex.ru",10);



console.log(match);

// Вывести на консоль true



var match = greeting.includes("andreyex.ru",30);



console.log(match);

// Вывести на консоль false

 

Поиск заданного термина в указанной части строки

Из примеров видно, что когда индекс указан как 10, данная строка будет соответствовать, а функция includes() вернет true. Если мы укажем индекс c 30, он не будет совпадать и вернет false.

Сравнение функции includes()

Так как функция includes() возвращает логические значения, такие как true и false, мы можем сравнить эти результаты с числами, такими как 1 и -1, которые связаны с логической логикой в JavaScript. -1 представляет false и 1 представляет true.

"Здравствуйте, вы на сайте andreyex.ru. Вы можете найти очень хорошие статьи на этом сайте.".includes("andreyex.ru");

//Evaluated as true

1 == "Здравствуйте, вы на сайте andreyex.ru. Вы можете найти очень хорошие статьи на этом сайте.".includes("andreyex.ru");

//Evaluated as true

1 == "Здравствуйте, вы на сайте andreyex.ru. Вы можете найти очень хорошие статьи на этом сайте.".includes("ANDREYEX.RU");

//Evaluated as false

-11 == "Здравствуйте, вы на сайте andreyex.ru. Вы можете найти очень хорошие статьи на этом сайте.".includes("ANDREYEX.RU");

//Evaluated as false

-1 == "Здравствуйте, вы на сайте andreyex.ru. Вы можете найти очень хорошие статьи на этом сайте.".includes("ANDREYEX.RU");

//Evaluated as false

 

include(). Альтернативная функция indexOf()

Функция indexOf() является альтернативой функции includes(), в которой возвращается начальный номер данного термина. Если нет совпадения, будет возвращено -1 .

var greeting="Здравствуйте, вы на сайте andreyex.ru. Вы можете найти очень хорошие статьи на этом сайте.";



index=greeting.indexOf("andreyex.ru");



console.log(index);

//Вывод 17



index=greeting.indexOf("ANDREYEX.RU");



console.log(index);

//Вывод -1

 



2019-11-21T13:25:47
Программирование

Глупости программистов-профессионалов

Расскажу про то, как в настоящее время происходит программирование. Неважно на каком проекте, неважно на каком языке программирования. Опишу лишь общую концепцию программирования. Читать

Почему новичкам следует изучать Python



























5/5 — (1 голос)

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

На мой взгляд, самое главное, что вам нужно сделать в программировании — это выбрать правильный инструмент для работы. Вторая по важности вещь — выбрать инструмент, с которым вам наиболее удобно. Если бы я сказал, что вам подойдёт C++, потому что это самый быстрый язык, это не будет хорошим советом, если вы никогда не имели дело с управлением памятью или не писали свои структуры данных. Возможно, вы бы продирались сквозь него и получили плохой опыт.

Python, с другой стороны, решает многие проблемы за вас. Он работает заметно медленнее, чем C++, зато на нём гораздо проще писать. И как новичка вас вряд ли заботит его скорость, вы просто хотите сделать что-нибудь крутое и изучить основные понятия.

Итак, первое решение, которое вам нужно принять — какой язык вы хотите выучить. Почему из сотен языков новичку следует изучать Python? Тому есть несколько причин…

Простой синтаксис

Часть философии языка (как показано в PEP 20, “Дзен Python”), содержит следующее:

  • Красивое лучше, чем уродливое.
  • Простое лучше, чем сложное.
  • Читаемость имеет значение.

Так что, как можно видеть, Python создавался с самого начала из соображений простоты. Это было глотком свежего воздуха, поскольку господствовали тогда языки C и C++, не очень дружелюбные к пользователю.

Давайте сравним синтаксис языков Python и C++ на простом примере ‘Hello, World’:

C++:

#include stdout



int main() {  

    std::cout << "Hello, world!n";

}


Python:

print('Hello, world!')  


Разница довольно значительна, хотя мы всего лишь распечатали строку в консоли. Теперь для большей наглядности сравним его с PHP:

Python:

x=1  

while x <=5:  

    print 'x is less than 5:' + str(x)

    x += 1


PHP:

<?php  

$x=1;

while($x<=5) {  

    echo "x is less than 5: $x";

    x++;

}

?>


Python пытается избавиться от лишнего и требует только то, что действительно нужно, и именно поэтому он создавался без фигурных скобок и точек с запятой на концах строк. Взгляните на разницу (последнее сравнение синтаксиса, я обещаю):

Python:

def foo(x):  

    if x == 0:

        bar()

        baz()

    else:

        qux(x)

        foo(x - 1)


C:

void foo(int x)  

{

    if (x == 0) {

        bar();

        baz();

    } else {

        qux(x);

        foo(x - 1);

    }

}


На самом деле я не пытаюсь очернять другие языки. Все остальные упомянутые здесь языки замечательны и имеют массу применений, но они не столь пригодны для новичков.

С ключевыми словами is, not и with, хорошо написанный скрипт на Python можно читать почти как английский текст. Это особенно верно для условий в цикле if , которые бывает сложно прочесть, когда они разрастаются:

a = None

b = None



if a is not None and b is not None:

    print 'Foo!'

else:

    print 'Bar!'


Условное выражение выше гораздо яснее, чем обычное if ((a != null) && (b != null)).

Легко установить и начать работать

Многие новички, пытаясь изучить язык, сдаются ещё до того, как напишут первую строчку кода. В некоторых языках, таких как Java, вам нужно установить и запустить сложные директории проекта и потом компилировать код.

С Python, всё, что вам нужно — это загрузить и запустить установщик и выполнить python <your-script>.py. Не нужно никаких сложных структур каталогов.

Хотя это всё реже встречается в современных языках, компиляция кода может быть сложнее, чем вы думали (впрочем, это не обязательно плохо). Просто посмотрите на этот маленький makefile для C:

CC = gcc  

CFLAGS  = -g -Wall



TARGET = myprog



all: $(TARGET)



$(TARGET): $(TARGET).c

    $(CC) $(CFLAGS) -o $(TARGET) $(TARGET).c



clean:  

    $(RM) $(TARGET)


Замечу, что это простой makefile. Этому я бы предпочёл Python в любом случае.

Python позволяет вам изучить понятия программирования перед тем, как углубляться в детали того, как высокоуровневый код превращается в машинный, который вам безусловно следует знать, но не когда вы начинаете.

Огромная стандартная библиотека

Одно из наиболее знаменитых преимуществ Python — стандартная библиотека, и это не просто так. Она содержит более 300 модулей (в версии 3.5), от простейшего HTTP сервера (http.server) до баз данных (sqlite3), и сжатых библиотек (gzip).

Бóльшая часть того, вам захочется делать на Python, уже сделано за вас в стандартной библиотеке. Так что вы можете создавать крутые вещи без больших усилий, например приложения для машинного обучения. Мне постоянно приходится напоминать себе, что надо поискать модули, чтобы избежать переписывания кода самому. Поэтому перед тем, как вы попробуете написать библиотеку разбора адресов url, сначала проверьте, существует ли она!

Главное достоинство того, что код был написан до вас — знание того, что он тщательно протестирован и не содержит ошибок. Зачастую он был давно доступен и использовался крупнейшими компаниями (о них мы поговорим позже), так что вы знаете, через что он прошёл.

Сообщество

Большое, активное сообщество означает две вещи:

  • Много самописных библиотек
  • Много людей, готовых вам помочь

Возможно, это одни из наиболее важных причин, почему вам лучше использовать Python, независимо от уровня ваших навыков. Это значит, что в вашем распоряжении множество документации, руководств и примеров кода, чтобы с их помощью лучше изучить язык.

Python постоянно занимает высокие места в различных рейтингах, таких как Redmonk (#4) и Tiobe (#4). И что более важно, язык очень востребован работодателями. На графике ниже можно видеть (представлен Indeed), что Python — второй по этому показателю язык, что даёт вам возможность применить свои навыки программирования в работе.

Почему новичкам следует изучать Python

Легко отлаживать

Один из самых сложных навыков для новичка — это отладка. Именно здесь вы по-настоящему узнаёте язык и то, как он работает изнутри. Иногда у вас будут простые ошибки типа синтаксических, в других случаях они будут проявляться в 1 из 100 запусков вашей программы. Тут вам придётся ближе познакомиться со своим отладчиком и основными ошибками в языке. К счастью для вас, Python располагает хорошей системой обработки и отчётов об ошибках, чего нет у многих других языков.

Например, если что-то пойдёт на так в C++ (разыменование неправильного указателя, обращение к элементу вне массива и так далее), вам повезёт, если упадёт программа. В таком случае вы знаете, что где-то в ней есть проблема, но едва ли знаете где (а отладчики не всегда просты и понятны новичкам). Если вам не повезло и программа не упала (или падает в случайное время), вы получите непонятные и не очень очевидные ошибки.

Что не умеет делать Python

Окей, я не думал, что правильно написать статью про Python и не упомянуть о недостатках. Как и многие другие языки, он вовсе не совершенен, есть ряд вещей, для которых он неприменим.

Как я упоминал несколько раз, Python медленный. Точнее, очень медленный по сравнению с компилируемыми языками наподобие C, C++ или Go. Дело в том, что есть несколько особенностей, которые замедляют язык, вроде динамической типизации или сборщика мусора. Таким образом, не нужно использовать чистый Python для обработки больших массивов данных, вместо этого вам нужно добавить код на C++.

Из-за сборки мусора в Python’s его нельзя применять для систем реального времени. Причина в том, что она запускается в непредсказуемое время, так что вы не можете знать, займёт ли ваша функция 1 мс или 100 мс. Тут получается слишком много неизвестных. Вместо него для программ реального времени вам потребуется язык с ручным управлением памятью, такой как C или C++.

Поскольку потребляет много системных ресурсов и содержит интерпретатор, обычно можно (я говорю ‘обычно’, потому что есть другие варианты) запускать код на Python только под операционной системой (никаких микроконтроллеров и встроенных систем).

Вывод

Есть несколько причин, почему Python хорош для начинающих. Существует множество ресурсов для начинающих, так что не нужно много времени, чтобы начать программировать на Python.

Какой язык вы изучали первым и почему? Сообщите в комментариях!


2018-04-20T18:00:01
Программирование

Как проверить наличие файла или каталога в Python



























5/5 — (1 голос)

В программировании есть несколько способов решить задачу, и особенно это верно в Python. Вы не один раз обнаружите, что множество встроенных или стандартных модулей делают одно и то же, но с немного разной функциональностью. Проверка наличия файла или директории с использованием Python как раз из их числа.

Вот несколько способов проверить существование файлов/каталогов и их особенности. В этих примерах мы предположим, что наша текущая рабочая директория содержит эти файлы и каталоги:

drwxr-xr-x  3 scott  staff  102 Jan 12 10:01 dir

-rw-r--r--  1 scott  staff    5 Jan 12 09:56 file.txt

lrwxr-xr-x  1 scott  staff    8 Jan 12 09:56 link.txt -> file.txt

lrwxr-xr-x  1 scott  staff    3 Jan 12 10:00 sym -> dir


Заметьте, что у нас есть одна директория (dir), один файл (file.txt), одна символическая ссылка (симлинк) (link.txt) и одна ссылка на каталог (sym).

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

Это предположительно самый простой способ удостовериться, что файл существует и что это файл.

import os

os.path.isfile('./file.txt')    # True

os.path.isfile('./link.txt')    # True

os.path.isfile('./fake.txt')    # False

os.path.isfile('./dir')    # False

os.path.isfile('./sym')    # False

os.path.isfile('./foo')    # False


Обратите внимание, что os.path.isfile следит за симлинками, так что мы получаем True при проверке link.txt.

isfile, по сути, просто вспомогательный метод, который внутри использует os.stat и stat.S_ISREG(mode) , которые мы рассмотрим позже.

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

Как и метод isfile, os.path.isdir — самый лёгкий способ убедиться, что директория существует и соответствует указанному пути.

import os

os.path.isdir('./file.txt')    # False

os.path.isdir('./link.txt')    # False

os.path.isdir('./fake.txt')    # False

os.path.isdir('./dir')    # True

os.path.isdir('./sym')    # True

os.path.isdir('./foo')    # False


Вновь, как и isfile, os.path.isdir следит за симлинками. Это всего лишь простая оболочка вокруг os.stat и stat.S_ISDIR(mode), так что вы мало что получаете от этого, кроме удобства.

Проверка наличия файла или каталога

Другой способ проверить, есть ли путь (когда вам не так важно, на файл он указывает или на директорию) — применить os.path.exists.

import os

os.path.exists('./file.txt')    # True

os.path.exists('./link.txt')    # True

os.path.exists('./fake.txt')    # False

os.path.exists('./dir')    # True

os.path.exists('./sym')    # True

os.path.exists('./foo')    # False


Как видно, не имеет значения, на что указывает путь: на файл, на директорию, на симлинк, что похоже на isfile(path) или isdir(path). Но на самом деле, внутри метод пытается вызвать os.stat(path), и при получении ошибки он возвращает False.

Дополнительно

На протяжении статьи я упоминал, как все эти методы используют os.stat , поэтому я решил, что будет полезно взглянуть на него. Это низкоуровневый метод, который предоставит вам сведения о файлах, каталогах, сокетах, буферах и так далее.

Как и все остальные рассмотренные нами методы, os.stat следит за симлинками, так что если вы хотите получить информацию о ссылке, попробуйте вместо него метод os.lstat().

Поскольку все операционные системы различны, данные, полученные от метода os.stat, сильно отличаются. Вот некоторые данные, которыми располагает каждая операционная система:

  • st_mode: защитные биты
  • st_uid: пользовательский id владельца
  • st_gid: групповой id владельца
  • st_size: размер файла в байтах
  • st_atime: время ближайшего доступа
  • st_mtime: время ближайшего изменения
  • st_ctime: время ближайшего изменения метаданных в Unix, или время создания в Windows

Затем вы можете использовать эти данные с помощью модуля stat , чтобы получить интересующую информацию, например, указывает ли путь на сокет (stat.S_ISSOCK(mode)), или же это именованный канал (stat.S_ISFIFO(mode)).

Если вам нужна более продвинутая функциональность, вам следует идти именно сюда. Но в 90% случаев, когда вы обращаетесь с директориями и файлами, модули os или os.path содержат всё, что вам нужно.

Хотя есть один реальный пример, когда вы много раз тестируете один и тот же файл и хотите избежать слишком больших расходов при использовании системного вызова stat для каждого теста. Так что если нам надо сделать несколько тестов, это поможет вам решить задачу более эффективно.


2018-04-19T17:21:19
Программирование

Создание и удаление директорий с помощью Python



























5/5 — (3 голоса)

Эта статья продолжает нашу серию рассказов о взаимодействии с файловой системой в Python. В предыдущих разговор шёл о чтении и записи файлов. Любопытно, что файловая система — это гораздо больше, чем способ сохранять/извлекать данные на диск или с диска. Также есть разные типы объектов, такие как файлы, директории, сокеты (для межпроцессного взаимодействия), именованные каналы (pipes), как мягкие (символьные), так и жёсткие ссылки, а также специальные файлы устройств. Запись и чтение в них или из них делается примерно так же, как мы видели в предыдущих статьях.

Эта статья посвящена работе с директориями. Другие операционные системы, такие как UNIX/Linux, используют другую терминологию, где “папка” именуется “каталогом”. Далее мы вам покажем, как определить текущую рабочую директорию, как создать постоянную и временную, одиночную и вложенные структуры с подкаталогами, и как удалить директорию, если она больше не нужна. Здесь в игру вступают два модуля Python: os и tempfile.

Требуемые модули Python

Чтение и запись файлов не нуждаются в загрузке дополнительных модулей, но для доступ к функциям файловой системы (таким как управление директориями) требуется, чтобы мы использовали отдельный модуль. Во-первых, нужно загрузить модуль os. Он принадлежит к основной части экосистемы Python. Он подключается с помощью выражения:

import os


Модуль os содержит большинство методов, которые нам понадобятся на протяжении этой статьи. Хотя, как будет видно позже, если вы хотите чего-то более продвинутого, такого как создать временный файл для хранения данных, то нам также будет нужен модуль tempfile.

Определяем текущую рабочую директорию

Прежде чем мы возьмёмся за создание/удаление директорий, давайте посмотрим, как выполнять простейшие операции с директориями, например определять текущий рабочий каталог, используя метод getcwd(). Этот метод вернёт строку, содержащую путь к вашей рабочей директории. Листинг 1 показывает, как интегрировать этот метод в скрипт на Python.

# импорт модуля os

import os



# определяем текущий каталог и печатаем

path = os.getcwd()  

print ("Текущая рабочая директория %s" % path)


Листинг 1

Вывод должен выглядеть следующим образом:

$ python3 cwd.py

Текущая рабочая директория /home/sergey/


Более того, модуль os содержит дополнительный метод getcwdb(). Он похож на методgetcwd(), но в отличие от него нозвращает путь как двоичную строку.

Есть и некоторые другие операции с директориями, не затронутые в этой статье, такие как проверка наличия файла или каталога. Но сейчас перейдём к главной цели этой статьи.

Создание директории

Одиночная директория создаётся методом mkdir(). В качестве параметра mkdir() запрашивает путь к каталогу, чтобы создать его. Для примера рассмотрим код ниже:

import os



# определим имя директории, которую создаём

path = "/tmp/year"



try:

    os.mkdir(path)

except OSError:

    print ("Создать директорию %s не удалось" % path)

else:

    print ("Успешно создана директория %s " % path)


Листинг 2

Имейте в виду, что метод mkdir() не может создавать подкаталоги уровнем глубже первого за один вызов. Чтобы создать путь целиком, вам нужно вызвать mkdir() один раз для каждого уровня. Иначе, если вы хотите создать множество каталогов за один раз, воспользуйтесь вместо этого методом makedirs() (который вы можете увидеть в листинге 4 ниже).

В качестве вспомогательного параметра можно определить права доступа к директории внутри вызова mkdir(). Настройки по умолчанию суть 777, это означает, что читать и писать могут хозяин, члены группы и все остальные пользователи. Если вам нужны более строгие настройки, такие как 755, (доступно для чтения всем пользователям, права на запись есть только у хозяина), вы можете вызвать его так:

import os



# определим имя директории, которую создаём

path = "/tmp/year"



# define the access rights

access_rights = 0o755



try:

    os.mkdir(path, access_rights)

except OSError:

    print ("Создать директорию %s не удалось" % path)

else:

    print ("Успешно создана директория %s" % path)


Листинг 3

Вы могли заметить, что права доступа (в данном сдучае 755) определены через восьмеричный префикс (0o), так что вам не придётся переводить число в десятичный формат. Поскольку операционная система представляет права доступа в восьмеричном виде, мы их представим так же.

Хотя, как гласит документация Python, некоторые системы игнорируют параметр mode, вместо него следует использовать os.chmod.

Создание директории с подкаталогами

Как уже было упомянуто выше, метод mkdir()позволяет нам создать только одиночную директорию. Чтобы создать многоуровневые подкаталоги, приходит на помощь метод makedirs(). В самом деле, makedirs()имплементируется так, что он вызывает mkdir(), чтобы создавать директории одну за другой.

В качестве параметра makedirs()принимает путь целиком. Этот метод схож с командой UNIX/Linux mkdir -pЛистинг 4 показывает пример того, как его применять.

import os



# определим имя директории, которую создаём

path = "/tmp/year/month/week/day"



try:

    os.makedirs(path)

except OSError:

    print ("Создать директорию %s не удалось" % path)

else:

    print ("Успешно создана директория %s" % path)


Листинг 3

Созддание временной директории

До сих пор мы создавали постоянные элементы в файловой системе. По разным причинам, таким как временное хранение данных, может понадобиться иметь временный каталог. Модуль tempfile содержит методы, обрабатывающие подобые случаи безопасным и последовательным способом.

Листинг 5 показывает пример того, как используется метод  TemporaryDirectory()в комбинации с выражением with. После with временная директория больше не существует, потому что и каталог, и его содержимое полностью удалены.

import tempfile



# создаём временную директорию

with tempfile.TemporaryDirectory() as directory:

    print('Создана временная директория %s' % directory)



# каталог и его содержимое удалены


Листинг 5

Листинг 6 показывает вывод скрипта на Python из листинга 5. Чтобы создать временные файлы, в системах UNIX/Linux выбираются три директории /tmp, /var/tmp и /usr/tmp, и берётся первый подходящий каталог. В данном случае использутся /tmp.

$ python3 mkdir-temporary.py

Создана временная директория /tmp/tmpf6o0hy3c

Листинг 6

(в вашем случае, скорее всего, каталог будет называться по-другому – примечание)

Удаление директории

Это операция, противоположная её созданию. Вы можете это сделать, используя метод rmdir() из модуля os. rmdir() запрашивает путь в виде строки, содержащей имя каталога, и удаляет только самый глубокий элемент в строке пути. Заметьте, что это работает лишь тогда, когда директория совершенно пуста. Если же она не пуста, возбуждается исключение OSErrorЛистинг 7 показывает соответствующий код на Python.

import os



# определим имя директории, которую удаляем

path = "/tmp/year"



try:

    os.rmdir(path)

except OSError:

    print ("Удалить директорию %s не удалось" % path)

else:

    print ("Успешно удалена директория %s" % path)


Листинг 7

В случае, когда вы хотите удалить целое дерево каталогов, метод rmtree() из модуля shutil поможет вам в этом.

Вывод

Как вы уже моли заметить, работа с директориями в Python очень проста. От вас требуется лишь несколько строк кода, чтобы создать или удалить этот тип файловых объектов.


2018-04-18T14:30:30
Программирование

Чтение и запись списков в файл на Python



























5/5 — (4 голоса)

В качестве сериализованных структур данных программисты на Python активно используют массивы, списки и словари. Хранение этих структур данных постоянно требует файл или базу данных для работы с ними. Эта статья рассказывает, как печатать список в файл и как считать его обратно в память.

Чтобы записать данные в файл и считать их из файла, язык программирования Python предлагает стандартные методы write() and read() для работы с одиночными строками, а также writelines() и readlines() для работы с множеством строк. Более того, модули pickle и json module предоставляют разумные способы работы с сериализованными наборами данных.

Использование методов read и write

Основные методы отлично работают с символами (строками). Построчное сохранение списка в файл listfile.txt работает следующим образом:

# определим список мест

places = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']



with open('listfile.txt', 'w') as filehandle:  

    for listitem in places:

        filehandle.write('%sn' % listitem)


В строке 6 listitem дополнен символом разрыва строки “n”, во-первых, и сохранён в выходном файле, во-вторых. Как прочесть список полностью из файла listfile.txt обратно в память, покажет следующий код на Python:

# определим пустой список

places = []



# откроем файл и считаем его содержимое в список

with open('listfile.txt', 'r') as filehandle:

    for line in filehandle:

        # удалим заключительный символ перехода строки

        currentPlace = line[:-1]



        # добавим элемент в конец списка

        places.append(currentPlace)


Имейте в виду, что вам понадобится удалить перенос строки в самом её конце. Здесь нам помогает то, что Python позволяет применять списочные операции к строкам. В строке 8 кода выше удаление сделано просто как операция над самой строкой, что сохраняет всё, кроме последнего элемента. Он содержит символ “n”, обозначающий перенос строки в системах UNIX/Linux.

Использование методов writelines и readlines

Как упомянуто в начале этой статьи, Python также содержит два метода writelines() и readlines(), чтобы писать и читать множество строк за один шаг соответственно. Напечатать весь список в файл или на диск поможет следующий код на Python:

# определим список мест

places_list = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']



with open('listfile.txt', 'w') as filehandle:  

    filehandle.writelines("%sn" % place for place in places_list)


Прочитать весь список из файла на диске поможет следующий код на Python:

# определим пустой список

places = []



# откроем файл и считаем его содержимое в список

with open('listfile.txt', 'r') as filehandle:  

    filecontents = filehandle.readlines()



    for line in filecontents:

        # удалим заключительный символ перехода строки

        current_place = line[:-1]



        # добавим элемент в конец списка

        places.append(current_place)


Код выше показывает более традиционный подход, взятый из других языков программирования. Чтобы написать его в более “питоньем” стиле, посмотрим на код ниже:

# определим пустой список

places = []



# откроем файл и считаем его содержимое в список

with open('listfile.txt', 'r') as filehandle:  

    places = [current_place.rstrip() for current_place in filehandle.readlines()]


Открыв файл listfile.txt в строке 5, полностью переделываем список в строке 6. Сначала читаем содержимое файла через readlines(). Затем в цикле for удаляем окончание из каждой строки с помощью метода rstrip(). В конце добавляем строку к списку мест как новый элемент. По сравнению с прошлым листингом код получился более компактным, но его может быть сложнее прочесть начинающим программистам на Python.

Использование модуля pickle

Другие методы, объяснённые до сих пор, хранят список в читаемом для человека формате. В случае, когда это не нужно, вам может пригодиться модуль pickle. Его метод dump() эффективно хранит список в виде двоичного потока данных. В строке 7 (в коде ниже) выходной файл listfile.data открыт для записи в двоичном режиме (“wb”). В строке 9 список хранится в открытом файле с использованием метода dump().

# загружаем дополнительный модуль

import pickle



# определим список мест

placesList = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']



with open('listfile.data', 'wb') as filehandle:

    # сохраняем данные как двоичный поток

    pickle.dump(placesList, filehandle)


На следующем шаге мы читаем список из файла. Сначала открываем выходной файл listfile.data для чтения в двоичном режиме (“rb”) в строке 4. Потом загружаем список мест из файла, применяя метод load().

# загружаем дополнительный модуль

import pickle



with open('listfile.data', 'rb') as filehandle:  

    # сохраняем данные как двоичный поток

    placesList = pickle.load(filehandle)


Эти два примера показывают использование строк. Кстати, pickle работает со всеми видами объектов языка Python, такими как строки, числа, определённые в самом коде структуры, а также любые другие встроенные структуры данных Python.

Использование формата JSON

Используемый pickle формат двоичных данных специфичен для Python. Чтобы улучшить взаимодействие между различными программами, JavaScript Object Notation (JSON) предлагает лёгкую в использовании и читаемую для человека схему, и поэтому стал очень популярным.

Следующий пример показывает, как печатать список из элементов различных типов в выходной файл с помощью модуля json. В строке 4 определён основной список. Имея открытым файлом для записи в строке 7, метод dump() хранит основной список в файле, используя JSON.

import json



# определим список со значениями

basicList = [1, "Cape Town", 4.6]



# открываем выходной файл для записи

with open('listfile.txt', 'w') as filehandle:  

    json.dump(basicList, filehandle)


Читать содержимое выходноо файла обратно в память так же просто, как записывать данные. Соответствующий dump() метод называется load() и работает следующим образом:

import json



# открываем выходной файл для чтения

with open('listfile.txt', 'r') as filehandle:  

    basicList = json.load(filehandle)


Вывод

Методы, показаные выше, разнятся от простой записи/чтенияя данных до сброса/загрузки через двоичные потоки с помощью pickle и JSON. Это значительно упрощает хранение списка и чтение его обратно в память.


2018-04-17T12:00:28
Программирование