С помощью текстового редактора создайте файл, содержащий текст, длина которого не превышает 1000
Обновлено: 21.11.2024
Дана последовательность слов и ограничение на количество символов, которые можно поместить в одну строку (ширина строки). Ставьте разрывы строк в заданной последовательности так, чтобы строки печатались аккуратно. Предположим, что длина каждого слова меньше ширины строки.
Текстовые процессоры, такие как MS Word, выполняют задачу размещения разрывов строк. Идея состоит в том, чтобы иметь сбалансированные линии. Другими словами, не должно быть несколько строк с большим количеством лишних пробелов и несколько строк с небольшим количеством лишних пробелов.
Обратите внимание, что функция общей стоимости представляет собой не сумму дополнительных пробелов, а сумму кубов (или квадратов) дополнительных пробелов. Идея этой функции стоимости состоит в том, чтобы сбалансировать пробелы между строками. Например, рассмотрим следующие два расположения одного и того же набора слов:
1) Есть 3 строки. В одной строке 3 лишних пробела, а во всех остальных строках 0 лишних пробелов. Всего дополнительных пробелов = 3 + 0 + 0 = 3. Общая стоимость = 3*3*3 + 0*0*0 + 0*0*0 = 27.
2) Есть 3 строки. Каждая из 3 строк имеет один дополнительный пробел. Всего дополнительных мест = 1 + 1 + 1 = 3. Общая стоимость = 1*1*1 + 1*1*1 + 1*1*1 = 3.
Всего дополнительных мест 3 в обоих сценариях, но второе расположение должно быть предпочтительным, потому что дополнительные пробелы сбалансированы во всех трех строках. Функция стоимости с кубической суммой служит цели, поскольку значение общей стоимости во втором сценарии меньше.
Метод 1 (жадное решение)
Жадное решение состоит в том, чтобы поместить как можно больше слов в первую строку. Затем проделайте то же самое для второй строки и так далее, пока не будут размещены все слова. Это решение дает оптимальное решение для многих случаев, но не дает оптимального решения во всех случаях. Например, рассмотрим следующую строку «aaa bb cc ddddd» и ширину строки 6. Жадный метод выдаст следующий результат.
Дополнительные пробелы в трех строках выше — это 0, 4 и 1 соответственно. Таким образом, общая стоимость равна 0 + 64 + 1 = 65.
Но приведенное выше решение — не лучшее решение. Следующая аранжировка имеет более сбалансированные пространства. Следовательно, меньше значение функции общих затрат.
Метод 2 (рекурсивный подход с запоминанием)
Проблему можно решить с помощью подхода "разделяй и властвуй" (рекурсивного). Алгоритм для того же упомянут ниже:
Система автоматически обрабатывает все инициированные пользователем текстовые операции и уведомляет приложение о завершении операций.
В следующих разделах обсуждаются инициированные пользователем текстовые операции и ответ приложения:
Выбор элемента управления Edit
Пользователь может выбрать элемент управления редактированием, щелкнув его мышью или нажав клавишу TAB, чтобы перейти к нему. Метод табуляции является частью предопределенного интерфейса клавиатуры, предоставляемого системой. Полное описание этого интерфейса см. в разделе Диалоговые окна. Когда пользователь выбирает элемент управления редактированием, система выделяет элементу управления фокус клавиатуры (см. «Фокус клавиатуры и активация» в разделе «О вводе с клавиатуры») и выделяет его текст с помощью обратного видео.
Настройка и получение текста
Приложение может установить текст элемента управления редактирования, используя функцию SetWindowText, функцию SetDlgItemText или отправив элементу управления сообщение WM_SETTEXT.
Чтобы извлечь весь текст из элемента управления редактированием, сначала используйте функцию GetWindowTextLength или сообщение WM_GETTEXTLENGTH, чтобы определить размер буфера, необходимого для хранения текста. Затем извлеките текст с помощью функции GetWindowText, функции GetDlgItemText или сообщения WM_GETTEXT.
Выделение текста
После выбора элемента управления редактирования пользователь может выделить текст в элементе управления с помощью мыши или клавиатуры. Приложение может получить начальные и конечные позиции символов текущего выделения в элементе управления редактирования, отправив элементу управления сообщение EM_GETSEL. Возвращаемое значение для конечной позиции на единицу больше, чем последний символ в выборе (то есть позиция первого символа, следующего за последним выбранным символом).
Приложение также может выбрать текст в элементе управления редактирования, отправив элементу управления сообщение EM_SETSEL с начальным и конечным индексами символов для выделения. Например, приложение может использовать EM_SETSEL с EM_REPLACESEL для удаления текста из элемента управления редактированием.
Эти три сообщения относятся как к однострочным, так и к многострочным элементам редактирования.
Замена текста
Приложение может заменить выделенный текст в элементе редактирования, отправив элементу управления сообщение EM_REPLACESEL с указателем на замещающий текст. Если текущего выделения нет, EM_REPLACESEL вставляет замещающий текст в точку вставки. Приложение может получить код уведомления EN_ERRSPACE, если замещающий текст превышает доступную память. Это сообщение относится как к однострочным, так и к многострочным элементам редактирования.
Приложение может использовать EM_REPLACESEL для замены части текста элемента управления редактирования или функцию SetDlgItemText для замены всего текста.
Изменение шрифта, используемого элементом управления Edit
Приложение может изменить шрифт, используемый элементом управления редактированием, отправив сообщение WM_SETFONT. Большинство приложений делают это при обработке сообщения WM_INITDIALOG. Изменение шрифта не меняет размер элемента управления редактирования; приложениям, отправляющим сообщение WM_SETFONT, возможно, придется получить метрики шрифта для текста и пересчитать размер элемента управления редактированием. Дополнительную информацию о шрифтах и метриках шрифтов см. в разделе Шрифты и текст.
Вырезать, Копировать, Вставить и Очистить Операции
Есть четыре сообщения для перемещения текста между элементом управления редактированием и буфером обмена. Сообщение WM_COPY копирует текущий выбор (если есть) из элемента управления редактирования в буфер обмена, не удаляя его из элемента управления редактирования. Сообщение WM_CUT удаляет текущий выбор (если есть) в элементе редактирования и копирует удаленный текст в буфер обмена. Сообщение WM_CLEAR удаляет текущий выбор (если есть) из элемента управления редактирования, но не копирует его в буфер обмена (если только пользователь не нажал клавишу SHIFT). Сообщение WM_PASTE копирует текст из буфера обмена в элемент управления редактирования в точке вставки. Эти четыре сообщения относятся как к однострочным, так и к многострочным элементам редактирования.
Microsoft Windows NT 4.0 и более поздние версии: элемент управления редактированием включает встроенное контекстное меню, которое позволяет пользователю легко перемещать текст между элементом управления редактированием и буфером обмена. Контекстное меню появляется, когда пользователь щелкает элемент управления правой кнопкой мыши. Команды контекстного меню включают «Отменить», «Вырезать», «Копировать», «Вставить», «Удалить» и «Выбрать все».
Изменение текста
Пользователь может выбирать, удалять или перемещать текст в элементе редактирования. Система поддерживает внутренний флаг для каждого элемента управления редактированием, указывающий, было ли изменено содержимое элемента управления. Система сбрасывает этот флаг при создании элемента управления и устанавливает флаг всякий раз, когда изменяется текст в элементе управления. Приложение может получить флаг модификации, отправив элементу управления сообщение EM_GETMODIFY. Затем приложение может установить или очистить флаг модификации, отправив элементу управления сообщение EM_SETMODIFY. Эти сообщения относятся как к однострочным, так и к многострочным элементам редактирования.
Ограничение вводимого пользователем текста
Ограничение по умолчанию на объем текста, который пользователь может ввести в поле редактирования, составляет 32 КБ. Приложение может изменить ограничение по умолчанию, отправив элементу управления сообщение EM_SETLIMITTEXT. Это сообщение устанавливает жесткое ограничение на количество байтов, которое пользователь может ввести в элемент управления редактирования, но не влияет ни на текст, который уже был в элементе управления на момент отправки сообщения, ни на текст, скопированный в элемент управления функцией SetDlgItemText или сообщением WM_SETTEXT. Например, предположим, что приложение использует функцию SetDlgItemText для размещения 500 байтов в элементе управления редактированием, и пользователь также вводит 500 байтов (всего 1000 байтов). Если затем приложение отправляет сообщение EM_SETLIMITTEXT, ограничивающее введенный пользователем текст 300 байтами, 1000 байтов, уже находящихся в элементе управления редактированием, остаются там, и пользователь не может добавить больше текста. С другой стороны, если приложение отправляет сообщение EM_SETLIMITTEXT, ограничивающее вводимый пользователем текст 1300 байтами, 1000 байтов остаются, но пользователь может добавить еще 300 байтов.
Когда пользователь достигает предела символов элемента управления редактированием, система отправляет приложению сообщение WM_COMMAND, содержащее код уведомления EN_MAXTEXT. Этот код уведомления означает не то, что память исчерпана, а то, что достигнут предел для введенного пользователем текста; пользователь больше не может вводить текст. Чтобы изменить это ограничение, приложение должно отправить элементу управления новое сообщение EM_SETLIMITTEXT с более высоким ограничением.
В качестве примера использования EM_SETLIMITTEXT и EN_MAXTEXT предположим, что приложение должно ограничить пользователя не более чем четырьмя символами в элементе управления редактированием. Приложение будет использовать EM_SETLIMITTEXT, чтобы указать ограничение в четыре символа. Если пользователь попытается ввести пятый символ, система отправит приложению код уведомления EN_MAXTEXT.
Операции с персонажами и линиями
Есть несколько сообщений, которые возвращают информацию о символах и строках в элементе управления редактированием. Большинство сообщений возвращают индекс, обычно число, начинающееся с нуля, для ссылки на символ или строку. Например, в однострочном элементе управления редактированием, который содержит n символов, индекс строки равен нулю, а символы индексируются от нуля до n-1. В многострочном элементе управления редактированием, который содержит m строк и n символов, строки индексируются от нуля до m-1, а символы индексируются от нуля до n-1. Обратите внимание, что индексация символов игнорирует разрывы строк.
Приложение может определить количество символов в элементе управления, отправив сообщение WM_GETTEXTLENGTH в элемент управления.Это сообщение возвращает длину в символах (не включая завершающий нулевой символ) текста в однострочном или многострочном элементе управления редактированием. Сообщение EM_LINELENGTH возвращает длину строки в символах, заданную индексом символа в строке. Возвращаемая длина не включает выбранные символы. Приложение может использовать эти сообщения в однострочном или многострочном элементе управления редактированием.
Сообщение EM_GETFIRSTVISIBLELINE возвращает отсчитываемый от нуля индекс самой верхней видимой строки в многострочном элементе редактирования или отсчитываемый от нуля индекс первого видимого символа в однострочном элементе редактирования. Приложение может скопировать строку из элемента управления редактированием в буфер, отправив сообщение EM_GETLINE в элемент управления редактированием. Строка определяется своим индексом строки, а первое слово принимающего буфера содержит максимальное количество байтов, которые должны быть скопированы в буфер. Возвращаемое значение — это количество скопированных байтов. Это сообщение также можно использовать в однострочном или многострочном элементе управления редактированием.
Для возврата информации о строке в многострочном элементе редактирования доступны уникальные сообщения. Сообщение EM_GETLINECOUNT возвращает количество строк в элементе редактирования. Сообщение EM_LINEFROMCHAR возвращает индекс строки, содержащей указанный индекс символа. Сообщение EM_LINEINDEX возвращает индекс первого символа в указанной строке.
Прокрутка текста в элементе управления Edit
Чтобы реализовать прокрутку в элементе управления редактированием, вы можете использовать стили автоматической прокрутки, описанные в разделе Типы и стили элемента управления редактированием, или вы можете явно добавить полосы прокрутки в элемент управления редактированием. Чтобы добавить горизонтальную полосу прокрутки, используйте стиль WS_HSCROLL; чтобы добавить вертикальную полосу прокрутки, используйте стиль WS_VSCROLL. Элемент управления редактирования с полосами прокрутки обрабатывает свои собственные сообщения полосы прокрутки. Подробную информацию о добавлении полос прокрутки в элементы управления редактированием см. в разделе Полосы прокрутки.
Система предоставляет три сообщения, которые приложение может отправить элементу управления с полосами прокрутки. Сообщение EM_LINESCROLL может прокручивать многострочный элемент управления как по вертикали, так и по горизонтали. Параметр lParam указывает количество строк для прокрутки по вертикали, начиная с текущей строки, а параметр wParam указывает количество символов для прокрутки по горизонтали, начиная с текущего символа. Элемент управления редактированием не подтверждает сообщения о горизонтальной прокрутке, если он имеет стиль ES_CENTER или ES_RIGHT. Сообщение EM_LINESCROLL применяется только к элементам многострочного редактирования.
Сообщение EM_SCROLL прокручивает многострочный элемент управления по вертикали. Параметр wParam указывает действие прокрутки. Сообщение EM_SCROLL применяется только к элементам многострочного редактирования. EM_SCROLL имеет тот же эффект, что и сообщение WM_VSCROLL.
Сообщение EM_SCROLLCARET прокручивает курсор в поле ввода.
Настройка позиций табуляции и полей
Приложение может устанавливать позиции табуляции в многострочном элементе управления с помощью сообщения EM_SETTABSTOPS. (По умолчанию для позиции табуляции используется восемь символов.) Когда приложение добавляет текст в поле редактирования, символы табуляции в тексте автоматически создают пробел до следующей позиции табуляции. Сообщение EM_SETTABSTOPS не заставляет систему автоматически перерисовывать текст. Для этого приложение может вызвать функцию InvalidateRect. Сообщение EM_SETTABSTOPS применяется только к элементам многострочного редактирования.
Приложение может установить ширину левого и правого полей для элемента управления редактированием с помощью сообщения EM_SETMARGINS. После отправки этого сообщения система перерисовывает элемент управления редактированием, чтобы отразить новые настройки полей. Приложение может получить ширину левого или правого поля, отправив сообщение EM_GETMARGINS. По умолчанию поля элемента управления редактированием установлены достаточно широкими, чтобы вместить самый большой горизонтальный выступ символа (отрицательная ширина ABC) для текущего шрифта, используемого в элементе управления редактированием.
Скрытие пользовательского ввода
Приложение может использовать символ пароля в элементе управления редактированием, чтобы скрыть ввод данных пользователем. Когда установлен символ пароля, он отображается вместо каждого символа, который вводит пользователь. Когда символ пароля удаляется, элемент управления отображает символы, которые вводит пользователь. Если приложение создает однострочный элемент управления с использованием стиля ES_PASSWORD, символом пароля по умолчанию является звездочка (*). Приложение может использовать сообщение EM_SETPASSWORDCHAR для удаления или определения другого символа пароля и сообщение EM_GETPASSWORDCHAR для получения текущего символа пароля. Эти сообщения относятся только к однострочным элементам редактирования.
Использование целых чисел
Существуют две функции целочисленного преобразования для элементов управления редактирования, которые содержат только числа. Функция SetDlgItemInt создает строковое представление указанного целого числа (со знаком или без знака) и отправляет строку в элемент управления редактированием. SetDlgItemInt не возвращает значения.Функция GetDlgItemInt создает целое число (со знаком или без знака) из его строкового представления в элементе управления редактированием. GetDlgItemInt возвращает целое число (или значение ошибки).
Отмена текстовых операций
Каждый элемент управления редактированием поддерживает флаг отмены, указывающий, может ли приложение отменить или отменить самую последнюю операцию над элементом управления редактированием (например, отмену удаления текста). Элемент управления редактированием устанавливает флаг отмены, чтобы указать, что операцию можно отменить, и сбрасывает его, чтобы указать, что операцию нельзя отменить. Приложение может определить установку флага отмены, отправив элементу управления сообщение EM_CANUNDO.
Приложение может отменить самую последнюю операцию, отправив элементу управления сообщение EM_UNDO. Операция может быть отменена при условии, что перед ней не выполняется другая операция управления редактированием. Например, пользователь может удалить текст, заменить текст (отменить удаление), а затем снова удалить текст (отменить замену). Сообщение EM_UNDO применяется как к однострочным, так и к многострочным элементам управления и всегда работает для однострочных элементов управления.
Приложение может сбросить флаг отмены элемента управления редактирования, отправив элементу управления сообщение EM_EMPTYUNDOBUFFER. Система автоматически сбрасывает флаг отмены всякий раз, когда элемент управления редактирования получает сообщение EM_SETHANDLE или WM_SETTEXT. Функция SetDlgItemText отправляет сообщение WM_SETTEXT.
Обработка переноса слов и разрывов строк
Приложение может использовать функции Wordwrap с элементами управления многострочным редактированием, чтобы определить местонахождение слова или фрагмента слова, которые должны быть перенесены на следующую строку. Используя функцию Wordwrap по умолчанию, предоставляемую системой, строки всегда заканчиваются пробелами между словами. Приложение может указать свою собственную функцию Wordwrap, предоставив функцию Wordwrap EditWordBreakProc и отправив элементу управления редактированием сообщение EM_SETWORDBREAKPROC. Приложение может получить адрес текущей функции Wordwrap, отправив элементу управления сообщение EM_GETWORDBREAKPROC.
Приложение может дать команду многострочному элементу управления для автоматического добавления или удаления мягкого символа разрыва строки (два возврата каретки и перевод строки) в конце строк с переносом текста. Приложение может включить или выключить эту функцию, отправив элементу управления сообщение EM_FMTLINES. Это сообщение применяется только к элементам управления многострочным редактированием и не влияет на строку, которая заканчивается жестким разрывом строки (один возврат каретки и перевод строки, введенный пользователем). Также в многострочных элементах управления редактированием приложение может указать стиль ES_WANTRETURN, чтобы запрашивать, чтобы система вставляла возврат каретки, когда пользователь нажимает клавишу ENTER в элементе управления редактированием.
Получение точек и символов
Чтобы определить символ, ближайший к указанной точке в клиентской области элемента управления редактирования, отправьте элементу управления сообщение EM_CHARFROMPOS. Сообщение возвращает индекс символа и индекс строки символа, ближайшего к точке. Точно так же вы можете получить координаты клиентской области указанного персонажа, отправив сообщение EM_POSFROMCHAR. Сообщение возвращает координаты x и y левого верхнего угла указанного символа.
Автозаполнение строк
Автодополнение преобразует строки, которые были частично введены в элемент управления редактированием, в полные строки. Например, когда пользователь начинает вводить URL-адрес в поле редактирования адреса, встроенном в панель инструментов Windows Internet Explorer, функция автозаполнения расширяет строку до одного или нескольких полных URL-адресов, которые согласуются с существующей частичной строкой. Неполная строка URL-адреса, такая как «микрофон», может быть расширена до «https://www.microsoft.com» или «https://www.microsoft.com/windows». Автодополнение обычно используется с элементами управления редактированием или с элементами управления, имеющими встроенный элемент управления редактированием.
Сложный скрипт в элементах управления редактированием
Сложный сценарий – это язык, печатная форма которого не имеет простого оформления. Например, сложный скрипт может допускать двунаправленную визуализацию, контекстное формирование глифов или комбинирование символов. Стандартные элементы управления редактированием были расширены для поддержки многоязычного текста и сложных сценариев. Это включает не только ввод и отображение, но и правильное перемещение курсора по кластерам символов (например, в тайском письме и сценарии деванагари).
Хорошо написанное приложение получает эту поддержку автоматически, без изменений. Опять же, вам следует подумать о добавлении поддержки порядка чтения справа налево и выравнивания по правому краю. В этом случае переключите флаги расширенного стиля окна управления редактированием, чтобы управлять этими атрибутами, как показано в следующем примере.
После установки значения lAlign включите новое отображение, установив расширенный стиль окна управления редактированием следующим образом.
Uniscribe – это еще один набор функций, обеспечивающих точное управление обработкой сложных скриптов. Дополнительную информацию см. в разделе Uniscribe.
Теперь мы знаем, как просматривать файлы и каталоги, но как их создавать?
В этом выпуске мы узнаем о создании и перемещении файлов и каталогов на примере каталога для упражнений/записи.
Шаг первый: посмотрите, где мы находимся и что у нас уже есть
Мы по-прежнему должны находиться в каталоге shell-lesson-data на рабочем столе, что мы можем проверить, используя:
Далее мы перейдем в каталог для упражнений/записи и посмотрим, что в нем содержится:
Создать каталог
Давайте создадим новый каталог с именем thesis с помощью команды mkdir thesis (у которой нет вывода):
Как можно догадаться по названию, mkdir означает «создать каталог». Поскольку тезис является относительным путем (т. е. не имеет начального слэша, например /what/ever/thesis ), новый каталог создается в текущем рабочем каталоге:
Поскольку мы только что создали каталог тезисов, в нем еще ничего нет:
Обратите внимание, что mkdir не ограничивается созданием отдельных каталогов по одному. Параметр -p позволяет mkdir создать каталог с вложенными подкаталогами за одну операцию:
Опция -R команды ls отобразит список всех вложенных подкаталогов внутри каталога. Давайте используем ls -FR для рекурсивного отображения новой иерархии каталогов, которую мы только что создали в каталоге проекта:
Два способа сделать одно и то же
Использование оболочки для создания каталога ничем не отличается от использования проводника. Если вы откроете текущий каталог с помощью графического проводника вашей операционной системы, каталог тезисов также появится там. Хотя оболочка и файловый менеджер — это два разных способа взаимодействия с файлами, сами файлы и каталоги одинаковы.
Хорошие имена для файлов и каталогов
Не используйте пробелы.
Пробелы могут сделать имя более осмысленным, но, поскольку пробелы используются для разделения аргументов в командной строке, лучше избегать их в именах файлов и каталоги. Вместо этого вы можете использовать - или _ (например, north-pacific-gyre/ , а не north pacific gyre/ ). Чтобы проверить это, попробуйте ввести mkdir north pacific gyre и посмотрите, какой каталог (или каталоги!) создается при проверке с помощью ls -F .
Не начинайте имя с - (тире).
Команды рассматривают имена, начинающиеся с -, как параметры.
Наклеивайте буквы, цифры, . (точка или точка), - (тире) и _ (подчеркивание).
Многие другие символы имеют особое значение в командной строке. О некоторых из них мы узнаем на этом уроке. Существуют специальные символы, которые могут привести к неправильной работе вашей команды и даже к потере данных.
Создать текстовый файл
Давайте изменим наш рабочий каталог на thesis с помощью cd , затем запустим текстовый редактор Nano, чтобы создать файл с именем draft.txt :
Какой редактор?
Когда мы говорим, что nano — это текстовый редактор, мы на самом деле имеем в виду текст: он может работать только с простыми символьными данными, а не с таблицами, изображениями или любым другим удобным для человека носителем. Мы используем его в примерах, потому что это один из наименее сложных текстовых редакторов. Однако из-за этой особенности он может быть недостаточно мощным или достаточно гибким для работы, которую вам нужно будет выполнить после этого семинара. В системах Unix (таких как Linux и macOS) многие программисты используют Emacs или Vim (на изучение обоих требуется больше времени) или графический редактор, такой как Gedit. В Windows вы можете использовать Notepad++. В Windows также есть встроенный редактор под названием «Блокнот», который можно запустить из командной строки так же, как и nano для целей этого урока.
Независимо от того, какой редактор вы используете, вам необходимо знать где он ищет и сохраняет файлы. Если вы запустите его из оболочки, он (вероятно) будет использовать ваш текущий рабочий каталог в качестве местоположения по умолчанию. Если вы используете меню «Пуск» вашего компьютера, вместо этого он может захотеть сохранить файлы на рабочем столе или в каталоге документов. Вы можете изменить это, перейдя в другой каталог при первом нажатии кнопки «Сохранить как…»
Давайте напечатаем несколько строк текста. Как только мы довольны нашим текстом, мы можем нажать Ctrl + O (нажмите клавишу Ctrl или Control и, удерживая ее, нажмите клавишу O), чтобы записать наши данные на диск (нас спросят, какой файл мы хотим чтобы сохранить это в: нажмите клавишу «Ввод», чтобы принять предложенный по умолчанию вариант draft.txt ).
После того, как наш файл будет сохранен, мы можем использовать Ctrl + X, чтобы выйти из редактора и вернуться в оболочку.
Control, Ctrl или клавиша ^
- Control-X
- Control+X
- Ctrl + X
- Ctrl+X
- ^X
- C-x
nano не оставляет никаких выводов на экране после выхода, но теперь ls показывает, что мы создали файл с именем draft.txt :
Создание файлов другим способом
Мы увидели, как создавать текстовые файлы с помощью редактора nano. Теперь попробуйте следующую команду:
Что сделала сенсорная команда?Когда вы просматриваете свой текущий каталог с помощью проводника файлов с графическим интерфейсом, отображается ли файл?
Используйте ls -l для проверки файлов. Насколько велик my_file.txt?
В каких случаях вам может понадобиться создать файл таким образом?
Решение
Команда touch создает новый файл с именем my_file.txt в вашем текущем каталоге. Вы можете просмотреть этот вновь сгенерированный файл, набрав ls в командной строке. my_file.txt также можно просмотреть в проводнике файлов с графическим интерфейсом.
При проверке файла с помощью ls -l обратите внимание, что размер файла my_file.txt равен 0 байт. Другими словами, он не содержит данных. Если вы откроете файл my_file.txt в текстовом редакторе, он будет пустым.
Некоторые программы сами не создают выходные файлы, а вместо этого требуют, чтобы уже были созданы пустые файлы. Когда программа запускается, она ищет существующий файл для заполнения выходными данными. Команда touch позволяет эффективно создавать пустой текстовый файл для использования такими программами.
Что в имени?
Возможно, вы заметили, что все файлы Нелле называются "something dot something", и в этой части урока мы всегда использовали расширение .txt . Это всего лишь соглашение: мы можем назвать файл mythesis или почти что угодно. Тем не менее, большинство людей большую часть времени используют имена, состоящие из двух частей, чтобы помочь им (и их программам) различать разные типы файлов. Вторая часть такого имени называется расширением имени файла и указывает, какой тип данных содержит файл: .txt указывает на обычный текстовый файл, .pdf указывает на PDF-документ, .cfg — это файл конфигурации, полный параметров для какой-либо программы или другое, .jpg — изображение в формате PNG и т. д.
Это всего лишь условное обозначение, хотя и важное. Файлы содержат байты: мы и наши программы должны интерпретировать эти байты в соответствии с правилами для простых текстовых файлов, документов PDF, файлов конфигурации, изображений и т. д.
Именование PNG-изображения кита поскольку whit.mp3 каким-то волшебным образом не превращает его в запись песни кита, хотя может заставить операционную систему попытаться открыть его с помощью музыкального проигрывателя, когда кто-то дважды щелкнет по нему. р>
Перемещение файлов и каталогов
Возвращаясь к каталогу shell-lesson-data/writing,
В нашем каталоге тезисов у нас есть файл draft.txt, имя которого не особенно информативно, поэтому давайте изменим имя файла, используя mv, сокращение от «move»:
Первый аргумент сообщает mv, что мы «перемещаем», а второй — куда это должно двигаться. В этом случае мы перемещаем thesis/draft.txt в thesis/quotes.txt, что имеет тот же эффект, что и переименование файла. Действительно, ls показывает нам, что тезис теперь содержит один файл с именем quotes.txt:
Нужно быть осторожным при указании имени целевого файла, так как mv молча перезапишет любой существующий файл с таким же именем, что может привести к потере данных. Дополнительный параметр mv -i (или mv --interactive ) можно использовать, чтобы заставить mv запрашивать подтверждение перед перезаписью.
Обратите внимание, что mv также работает с каталогами.
Давайте переместим файл quotes.txt в текущий рабочий каталог. Мы снова используем mv, но на этот раз мы будем использовать только имя каталога в качестве второго аргумента, чтобы сообщить mv, что мы хотим сохранить имя файла, но поместим файл в новое место. (Вот почему команда называется «переместить».) В этом случае имя каталога, которое мы используем, является специальным именем каталога. о которых мы упоминали ранее.
В результате файл перемещается из каталога, в котором он находился, в текущий рабочий каталог. ls теперь показывает нам, что тезис пуст:
Кроме того, мы можем подтвердить, что файл quotes.txt больше не присутствует в каталоге тезисов, явно попытавшись указать его в списке:
ls с именем файла или каталога в качестве аргумента выводит только запрошенный файл или каталог. Если файл, указанный в качестве аргумента, не существует, оболочка возвращает ошибку, как мы видели выше. Мы можем использовать это, чтобы увидеть, что файл quotes.txt теперь присутствует в нашем текущем каталоге:
Перемещение файлов в новую папку
После выполнения следующих команд Джейми понимает, что поместила файлы sucrose.dat и maltose.dat не в ту папку. Файлы должны были быть помещены в папку raw.
Заполните пробелы, чтобы переместить эти файлы в папку raw/ (то есть в ту, куда она забыла их положить)
Решение
Напоминаем, что .. относится к родительскому каталогу (т. е. каталогу выше текущего), а . относится к текущему каталогу.
Копирование файлов и каталогов
Команда cp очень похожа на mv, за исключением того, что она копирует файл, а не перемещает его. Мы можем проверить, правильно ли он поступил, используя ls с двумя путями в качестве аргументов — как и большинству команд Unix, ls можно указать сразу несколько путей:
Мы также можем скопировать каталог и все его содержимое, используя рекурсивную опцию -r , например для резервного копирования каталога:
Мы можем проверить результат, перечислив содержимое папки thesis и thesis_backup:
Переименование файлов
- cp statstics.txt Statistics.txt
- mv statstics.txt stats.txt
- mv statstics.txt .
- cp statstics.txt.
Решение
- Нет. Хотя при этом будет создан файл с правильным именем, файл с неправильным именем все еще существует в каталоге, и его необходимо удалить.
- Да, переименовать файл можно.
- Нет, точка (.) указывает, куда переместить файл, но не дает нового имени файла; одинаковые имена файлов не могут быть созданы.
- Нет, точка (.) указывает, куда копировать файл, но не дает нового имени файла; одинаковые имена файлов не могут быть созданы.
Перемещение и копирование
Что выводит закрывающая команда ls в показанной ниже последовательности?
- белки-сохраненные.dat рекомбинированы
- воссоединено
- белки.dat рекомбинированы
- proteins-saved.dat
Решение
- Нет, см. объяснение выше. .profiles-saved.dat находится в папке /Users/jamie
- Да
- Нет, см. объяснение выше. .projects.dat находится в папке /Users/jamie/data/recombined
- Нет, см. объяснение выше. .profiles-saved.dat находится в папке /Users/jamie
Удаление файлов и каталогов
Возвращаясь к каталогу shell-lesson-data/writing, давайте наведем порядок в этом каталоге, удалив созданный нами файл quotes.txt. Для этого мы будем использовать команду Unix — rm (сокращение от «удалить»):
Мы можем подтвердить, что файл исчез, используя ls :
Удаление навсегда
В оболочке Unix нет корзины для мусора, из которой мы можем восстановить удаленные файлы (хотя в большинстве графических интерфейсов Unix она есть). Вместо этого, когда мы удаляем файлы, они отсоединяются от файловой системы, чтобы их место на диске можно было использовать повторно. Инструменты для поиска и восстановления удаленных файлов существуют, но нет гарантии, что они сработают в той или иной конкретной ситуации, поскольку компьютер может сразу же освободить место на диске файла.
Безопасное использование rm
Что происходит, когда мы выполняем команду rm -i thesis_backup/quotations.txt? Зачем нам нужна эта защита при использовании rm ?
Решение
Опция -i будет запрашивать перед (каждым) удалением (используйте Y, чтобы подтвердить удаление, или N, чтобы сохранить файл). Оболочка Unix не имеет корзины для мусора, поэтому все удаленные файлы исчезнут навсегда. С помощью параметра -i у нас есть возможность убедиться, что мы удаляем только те файлы, которые хотим удалить.
Если мы попытаемся удалить каталог тезисов с помощью rm thesis , мы получим сообщение об ошибке:
Это происходит потому, что rm по умолчанию работает только с файлами, а не с каталогами.
rm может удалить каталог и все его содержимое, если мы используем рекурсивную опцию -r , и он сделает это без каких-либо запросов на подтверждение:
Учитывая, что нет возможности восстановить файлы, удаленные с помощью оболочки, rm -r следует использовать с большой осторожностью (можно рассмотреть возможность добавления интерактивной опции rm -r -i ). р>
Операции с несколькими файлами и каталогами
Часто бывает необходимо скопировать или переместить несколько файлов одновременно. Это можно сделать, указав список имен отдельных файлов или указав шаблон именования с помощью подстановочных знаков.
Копировать с несколькими именами файлов
В этом упражнении вы можете протестировать команды в каталоге shell-lesson-data/exercise-data.
В приведенном ниже примере что делает cp, если задано несколько имен файлов и имя каталога?
В приведенном ниже примере что делает cp, если задано три или более имен файлов?
Решение
Если задано более одного имени файла, за которым следует имя каталога (т. е. каталог назначения должен быть последним аргументом), cp копирует файлы в указанный каталог.
Если задано три имени файла, cp выдает ошибку, подобную приведенной ниже, поскольку в качестве последнего аргумента ожидается имя каталога.
Использование подстановочных знаков для одновременного доступа к нескольким файлам
Подстановочные знаки
* — это подстановочный знак, который соответствует нулю или более символов. Давайте рассмотрим каталог shell-lesson-data/exercise-data/proteins: *.pdb соответствует ethan.pdb, propane.pdb и всем файлам, оканчивающимся на «.pdb». С другой стороны, p*.pdb соответствует только pentane.pdb и propane.pdb , потому что «p» в начале соответствует только именам файлов, начинающимся с буквы «p».
? также является подстановочным знаком, но соответствует только одному символу. Таким образом, ?ethan.pdb будет соответствовать метану.pdb, тогда как *ethan.pdb соответствует и ethan.pdb , и метану.pdb .
Подстановочные знаки можно использовать в сочетании друг с другом, например. . ane.pdb соответствует трем символам, за которыми следует ane.pdb, что дает cubane.pdb ethan.pdb octane.pdb.
Когда оболочка видит подстановочный знак, она расширяет подстановочный знак, чтобы создать список совпадающих имен файлов перед выполнением запрошенной команды. В качестве исключения, если выражение с подстановочным знаком не соответствует ни одному файлу, Bash передаст выражение в качестве аргумента команде как есть. Например, ввод ls *.pdf в каталоге белков (который содержит только файлы с именами, заканчивающимися на .pdb ) приводит к сообщению об ошибке, что файл с именем *.pdf отсутствует. Однако обычно такие команды, как wc и ls, видят списки имен файлов, соответствующих этим выражениям, но не сами подстановочные знаки. Именно оболочка, а не другие программы, занимается раскрытием подстановочных знаков.
Список имен файлов, соответствующих шаблону
- ls *t*ane.pdb
- ls *t?ne.*
- ls *t??ne.pdb
- этан.*
Решение
Решение 3.
1. показывает все файлы, имена которых содержат ноль или более символов (*), за которыми следует буква t, затем ноль или более символов (*), за которыми следует ane.pdb. Это дает этан.pdb метан.pdb октан.pdb пентан.pdb .
2. показывает все файлы, имена которых начинаются с нуля или более символов ( * ), за которыми следует буква t , затем один символ ( ? ), затем ne. за которым следует ноль или более символов ( * ). Это даст нам octane.pdb и pentane.pdb, но не соответствует ничему, что заканчивается на thane.pdb.
3. устраняет проблемы варианта 2, сопоставляя два символа ( ?? ) между t и ne . Это решение.
4. показывает только файлы, начинающиеся с этана. .
Подробнее о подстановочных знаках
У Сэма есть каталог, содержащий данные калибровки, наборы данных и описания наборов данных:
Прежде чем отправиться на очередную экскурсию, она хочет создать резервную копию своих данных и отправить несколько наборов данных своему коллеге Бобу. Для выполнения работы Сэм использует следующие команды:
Помогите Сэму, заполнив пустые поля.
Полученная структура каталогов должна выглядеть так
Python предоставляет встроенные функции и модули для поддержки этих операций.
Открытие/закрытие файла
Чтение/запись текстовых файлов
Объект fileObj, возвращаемый после открытия файла, содержит указатель файла. Первоначально он располагается в начале файла и перемещается вперед всякий раз, когда выполняются операции чтения/записи.
Чтение строки/строк из текстового файла
- fileObj.readline() -> str : (наиболее часто используемый) Читает следующую строку (до и включая новую строку) и возвращает строку (включая новую строку). Он возвращает пустую строку после конца файла (EOF).
- fileObj.readlines() -> [str] : чтение всех строк в список строк.
- fileObj.read() -> str : чтение всего файла в строку.
Запись строки в текстовый файл
- fileObj.write(str) -> int : Записать заданную строку в файл и вернуть количество записанных символов. Вам нужно явно завершить str с помощью '\n' , если это необходимо. '\n' будет преобразован в новую строку в зависимости от платформы ("\r\n" для Windows или '\n' для Unix/Mac OS).
Примеры
Построчная обработка текстового файла
Мы можем использовать оператор with для открытия файла, который будет автоматически закрыт при выходе, и цикл for для построчного чтения следующим образом:
Выражение with эквивалентно выражению try-finally следующим образом:
Пример: построчное копирование файла
Следующий скрипт копирует один файл в другой построчно, добавляя перед каждой строкой номер строки.
Операции с двоичными файлами
- fileObj.tell() -> int : возвращает текущую позицию в потоке. Текущая позиция потока — это количество байтов от начала файла в двоичном режиме и непрозрачное число в текстовом режиме.
- fileObj.seek(смещение): устанавливает текущую позицию в потоке на смещение байт от начала файла.
Например, [ЗАДАЧ]
Каталог и управление файлами
В Python управление каталогами и файлами поддерживается модулями os , os.path , Shutil , .
Операции с путями с использованием модуля os.path
В Python путь может означать:
- файл,
- каталог или
- символическая ссылка (символическая ссылка).
Путь может быть абсолютным (начиная с корня) или относительным относительно текущего рабочего каталога (CWD).
Разделитель пути зависит от платформы (Windows использует '\' , а Unix/Mac OS использует ' /' ). Модуль os.path поддерживает независимые от платформы операции над путями, разумно обрабатывая разделитель путей.
Проверка существования и типа пути
- os.path.exists(path) -> bool : проверить, существует ли указанный путь.
- os.path.isfile(путь_к_файлу) , os.path.isdir(путь_к_каталогу) , os.path.islink(link_path) -> bool : проверить, является ли указанный путь файлом, каталогом или символической ссылкой.
Формирование нового пути
Разделитель пути зависит от платформы (Windows использует '\' , а Unix/Mac OS использует '/' ). Для переносимости важно НЕ жестко кодировать разделитель пути. Модуль os.path поддерживает независимые от платформы операции над путями, разумно обрабатывая разделитель путей.
- os.path.sep : разделитель путей текущей системы.
- os.path.join(path, *paths) : формирование и возврат пути путем объединения одного или нескольких компонентов пути путем вставки зависящего от платформы разделителя пути ( '/' или '\' ). Чтобы сформировать абсолютный путь, вам нужно начать с os.path.sep от имени пользователя root.
Управление именем каталога и именем файла
- os.path.dirname(путь) : возвращает имя каталога для заданного пути (файл, каталог или символическая ссылка). Возвращаемое имя каталога может быть абсолютным или относительным, в зависимости от заданного пути.
- os.path.abspath(path) : возвращает абсолютный путь (начиная с корня) заданного path . Это может быть абсолютное имя файла, абсолютное имя каталога или абсолютная символическая ссылка.
Например, чтобы сформировать абсолютный путь к файлу с именем out.txt в том же каталоге, что и in.txt , вы можете извлечь абсолютное имя каталога из in.txt , а затем присоединиться к out.txt следующим образом:
Когда модуль загружается в Python, __file__ устанавливается на имя модуля. Попробуйте запустить этот скрипт с различными ссылками на __file__ и изучите их вывод:
Обработка символической ссылки (Unixes/Mac OS)
- os.path.realpath(path) : (для символических ссылок) Аналогично abspath() , но возвращает канонический путь, исключая любые встречающиеся символические ссылки.
Управление каталогами и файлами с помощью модулей os и Shutil
Модули os и Shutil обеспечивают интерфейс к операционной системе и системной оболочке.
- Если вы хотите просто прочитать или записать файл, используйте встроенную функцию open() .
- Если вы просто хотите управлять путями (файлами, каталогами и символическими ссылками), используйте модуль os.path.
- Если вы хотите прочитать все строки во всех файлах в командной строке, используйте модуль ввода файлов.
- Для создания временных файлов/каталогов используйте модуль tempfile.
Управление каталогом
Управление файлами
- os.rename(src_file, dest_file) : переименовать файл.
- os.remove(файл) или os.unlink(файл): удалить файл. Вы можете использовать os.path.isfile(file), чтобы проверить, существует ли file.
Например [TODO],
Список каталогов
- os.listdir(path='.') -> [path] : список всех записей в данном каталоге (исключая '.' и '..' ), по умолчанию текущий каталог.
Рекурсивное отображение каталога с помощью os.walk()
- os.walk(top, topdown=True, onerror=None, followlinks=False): рекурсивно перечислить все записи, начиная с top .
Рекурсивное отображение каталога с помощью модуля glob (Python 3.5)
Копирование файла
Команда оболочки [TODO]
- os.system(command_str) : запустить команду оболочки. (В Python 3 вместо этого используйте subprocess.call().)
Переменные среды [TODO]
- os.getenv(varname, value=None) : возвращает переменную среды, если она существует, или value, если ее нет. , по умолчанию нет .
- os.putenv(имя_переменной, значение) : установите для переменной среды значение значение.
- os.unsetenv(имя_переменной): удалить (сбросить) переменную среды.
модуль ввода файла
Модуль fileinput обеспечивает поддержку обработки строк ввода из одного или нескольких файлов, указанных в аргументах командной строки ( sys.argv ). Например, создайте следующий скрипт с именем " test_fileinput.py ":
Обработка текста
Для простых операций с текстовыми строками, таких как поиск и замена строк, можно использовать встроенные строковые функции (например, str.replace(old, new)) ) . Для поиска и замены сложных шаблонов вам необходимо освоить регулярное выражение (регулярное выражение).
Операции со строками
Встроенный класс str предоставляет множество функций-членов для работы с текстовыми строками. Предположим, что s — это объект str.
Удалить пробелы (пробел, табуляция и новая строка)
- s.strip()-> str : возвращает копию строки s с удаленными начальными и конечными пробелами. Пробелы включают пробел, табуляцию и новую строку.
- s.strip([chars]) -> str : удаляет заданные начальные/конечные символы вместо пробелов.
- s.rstrip() , s.lstrip() -> str : удаляет правые (конечные) пробелы и левые (начальные) пробелы соответственно.
s.rstrip() чаще всего используется для удаления завершающих пробелов/перевода строки. Ведущие пробелы обычно имеют значение.
Верхний/нижний регистр
- s.upper() , s.lower() -> str : возвращает копию строки s, преобразованную в верхний и нижний регистр. соответственно.
- s.isupper() , s.islower() -> bool : проверьте, является ли строка прописной или строчной, соответственно.
- s.find(key_str, [начало], [конец]) -> int|- 1 : вернуть самый низкий индекс в срезе s [начало:конец] (по умолчанию вся строка); или -1, если не найдено.
- s.index(key_str, [начало], [конец]) -> int|ValueError : аналогично find() , но вызывает ValueError, если не найдено.
- s.startswith(key_str, [начало], [конец]) , s .endsswith(key_str, [начало], [конец]) -> bool : проверить, начинается или заканчивается строка с key_str .
Найти и заменить
- s.replace(old, new, [count]) -> str : вернуть копию при этом все вхождения old заменены на new . Необязательный параметр count ограничивает количество заменяемых вхождений, по умолчанию все вхождения.
str.replace() идеально подходит для простой замены текстовой строки без необходимости сопоставления с образцом.
Разделить на токены и объединить
- s.split([sep], [maxsplit=-1]) -> [str] : возвращает список слов. используя sep в качестве строки-разделителя. Разделителем по умолчанию являются пробелы (пробел, табуляция и новая строка). maxSplit ограничивает максимальное количество операций разделения, по умолчанию -1 означает отсутствие ограничений.
- sep.join([str]) -> str : обратный метод split() . Присоединяйтесь к списку строк с помощью sep в качестве разделителя.
Регулярное выражение в модуле re
Я предполагаю, что вы знакомы с регулярными выражениями, иначе вы могли бы прочитать:
- "Регулярное выражение на примерах" для обзора синтаксиса регулярных выражений и примеров.
- "Регулярные выражения" для полного охвата.
Модуль re обеспечивает поддержку регулярных выражений (regex).
Обратная косая черта ( \ ), исходная строка Python r'. ' против обычной строки
В синтаксисе регулярного выражения используется обратная косая черта ( \ ):
- для метасимволов, таких как \d (цифра), \D (не цифра), \s (пробел), \S (не пробел), \w (слово), \W (не слово)
- для экранирования специальных символов регулярных выражений, например, \. для . , \+ для + , \* для * , \? для ? . Вам также нужно написать \\ для соответствия \ .
С другой стороны, обычные строки Python также используют обратную косую черту для управляющих последовательностей, например, \n для новой строки, \t для табуляции. Опять же, вам нужно написать \\ вместо \ .
Чтобы записать шаблон регулярного выражения \d+ (одна или несколько цифр) в обычную строку Python, вам нужно написать '\\d+' . Это громоздко и чревато ошибками.
Решение Python использует необработанную строку с префиксом r в форме r'. ' . Он игнорирует интерпретацию управляющей последовательности строки Python. Например, r'\n' — это '\'+'n' (два символа) вместо новой строки (один символ). Используя необработанную строку, вы можете написать r'\d+' для шаблона регулярного выражения \d+ (вместо обычной строки '\\d+' ).
Кроме того, Python обозначает обратные ссылки в скобках (или группы захвата) как \1 , \2 , \3 , . которые могут быть записаны как необработанные строки r'\1' , r'\2' вместо обычных строк '\\1' и '\\2' . Обратите внимание, что в некоторых языках используются $1, $2, . для обратных ссылок.
Я предлагаю вам использовать необработанные строки для строк шаблонов регулярных выражений и строк замены.
Компиляция (создание) объекта шаблона регулярных выражений
Вызов операций регулярных выражений
Вы можете вызывать большинство функций регулярных выражений двумя способами:
- regexObj.func(str): применить скомпилированное регулярное выражение object к str , через функцию-член SRE_Pattern func() .
- re.func(regexObj|regexStr, str) : применить объект регулярного выражения (скомпилированный) или < em>regexStr (не скомпилировано) в str через функцию уровня модуля re func() . Эти функции уровня модуля представляют собой ярлыки для описанных выше, которые не требуют предварительной компиляции объекта регулярного выражения, но пропускают модификаторы, если используется regexStr.
Найти с помощью finalAll()
- regexObj.findall(str) -> [str] : возвращает список всех совпадающих подстрок.
- re.findall(regexObj|regexStr, str) -> [str] : то же, что и выше.
Заменить с помощью sub() и subn()
- regexObj.sub(replaceStr, inStr, [count=0]) ->outStr: заменить (заменить) совпадающее подстроки в заданном inStr с помощью replaceStr , до количества вхождений, по умолчанию все.
- regexObj.subn(replaceStr, inStr, [count=0]) -> (outStr, count) : аналогично sub() , но возвращает новую строку вместе с количеством замен в двух кортежах.
- re.sub(regexObj|regexStr, replaceStr, inStr, [count em>=0]) ->outStr: то же, что и выше.
- re.subn(regexObj|regexStr, replaceStr, inStr, [count em>=0]) -> (outStr, count) : то же, что и выше.
Примечания. Для простой замены строки используйте str.replace(old, new, [max= -1]) -> str, что более эффективно. См. раздел выше.
Использование обратных ссылок в скобках \1 , \2 , . в замене и шаблоне
В Python обратные ссылки в круглых скобках регулярных выражений (группы захвата) обозначаются как \1 , \2 , . Вы можете использовать необработанную строку (например, r'\1' ), чтобы избежать экранирования обратной косой черты в обычной строке (например, '\\1' ).
Найти с помощью search() и Match Object
Поиск() возвращает специальный объект Match, инкапсулирующий первое совпадение (или None, если совпадений нет). Затем вы можете использовать следующие методы для обработки результирующего объекта Match:
- matchObj.group() : возвращает совпадающую подстроку.
- matchObj. start() : возвращает начальную совпадающую позицию (включительно).
- matchObj. end() : возвращает конечную совпавшую позицию (эксклюзивно).
- matchObj. span() : возвращает кортеж совпадающей позиции (начало, конец).
Чтобы получить обратные ссылки (или группы захвата) внутри объекта Match:
- matchObj. groups() : возвращает кортеж захваченных групп (или обратных ссылок)
- matchObj .group(n) : возвращает группу захвата n , где n начинается с 1 .
- matchObj.lastindex : последний индекс захватываемой группы
Поиск с использованием match() и fullmatch()
Search() соответствует любому заданному элементу inStr[begin:end] . С другой стороны, match() соответствует с начала inStr[начало:конец] (аналогично в шаблон регулярного выражения ^. ); в то время как fullmatch() соответствует всему inStr[begin:end] (аналогично шаблону регулярного выражения ^. $ ).
Найти с помощью finditer()
Функция finditer() аналогична функции findall(). findall() возвращает список совпадающих подстрок. Finditer() возвращает итератор для объектов Match. Например,
Разделение строки на токены
Функция split() разбивает заданный inStr на список, используя шаблон регулярного выражения в качестве разделителя (разделителя). Например,
Примечания. Для простого разделителя используйте str.split([sep]) , что более эффективно. См. раздел выше.
Парсинг веб-страниц
Ссылки:
Очистка веб-страниц (или сбор веб-страниц или извлечение веб-данных) – это чтение необработанной HTML-страницы для извлечения нужных данных. Излишне говорить, что вам необходимо освоить HTML, CSS и JavaScript.
Python поддерживает просмотр веб-страниц с помощью запросов пакетов и BeautifulSoup (bs4).
Установить пакеты
Вы можете установить соответствующие пакеты с помощью pip следующим образом:
Шаг 0. Проверка целевой веб-страницы
- Нажмите F12 на целевой веб-странице, чтобы включить отладчик F12.
- Выберите «Инспектор».
- Нажмите кнопку "Выбрать" (крайний левый значок со стрелкой) и наведите указатель мыши на нужную часть HTML-страницы. Изучите коды.
Шаг 2. Преобразование HTML-текста в древовидную структуру с помощью BeautifulSoup и поиск нужных данных
Вы можете записать выбранные данные в файл:
Вы также можете использовать модуль csv для записи строк данных с заголовком:
Шаг 3. Загрузите выбранный документ с помощью urllib.request
Возможно, вы захотите загрузить такие документы, как текстовые файлы или изображения.
Шаг 4. Задержка
Чтобы избежать рассылки спама на веб-сайт с запросами на загрузку (и пометки как спамера), вам необходимо на некоторое время приостановить работу кода.
Linux предоставляет пользователям замечательную функцию командной строки вместе с графическим пользовательским интерфейсом, где они могут выполнять задачи с помощью команды разрушения. Все эти команды возвращают статус в соответствии с их выполнением. Его значение выполнения может использоваться для отображения ошибок или выполнения некоторых других действий в сценарии оболочки.
В некоторых случаях может потребоваться отслеживать количество строк и количество слов в конкретном файле. В этом случае можно использовать любой из следующих методов для подсчета количества строк и слов в конкретном файле в Linux.Давайте рассмотрим несколько примеров для лучшего понимания:
Пример: рассмотрим этот файл (demo.txt) со следующим содержимым:
Вывод:
Давайте рассмотрим все методы подсчета количества строк и слов и то, как их можно использовать в сценарии оболочки.
Способ 1: Использование команды WC
wc означает количество слов. С помощью команды wc можно определить количество слов, количество строк, количество пробелов и т. д.
Синтаксис-
- Создайте переменную для хранения пути к файлу.
- Используйте команду wc –lines для подсчета количества строк.
- Используйте команду wc –word для подсчета количества слов.
- Выведите количество строк и количество слов с помощью команды echo.
Входной файл: cat demo.txt
команда cat используется для отображения содержимого файла.
Сценарий:
Вывод:
Использование команды wc
- Первая строка сообщает системе, что bash будет использоваться в качестве интерпретатора.
- Команда wc используется для определения количества строк и количества слов.
- Переменная создается для хранения пути к файлу.
- После этого используется команда wc с аргументом –lines для подсчета количества строк, и аналогичным образом команда wc с аргументом –words используется для подсчета количества слов в файле.
- В конце с помощью команды echo отображается количество слов и количество строк.
Метод 2. Использование команды awk
awk – это язык сценариев, который в основном используется для предварительной обработки текста и манипулирования им. Используя awk, мы можем выполнять поиск по шаблону, находить и заменять, подсчитывать слова, подсчитывать строки, подсчитывать специальные символы, подсчитывать пробелы и т. д.
Синтаксис:
- Создайте переменную для хранения пути к файлу.
- Инициализировать переменную счетчика для подсчета количества строк.
- После каждой строки увеличивайте переменную counter для подсчета количества строк.
- Отображение количества строк с помощью команды печати.
- Инициализируйте другую переменную-счетчик для подсчета количества слов.
- Используйте пробел в качестве разделителя записей и увеличьте переменную счетчика, чтобы подсчитать количество слов, разделенных пробелом.
- После этого отобразите количество слов с помощью команды печати.
Сценарий:
Вывод:
- В первой строке создается переменная file_path для хранения пути к текстовому файлу.
- Командный оператор awk можно разделить на следующие части.
- BEGIN инициализирует вызываемую переменную счетчика. // будет увеличивать переменную счетчика c на 1 всякий раз, когда встречается новая строка.
- END c> напечатает количество строк.
- Аналогичным образом количество слов подсчитывается путем разделения каждого слова пробелом с использованием RS="[[:space:]]. Здесь RS — это разделитель записей, а в качестве разделителя в этом примере используется пробел.
- Создайте переменную для хранения пути к файлу.
- Используйте специальную переменную NR, чтобы узнать количество строк. NR означает количество записей и содержит количество обработанных записей.
- Используйте NF(количество полей в текущей записи), чтобы узнать количество слов в каждой строке.
- Затем используйте цикл while, чтобы пройтись по всем строкам и просуммировать NF каждой строки.
- Отображение количества строк.
Пример для NF: Давайте файл будем-
NF означает количество полей в текущей записи, т. е. количество слов в текущей строке.
Здесь 5 означает, что в первой строке 5 слов, а 7 означает, что во второй строке 7 слов.
Читайте также: