Текстовый файл состоит не более чем из 1200000 символов x y z

Обновлено: 03.07.2024

Дело XYZ (1797–1798) касалось американской мирной делегации во Франции, трех агентов министра иностранных дел Франции (обозначенных X, Y и Z в первоначальных сообщениях президента Джона Адамса Конгрессу) и французского министерства иностранных дел. Требование министра взятки от американской делегации. Дело сыграло важную роль в принятии законов об иностранцах и подстрекательстве к мятежу.

После Французской революции 1789 года Великобритания и Франция находились в почти постоянном конфликте вплоть до битвы при Ватерлоо в 1815 году. К сожалению, новая американская республика оказалась втянутой во франко-британскую борьбу, что имело огромные последствия для внутренней политики Соединенных Штатов. .

Когда Франция и Великобритания вступили в войну в 1793 году, Франция – союзник США в Американской революции – надеялась на поддержку США. Но президент Вашингтон считал, что хрупкая новая нация не может позволить себе войну, и объявил нейтралитет США. Когда Великобритания и Соединенные Штаты подписали договор Джея (1794 г.) для поддержания мира между двумя странами, Франция сочла этот договор глубоко несправедливым. (Например, Великобритания могла конфисковать товары с кораблей США, идущих во Францию, если бы выплатила компенсацию.) К 1796 г., возмущенная действиями США, Франция начала захватывать американские корабли, торгующие с Великобританией (к концу 1798 г. захватив более 300), и Французское правительство отказалось принять нового посла США во Франции Чарльза К. Пинкни. В ответ президент Адамс созвал специальную сессию Конгресса 16 мая 1797 года и попросил Конгресс поддержать наращивание военной мощи для возможного конфликта с Францией. Этот период называют квазивойной с Францией.

В то же время Адамс решил отправить делегацию во Францию, чтобы поддержать мир. Адамс выбрал Чарльза К. Пинкни (который уже был в Европе), Элбриджа Джерри и Джона Маршалла в качестве посланников США. Их инструкции заключались в том, чтобы стремиться поддерживать нейтралитет и коммерческие отношения, не принуждая Соединенные Штаты к финансовой поддержке Франции.

В конце 1797 года американские посланники во Франции пытались работать через трех посредников — Жана Конрада Хоттингера (помеченного X в первоначальных закодированных сообщениях), Пьера Беллами (Y) и Люсьена Отваля (Z) — чтобы начать переговоры с Министр иностранных дел Франции Шарль-Морис де Талейран-Перигор. Посредники сообщили американским посланникам, что для того, чтобы Франция официально приняла американских дипломатов, должны быть выполнены определенные условия: во-первых, дипломаты должны были извиниться за антифранцузские настроения в речи Адамса 16 мая в Конгрессе. Во-вторых, они должны дать Талейрану 1 200 000 ливров (50 000 фунтов стерлингов или 250 000 долларов); такие личные «платежи» считались обычной практикой во французской дипломатии. В-третьих, Соединенные Штаты должны предоставить Франции крупный заем и оплатить претензии американских купцов к Франции за корабли, захваченные Францией после заключения договора Джея. Когда до Парижа дошли новости о новых победах французов в продолжающейся войне в Европе, Талейран и французское правительство начали угрожать посланникам США.

22 октября и 8 ноября Маршалл отправил госсекретарю США Тимоти Пикерингу длинные депеши с объяснением ситуации — депеши, которые сыграют важную роль в грядущем политическом взрыве. Неофициальные переговоры продолжались всю зиму 1797-1798 гг., но безрезультатно. После неоднократных попыток начать переговоры без взятки или предоставления ссуды 24 апреля 1798 года Маршалл отплыл домой, а Пинкни отправился на юг Франции по личным причинам. Джерри, вопреки совету своих коллег, остался в Париже, чтобы начать переговоры, решение, за которое он впоследствии подвергся резкой критике.

За Атлантикой Томас Джефферсон, вице-президент Адамса, считал, что США поступили несправедливо с Францией. В результате Джефферсон и его союзники не поддержали действия Адамса, особенно подготовку к возможной войне с Францией. Джефферсон также скептически относился к миротворческой миссии, написав, что «назначение послов во Францию ​​не доказывает полного перехода к мирной системе». взять твердую руку с Францией и финансировать более сильную военную оборону, но эти планы встретили значительное сопротивление со стороны республиканцев-демократов Джефферсона в Конгрессе.

Закодированные депеши от Маршалла прибыли 4 марта 1798 года, и к 5 марта Адамс объявил Конгрессу, что миссия провалилась. Поскольку все больше депеш было расшифровано, Адамс и его кабинет были возмущены действиями французов, но Адамс не хотел обнародовать депеши, потому что считал, что их обнародование поставит под угрозу жизни американских министров.

19 марта 1798 года Адамс обратился к Конгрессу с просьбой вооружить американские суда, укрепить береговую оборону и производить оружие.Хотя Джефферсон в частном порядке критиковал действия Талейрана, он считал, что Адамс и федералисты слишком остро реагируют на депеши и удобно используют инцидент, чтобы спровоцировать войну с Францией. Джефферсон назвал обращение Адамса к Конгрессу «безумием»2. В письме Джеймсу Мэдисону Джефферсон указал, что надеется задержать действия Конгресса как можно дольше. (В то время Мэдисон жил на пенсии в Монпелье, поддерживая создание новой Демократической республиканской партии). сами избавляют нас."3

Некоторые республиканские члены Конгресса полагали, что полные депеши покажут, что Франция готова к переговорам. Республиканская пресса (включая Джеймса Каллендера) также требовала полного раскрытия депеш. 2 апреля Палата представителей постановила Адамсу опубликовать депеши целиком. Адамс немедленно согласился предоставить их Конгрессу, поскольку знал, что депеши поддержат его призывы к сильной защите, а американские министры благополучно покинули Францию. 3 апреля он опубликовал переписку, используя X, Y, Z вместо имен французских агентов. Он попросил Конгресс изучить документы за закрытыми дверями. Когда депеши были зачитаны в Конгрессе, даже многие республиканцы были потрясены действиями французов. Сенат быстро проголосовал за публикацию депеш, и вскоре они были напечатаны в газетах.

Это раскрытие настроило общественное мнение против Франции, и популярность Джона Адамса выросла. «Миллионы на защиту, но ни одного цента на дань» стали популярным лозунгом федералистов, и федералисты увеличили свое большинство в Палате представителей на выборах 1798 года, что напрямую способствовало принятию законов об иностранцах и подстрекательстве к мятежу (и ответу Джефферсона с резолюции Кентукки и Вирджинии).

Хотя этот инцидент способствовал наращиванию военной мощи, война так и не была объявлена. Французское правительство изменило свое мнение и сняло требования, а Адамс, несмотря на серьезное противодействие со стороны своей собственной партии, предложил еще одну миротворческую миссию. К концу 1800 года Адамс заключил Мортефонтенский договор с Францией, чтобы восстановить мир (хотя известие о договоре дошло до Соединенных Штатов слишком поздно, чтобы помочь Адамсу на ожесточенных выборах 1800 года).

Что касается Джефферсона, то, когда он писал Мэдисону, что действия французов «были очень недостойны великой нации», он настаивал на том, что «эти документы [депеши] не предлагают ни одного мотива для нашего вступления в войну». 4 Джефферсон не был уверен, знала ли французская Директория о заговоре Талейрана, и ему никогда не нравилось, как дело XYZ использовалось для политической выгоды. Еще в 1799 году он писал своему другу, что «вы знаете, какое нечестивое использование было сделано из французских переговоров и, в частности, из блюда XYZ, приготовленного Маршаллом, где мошенники представлены как французское правительство». Джефферсона, было нелегко поколебать его романтические представления о времени, проведенном во Франции, и первых идеалах Французской революции.

Дополнительные источники

Кюль, Джон В. «Южная реакция на дело XYZ: инцидент в период зарождения американского национализма». Реестр Исторического общества Кентукки 70, вып. 1 (1972): 21–49.

В этом руководстве описывается, как использовать grepegrep) дляпоиска текста в файлах, в их простой форме и в сочетании с регулярными выражениями. Он содержит несколько примеров и упражнений, а также решения, которые может выполнить зритель.

Название grep происходит от команды ed (и vim) «g/re/p», что означает глобальный поиск заданного регулярного выражения и печать (отображение) вывода.

Регулярные выражения

Утилиты позволяют пользователю искать в текстовых файлах строки, соответствующие регулярному выражению (regexp). Регулярное выражение — это строка поиска, состоящая из текста и одного или нескольких из 11 специальных символов. Простой пример — сопоставление начала строки.

Пример файла

Основная форма grep может использоваться для поиска простого текста в определенном файле или файлах. Чтобы попробовать примеры, сначала создайте файл примера.

Используйте редактор, например nano или vim, чтобы скопировать приведенный ниже текст в файл с именем myfile.

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

Прежде чем приступать к примерам, просмотрите образец файла:


Простой поиск

Чтобы найти текст «xyz» в файле, выполните следующее:


Использование цветов

Чтобы отобразить цвета, используйте --color (двойной дефис) или просто создайте псевдоним. Например:


Параметры

Обычные параметры, используемые с командой grep, включают:

  • -найти все строки независимо от регистра
  • -c подсчитать, сколько строк содержит текст
  • -n отображать номера совпадающих строк
  • -l отображать только совпадающие имена файлов
  • -r рекурсивный поиск подкаталогов
  • -v найти все строки, НЕ содержащие текст

Например:


Создать несколько файлов

Прежде чем искать несколько файлов, сначала создайте несколько новых файлов:

$ echo xyz > myfile1
$ echo -e "xyz\nxzz\nXYZ" > myfile2
$ echo -e "xxx\nyyy" > myfile3
$ cat myfile1
$ cat myfile2
$ cat myfile3


Поиск в нескольких файлах

Для поиска нескольких файлов с использованием имен файлов или подстановочного знака введите:


Упражнение I

  1. Сначала подсчитайте, сколько строк в файле /etc/passwd.
  1. Теперь найдите все вхождения текста var в файле /etc/passwd.
  2. Определить, сколько строк в файле содержит текст
  3. Найти, сколько строк НЕ содержит текст var.
  4. Найдите запись для входа в систему в /etc/passwd

Решения для упражнений можно найти в конце этой статьи.

Использование регулярных выражений

Команду grep также можно использовать с регулярными выражениями, используя один или несколько из одиннадцати специальных символов или символов для уточнения поиска. Регулярное выражение – это строка символов, содержащая специальные символы, позволяющие выполнять сопоставление с образцом в таких утилитах, как grep, vim и sed. Обратите внимание, что строки могут быть заключены в кавычки.

Доступны следующие специальные символы:

< /tbody>
^ Начало строки
$ Конец строки
. Любой символ (кроме \n новой строки)
* 0 или более из предыдущих выражение
\ Если перед символом стоит буквальный символ

Обратите внимание, что символ *, который может использоваться в командной строке для соответствия любому количеству символов, включая отсутствие символов, здесь не используется таким же образом.

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

Примеры

Чтобы найти все строки, начинающиеся с текста, используя символ ^:

Чтобы найти все строки, заканчивающиеся текстом с помощью символа $:

Чтобы найти строки, содержащие строку, используя символы ^ и $:

Чтобы найти строки с помощью . для соответствия любому символу:


Чтобы найти строки, используя * для соответствия 0 или более предыдущих выражений:

Чтобы найти строки, использующие .* для соответствия 0 или более любых символов:

Чтобы найти строки, используя \ для экранирования символа *:

Чтобы найти использование символа \:


Выражение grep – egrep

Команда grep поддерживает только часть доступных регулярных выражений. Однако команда egrep:

  • позволяет в полной мере использовать все регулярные выражения
  • может одновременно искать более одного выражения

Обратите внимание, что выражения должны быть заключены в кавычки.

Чтобы использовать цвета, используйте –color или снова создайте псевдоним:

Для поиска более одного регулярного выражения команду egrep можно разместить в нескольких строках. Однако это также можно сделать с помощью следующих специальных символов:

| Чередование, то одно, то другое
(…) Логическая группировка части выражения

Это извлекает из файла строки, начинающиеся с root, uucp или mail, | символ, означающий любой из вариантов.


Следующая команда не будет работать, хотя сообщение не отображается, так как базовая команда grep поддерживает не все регулярные выражения:

Однако в большинстве систем Linux команда grep -E аналогична использованию egrep:


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

Конвейерная обработка — это процесс отправки вывода одной команды в качестве ввода другой команды и один из самых мощных доступных инструментов Linux.

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

В следующем примере стандартный вывод команды ls -l передается в качестве стандартного ввода команде grep. Затем выходные данные команды grep передаются в качестве входных данных для команды more.

Это отобразит только каталоги в /etc:


Следующие команды являются примерами использования фильтров:



Пример файла

Чтобы проверить это упражнение, сначала создайте следующий образец файла.

Используйте редактор, например nano или vim, чтобы скопировать приведенный ниже текст в файл с именем people:

Персональный J.Smith 25000
Персональный E.Smith 25400
Обучение A.Brown 27500
Обучение C.Browen 23400
(Администратор) R.Bron 30500
Goodsout T.Smyth 30000
Персональный F.Jones 25000
обучение* C.Evans 25500
Goodsout W.Pope 30400
Groundfloor T.Smythe 30500
Персональный J.Maler 33000

Упражнение II

  1. Отобразите файл people и проверьте его содержимое.
  2. Найдите все строки, содержащие строку Smith, в файле people.Подсказка: используйте команду grep, но помните, что по умолчанию она чувствительна к регистру.
  3. Создайте новый файл npeople, содержащий все строки, начинающиеся со строки Personal в файле people. Совет: используйте команду grep с >.
  4. Подтвердите содержимое файла npeople, просмотрев файл.
  5. Теперь добавьте все строки, где текст заканчивается строкой 500 в файле people, к файлу npeople. Совет: используйте команду grep с >>.
  6. Еще раз подтвердите содержимое файла npeople, указав его в списке.
  7. Найдите IP-адрес сервера, который хранится в файле /etc/hosts. Совет: используйте команду grep с $(hostname)
  8. Используйте egrep для извлечения из файла /etc/passwd строк учетной записи, содержащих lp или ваш собственный идентификатор пользователя.

Решения для упражнений можно найти в конце этой статьи.

Больше регулярных выражений

Регулярное выражение можно рассматривать как подстановочные знаки на стероидах.

Есть одиннадцать символов со специальными значениями: открывающая и закрывающая квадратные скобки [ ], обратная косая черта \, знак вставки ^, знак доллара $, точка или точка ., вертикальная черта или символ вертикальной черты |, вопросительный знак. ?, звездочка или звездочка *, знак плюс + и открывающая и закрывающая круглая скобка < >. Эти специальные символы также часто называют метасимволами.

Вот полный набор специальных символов:

^ Начало строки
$ Конец строки
. Любой символ (кроме \n новой строки)
* 0 или более из предыдущих выражение
| Чередование, то одно, то другое
[…] Явный набор символов для сопоставления
+ 1 или более предыдущих выражений
? 0 или 1 предыдущего выражения
\ Начало символа делает его буквальным символом
Явное обозначение квантификатора
(…) Логическая группировка части выражения

Версия grep по умолчанию имеет лишь ограниченную поддержку регулярных выражений. Чтобы все следующие примеры работали, используйте вместо них egrep или grep -E.

Чтобы найти строки с помощью | для соответствия любому выражению:

Чтобы найти строки, используйте | для соответствия любому выражению в строке также используйте ( ):


Чтобы найти строки, используя [ ] для соответствия любому символу:

Чтобы найти строки, в которых используется [ ], НЕ совпадающие ни с одним символом:

Чтобы найти строки, используя * для соответствия 0 или более предыдущих выражений:


Чтобы найти строки, используя + для соответствия 1 или более предыдущим выражениям:

Чтобы найти строки с помощью ? чтобы соответствовать 0 или 1 предыдущего выражения:


Упражнение III

  1. Найти все строки, содержащие имена Эванс или Малер, в файле people.
  2. Найти все строки, содержащие имена Smith, Smyth или Smythe в файле people.
  3. Найдите в файле people все строки, содержащие имена Браун, Броуэн или Брон. Если у вас есть время:
  4. Найдите строку, содержащую строку (admin), включая квадратные скобки, в файле people.
  5. Найдите строку, содержащую символ *, в файле people.
  6. Объедините 5 и 6 выше, чтобы найти оба выражения.

Еще примеры

Чтобы найти строки с помощью . и * для соответствия любому набору символов:

Чтобы найти строки, используя < >для соответствия N количеству символов:

Чтобы найти строки, используя < >для совпадения N или более раз:

Чтобы найти строки, используя < >для совпадения N раз, но не более M раз:


Заключение

В этом руководстве мы впервые рассмотрели использование grep в его простой форме для поиска текста в файле или нескольких файлах. Затем мы объединили искомый текст с простыми регулярными выражениями, а затем с более сложными, используя egrep.

Дальнейшие шаги

Надеюсь, вы примените полученные здесь знания с пользой. Попробуйте использовать команды grep на своих собственных данных и помните, что описанные здесь регулярные выражения можно использовать в той же форме в vi, sed и < эм>ооо!

Решения для упражнений

Упражнение I

Сначала подсчитайте, сколько строк в файле /etc/passwd.
$ wc -l /etc/passwd
Теперь найдите все вхождения текста var в файле /etc/passwd.
$ grep var /etc/passwd
Найти, сколько строк в файле содержат текст var

Найти, сколько строк НЕ содержит текстовую переменную.

Найдите запись для вашего логина в файле /etc/passwd
grep kdm /etc/passwd


Упражнение II

Отобразите файл people и проверьте его содержимое.
$ cat people
Найти все строки, содержащие строку Smith, в файле people.
$ grep '^Personal' people
Создайте новый файл npeople, содержащий все строки, начинающиеся со строки Personal в файле people
$ grep '^Personal' people > npeople
Подтвердите содержимое файла npeople, просмотрев файл.
$ cat npeople
Теперь добавьте все строки, где текст заканчивается строкой 500 в файле people, к файлу npeople.
$ grep '500$' people >> npeople
Снова подтвердите содержимое файла npeople, просмотрев файл.
$ cat npeople
Найдите IP-адрес сервера, который хранится в файле /etc/hosts.
$ grep $ ( hostname ) / etc / hosts
Используйте egrep для извлечения из файла /etc/passwd строк учетной записи, содержащих lp или ваш собственный идентификатор пользователя.
$ egrep '(lp|kdm:)' /etc/passwd


Упражнение III

Найти все строки, содержащие имена Эванс или Малер, в файле people.
$ egrep 'Evans|Maler' people
Найти все строки, содержащие имена Smith, Smyth или Smythe в файле people.
$ egrep 'Sm(i|y)the?' people
Найти все строки, содержащие имена Brown, Browen или Bron в файле people.
$ egrep 'Brow?e?n' people
Найдите строку, содержащую строку (admin), включая скобки, в файле people.

Найдите строку, содержащую символ *, в файле people.
$ egrep '\*' people
Объедините 5 и 6 выше, чтобы найти оба выражения.

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 путь может означать:

  1. файл,
  2. каталог или
  3. символическая ссылка (символическая ссылка).

Путь может быть абсолютным (начиная с корня) или относительным относительно текущего рабочего каталога (CWD).

Разделитель пути зависит от платформы (Windows использует '\' , а Unix/Mac OS использует ' /' ). Модуль os.path поддерживает независимые от платформы операции над путями, разумно обрабатывая разделитель путей.

Проверка существования и типа пути
  • os.path.exists(path) -> bool : проверить, существует ли указанный путь.
  • os.path.isfile(путь_к_файлу) , os.path.isdir(путь_к_каталогу) , os.path.islink(путь_ссылки) -> 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(путь='.') -> [путь] : список всех записей в данном каталоге (исключая '.' и '..' ), по умолчанию текущий каталог.
Рекурсивное отображение каталога с помощью 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 : удаляет правые (конечные) пробелы и левые (начальные) пробелы соответственно.< /li>

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'. ' против обычной строки

В синтаксисе регулярного выражения используется обратная косая черта ( \ ):

  1. для метасимволов, таких как \d (цифра), \D (не цифра), \s (пробел), \S (не пробел), \w (слово), \W (не слово)
  2. для экранирования специальных символов регулярных выражений, например, \. для . , \+ для + , \* для * , \? для ? . Вам также нужно написать \\ для соответствия \ .

С другой стороны, обычные строки Python также используют обратную косую черту для управляющих последовательностей, например.g., \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, . для обратных ссылок.

Я предлагаю вам использовать необработанные строки для строк шаблонов регулярных выражений и строк замены.

Компиляция (создание) объекта шаблона регулярных выражений
Вызов операций регулярных выражений

Вы можете вызывать большинство функций регулярных выражений двумя способами:

  1. regexObj.func(str): применить скомпилированное регулярное выражение object к str , через функцию-член SRE_Pattern func() .
  2. 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=0]) ->outStr: то же, что и выше.
  • re.subn(regexObj|regexStr, replaceStr, inStr, [count=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. Проверка целевой веб-страницы
  1. Нажмите F12 на целевой веб-странице, чтобы включить отладчик F12.
  2. Выберите «Инспектор».
  3. Нажмите кнопку "Выбрать" (крайний левый значок со стрелкой) и наведите указатель мыши на нужную часть HTML-страницы. Изучите коды.
Шаг 2. Преобразование HTML-текста в древовидную структуру с помощью BeautifulSoup и поиск нужных данных

Вы можете записать выбранные данные в файл:

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

Шаг 3. Загрузите выбранный документ с помощью urllib.request

Возможно, вы захотите загрузить такие документы, как текстовые файлы или изображения.

Шаг 4. Задержка

Чтобы избежать рассылки спама на веб-сайт с запросами на загрузку (и пометки как спамера), вам необходимо на некоторое время приостановить работу кода.

Читайте также: