Синтаксис Python прост и близок к естественному языку. Даже начинающие программисты могут быстро приступить к работе, снизив порог обучения.
Python предоставляет широкий спектр стандартных библиотек функций, охватывающих многие аспекты, такие как работа в сети, обработка данных и графические интерфейсы. Кроме того, мощная сторонняя экосистема, такая как NumPy, Pandas и TensorFlow, делает Python универсальным инструментом разработки.
Python — кроссплатформенный язык. Будь то Windows, macOS или Linux, можно выполнить одну и ту же программу Python, что значительно повышает гибкость разработки.
Python играет важную роль во многих областях, таких как наука о данных, искусственный интеллект, веб-разработка, создание сценариев автоматизации, разработка игр и т. д., позволяя разработчикам решать множество задач с помощью одного языка.
Python имеет большое глобальное сообщество, и как новички, так и опытные разработчики могут легко найти образовательные ресурсы, дискуссионные группы и техническую поддержку.
Python предоставляет интуитивно понятный синтаксис и мощные инструменты, позволяющие разработчикам быстрее реализовывать программирование и сокращать цикл разработки продукта.
Anaconda — это платформа программирования на Python и R с открытым исходным кодом, предназначенная для научных вычислений, включая такие приложения, как обработка данных, машинное обучение, искусственный интеллект и анализ больших данных.
Anaconda подходит для пользователей в следующих сферах:
Ниже приведены проблемы, с которыми часто сталкиваются пользователи:
Можно ввести в терминалеconda update condaиconda update anaconda。
Anaconda — это платформа для обработки данных, которая интегрирует язык программирования Python с множеством встроенных инструментов и библиотек.
Anaconda предоставляет функцию виртуальной среды (Environment), которая позволяет пользователям создавать несколько независимых сред выполнения Python на одном компьютере. Каждая среда может иметь разные версии и пакеты Python, чтобы избежать конфликтов зависимостей между разными проектами.
# Создайте среду с именем myenv и укажите версию Python
conda create -n myenv python=3.10
# Стартовая среда
Конда активирует myenv
#Выходим из окружения
Конда деактивировать
# Список всех сред
список окружения Конды
# или
информация конды --envs
# Экспорт конфигурации среды в файл YAML
экспорт env conda > Environment.yml
# Создать среду из файла YAML
conda env create -f Environment.yml
# Удалить указанную среду
conda удалить -n myenv --all
Jupyter — это интерактивная вычислительная среда с открытым исходным кодом, которая поддерживает несколько языков программирования и в основном используется для анализа данных, машинного обучения и академических исследований.
Jupyter широко используется в следующих областях:
jupyter notebookЗапустите блокнот Jupyter.Перейти кОфициальный сайт кода Visual Studio, загрузите и установите версию, подходящую для вашей операционной системы.
В Visual Studio Code установите расширение Python, выполнив следующие действия:
Убедитесь, что Python установлен в вашей системе. Можно получить изОфициальный сайт PythonЗагрузите и установите.
После завершения установки введите следующую команду в командной строке, чтобы подтвердить успешность установки:
питон --версия
# или
python3 --версия
Откройте проект или файл Python, щелкните строку состояния «Python» в правом нижнем углу кода Visual Studio и выберите соответствующий интерпретатор Python.
Откройте файл Python в редакторе и запустите программу, используя следующий метод:
Ctrl + Shift + P, найдите «Запустить файл Python» и выполните его.Если вам необходимо установить сторонний пакет, вы можете использовать встроенный терминал для ввода:
имя пакета установки pip
Наслаждайтесь автозаполнением и мощными инструментами отладки благодаря функциональности, предоставляемой расширениями Python:
Вот некоторые часто используемые сочетания клавиш:
Ctrl + F5Ctrl + Shift + PShift + Alt + FCtrl + `Если вам нужно передать параметры при выполнении программы Python, вы можете установитьlaunch.jsonЗаканчивать:
launch.jsonИзмените соответствующие настройки в файле.Ниже приведен пример конфигурации, включая путь к программе и параметры выполнения:
{
"версия": "0.2.0",
"конфигурации": [
{
"name": "Python: запуск с аргументами",
"тип": "питон",
"запрос": "запуск",
"program": "${workspaceFolder}/main.py", // путь к программе
"console": "integratedTerminal", // тип терминала
"args": ["arg1", "arg2", "--option", "value"] // Передаем параметры
}
]
}
существоватьargsПараметры командной строки могут быть переданы, например:
arg1иarg2является позиционным параметром.--optionиvalueэто параметр с опциями.использоватьsys.argvЧтобы прочитать параметры, переданные из командной строки:
импортсистем
print("Все параметры:", sys.argv)
если len(sys.argv) > 1:
print("Первый параметр:", sys.argv[1])
print("Второй параметр:", sys.argv[2])
Предположим, что программа:
python main.py arg1 arg2 --option value
Результат выполнения:
Все параметры: ['main.py', 'arg1', 'arg2', '--option', 'value']
Первый параметр: arg1
Второй параметр: arg2
1. УстановкаPython ExtensionРасширение.
2. Запустите проект Python в VS Code.
3. НажмитеF5Или нажмите на панель действий слева.Debugикона.
1. Нажмите «Добавить конфигурацию» на панели «Отладка».
2. ВыберитеPython, система автоматически создастlaunch.json。
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal"
}
]
}
1. Нажмите рядом с номером строки кода, чтобы добавить точку останова.
2. Можно использовать условные точки останова: щелкните точку останова правой кнопкой мыши и выберите «Редактировать условие».
F10Функция пропуска.F11Войдите внутрь функции.Shift+F11Выйти из функции.1. Просмотрите текущий статус переменной в области «Переменные» панели «Отладка».
2. Вы можете вручную добавить определенные выражения в область «Мониторинг».
1. Введите команды Python в консоли отладки, чтобы проверить состояние программы в режиме реального времени.
2. Может выполнять такие операции, как запрос переменных и вызов функций.
Убедитесь, что Python установлен и добавлен в переменные среды вашей системы, затем загрузите и установите Visual Studio Code.
Откройте код Visual Studio, щелкните значок «Расширения» слева и выполните поиск.Python, а затем установите расширения Python, предоставленные Microsoft.
Введите следующую команду в терминале, чтобы подтвердить путь установки Python:
which python
Или (система Windows):
where python
В коде Visual Studio нажмитеCtrl + Shift + P, введите и выберитеPython: Select Interpreter。
Выберите правильный путь Python в манифесте. Если он не отображается, введите полный путь вручную.
Откройте терминал и выполнитеpython --versionчтобы подтвердить, что выбрана правильная версия интерпретатора Python.
Если вам нужен путь Python к конкретному проекту, вы можете добавить его в корневой каталог проекта..vscode/settings.jsonфайл и добавьте следующий контент:
{
"python.pythonPath": "Ваш полный путь к Python"
}
заменятьПолный путь к вашему Pythonэто реальный путь.
При разработке в VS Code я решаю использовать Anaconda или другие среды, в основном через настройки базового интерпретатора (Интерпретатора). Это гарантирует полную изоляцию зависимостей вашего пакета от среды выполнения программы.
| тип среды | Применимые ситуации | Основные преимущества |
|---|---|---|
| Anaconda | Наука о данных, машинное обучение, глубокое обучение | Он предварительно установлен с большим количеством библиотек научных вычислений и обеспечивает надежное управление базовыми двоичными файлами (такими как DLL). |
| Venv | Общая веб-разработка, скрипты автоматизации | Легкий, быстро запускается и содержит только необходимые для выполнения пакеты. |
Помимо графического интерфейса, для управления средой вы также можете использовать команды встроенного терминала VS Code:
conda env listConda активирует имя средыconda create -n имя python=3.10Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser。
sudo apt update
sudo apt install python3 python3-pip -y
python3Войдите в интерактивную среду Python.имя модуля установки pip3。
sudo apt install wget gpg -y
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
sudo install -o root -g root -m 644 packages.microsoft.gpg /usr/share/keyrings/
sudo sh -c 'echo "deb [arch=amd64 signed-by=/usr/share/keyrings/packages.microsoft.gpg] \
https://packages.microsoft.com/repos/code stable main" > /etc/apt/sources.list.d/vscode.list'
sudo apt update
sudo apt install code -y
pip --version
имя пакета установки pip
Например:pip install requests
pip install --upgrade имя пакета
Например:pip install --upgrade requests
pip list
имя пакета удаления pip
Например:pip uninstall requests
pip list --outdated
имя пакета установки pip == номер версии
Например:pip install requests==2.26.0
pip install -r requirements.txt
использоватьrequirements.txtФайл, в котором перечислены все необходимые имена и версии пакетов.
pip freeze > requirements.txt
Эта команда экспортирует пакеты и версии в текущей среде в виде архива требований.
pip cache purge
Очистите папку кэша pip, чтобы освободить место на диске.
Решение. Проверьте, установлен ли Python, и убедитесь, что каталог установки Python добавлен в системную переменную среды PATH.
Решение: попробуйте добавить--userПараметры, например:имя пакета установки pip --user
Решение. Убедитесь, что сеть в порядке, или попробуйте использовать источник домашнего зеркала, например:имя пакета установки pip -i https://pypi.tuna.tsinghua.edu.cn/simple
venvилиvirtualenv), чтобы избежать конфликтов с глобальными установочными пакетами.requirements.txtуправлять зависимостями.http-v2каталог, чтобы в будущем при установке того же пакета не требовалось повторно загружать его.pip cache dirПросмотрите текущий каталог кэша.pip cache purgeОчистите все кэшированные данные.http-v2папку, но это заставит pip повторно загрузить файл при следующей установке соответствующего пакета.--no-cache-dirПараметры, например:pip install package_name --no-cache-dir。
type()Функция может возвращать тип объекта.
x = 10
print(type(x)) # <class 'int'>
y = "hello"
print(type(y)) # <class 'str'>
isinstance()Используется для проверки принадлежности переменной к определенному типу и поддерживает проверку нескольких типов.
x = 10
print(isinstance(x, int)) # True
print(isinstance(x, str)) # False
print(isinstance(x, (int, float))) # True
type()Относительно строгий, будет возвращен только точный тип.isinstance()Будут рассмотрены отношения наследования, которые чаще используются на практике.Boolean в Python — это основной тип данных в программировании, который представляет два логических состояния: True или False. Это основа всех условных суждений и контроля процессов.
TrueиFalse。bool。а = Истина
б = Ложь
print(type(a)) # Вывод: <class 'bool'>
Внутри Питона,boolцелое числоintподкатегории , чтобы они могли участвовать в числовых операциях:
TrueЧисленно эквивалентно 1.FalseЧисленно эквивалентно 0.print(True + 1) # Вывод: 2 (1 + 1)
print(False * 5) # Вывод: 0 (0 * 5)
Операторы сравнения сравнивают два значения и возвращают логический результат.
| оператор | описывать | пример | результат |
|---|---|---|---|
== |
равный | 10 == 10 |
True |
!= |
не равен | 5 != 10 |
True |
> |
больше, чем | 10 > 5 |
True |
<= |
меньше или равно | 5 <= 5 |
True |
Логические операторы используются для объединения или изменения логических значений или логических выражений.
and: Логическое «и», обе стороныTrueРезультатTrue。or: Логическое «ИЛИ», любая сторонаTrueРезультатTrue。not: Логическое «нет», инвертирующее логическое значение.print(True и False) # Вывод: False
print(True или False) # Вывод: True
print(not True) # Вывод: False
В Python все объекты имеют истинностное значение. Когда объект используется для условного суждения, Python преобразует его вTrueилиFalse:
False(Ложные) объекты включают в себя:None, число 0 (0, 0.0), пустая строка (""), пустой список ([]), пустой кортеж (()), пустой словарь ({}) и пустое множество (set())。True(Истинные) объекты включают в себя: все остальные объекты, кроме значений Falsy (например, ненулевые числа, любой непустой контейнер).if []: # Пустые списки считаются ложными
print("Это не будет выполнено")
еще:
print("Список пуст")
if "hello": # Непустые строки считаются True
print("Строка не пуста")
В Python массив — это структура данных, используемая для хранения нескольких элементов одного типа. Хотя сам Python не имеет встроенного типа массива, вы можете использоватьlistилиarrayМодули для достижения аналогичной функциональности.
listЭто встроенная структура данных Python, которая может хранить многие типы данных, но также может использоваться для моделирования массивов.
мой_список = [1, 2, 3, 4, 5]
print(my_list[0]) # Вывод: 1
Если вам нужен настоящий массив (все элементы должны быть одного типа), вы можете использоватьarrayМоды.
импортировать массив
my_array = array.array('i', [1, 2, 3, 4, 5])
print(my_array[0]) # Вывод: 1
здесь,'i'Указывает, что элементы массива являются целыми числами.
Вот некоторые основные операции:
my_array.append(6)my_array.remove(3)len(my_array)В ситуациях, когда требуются числовые операции,numpyОбеспечивает более мощную поддержку массивов.
импортировать numpy как np
my_numpy_array = np.array([1, 2, 3, 4, 5])
print(my_numpy_array[0]) # Вывод: 1
Массивы NumPy поддерживают многомерные данные и векторизованные операции, что делает их идеальными для обработки больших объемов данных.
Python предоставляет множество способов реализации функций массива.listПрименимо к общим ситуациям,arrayМодули подходят для ситуаций, когда требуются элементы одного и того же типа, тогда какnumpyЭто инструмент выбора для научных вычислений.
для переменныхret_value = [], существует несколько простых и эффективных способов определить, является ли список пустым в языке Python. Поскольку пустой список рассматривается какFalseНиже приведены несколько часто используемых методов суждения.
Это самый популярный метод, предполагающий непосредственную проверку логического значения списка. Если список пуст,notоператор приведёт к тому, что его условие будет оценено как true (True)。
ret_value = []
если не ret_value:
#Выполнить здесь, когда список пуст
print("ret_value — пустой список")
еще:
#Выполнить здесь, если список не пуст
print("ret_value не пустой список")
len()функцияПроверяет, равна ли длина списка 0.
ret_value = []
если len(ret_value) == 0:
print("ret_value — пустой список")
еще:
print("ret_value не пустой список")
== []Непосредственно назначьте переменные пустому литералу списка[]Сделайте сравнение.
ret_value = []
если ret_value == []:
print("ret_value — пустой список")
еще:
print("ret_value не пустой список")
В Python,listЭто динамическая структура данных, в которую можно легко добавлять и удалять элементы.
Новые элементы можно добавлять следующими способами:
append(): добавляет элемент в конец списка.insert(): вставить элемент в указанную индексную позицию.extend(): добавляет элементы другого списка к существующему списку.# Пример нового элемента
мой_список = [1, 2, 3]
my_list.append(4) # [1, 2, 3, 4]
my_list.insert(1, 10) # [1, 10, 2, 3, 4]
my_list.extend([5, 6]) # [1, 10, 2, 3, 4, 5, 6]
Удалить элементы можно с помощью:
pop(): удаление элементов по индексу, по умолчанию удаляется последний элемент.remove(): удаляет первый соответствующий элемент на основе значения.clear(): удалить все элементы из списка.# Пример удаления элемента
мой_список = [1, 2, 3, 4, 5]
my_list.pop() # [1, 2, 3, 4]
my_list.remove(2) # [1, 3, 4]
my_list.clear() # []
В случаях, когда вам нужны элементы одного типа, вы можете использоватьarrayМоды.
append()иextend()Метод применяется кarrayМоды.
import array
my_array = array.array('i', [1, 2, 3])
my_array.append(4) # [1, 2, 3, 4]
my_array.extend([5, 6]) # [1, 2, 3, 4, 5, 6]
remove()иpop()Можно использовать методыarrayМоды.
# Пример удаления элемента
my_array = array.array('i', [1, 2, 3, 4])
my_array.remove(2) # [1, 3, 4]
my_array.pop() # [1, 3]
Python предоставляет множество методов для динамического увеличения и уменьшения массивов.listиarrayМодули подходят для разных нужд. Для получения дополнительных функциональных требований вы также можете рассмотреть возможность использованияnumpy。
В Python,list.count()Это инструмент, специально используемый для статистики.Количество вхождений определенного элементаметод. Это то же самое, что получить длину спискаlen()В отличие от этого, параметр должен быть передан в качестве объекта сравнения.
Синтаксис:list.count(value), который возвращает целое число раз, когда значение появляется в списке. Если значение не существует, возвращается 0.
фрукты = ['яблоко', 'банан', 'яблоко', 'апельсин', 'яблоко']
# Подсчитаем количество вхождений слова «яблоко»
apple_count =fruits.count('яблоко')
print(apple_count) # Вывод: 3
# Подсчитаем несуществующие элементы
Grape_count = Fruits.count('виноград')
print(grape_count) # Вывод: 0
В зависимости от ваших потребностей (ищете ли вы один элемент, несколько элементов или всю статистику), существуют различные рекомендации:
| нуждаться | Рекомендуемый метод | Пример кода |
|---|---|---|
| Посчитайте один конкретный элемент | list.count() |
arr.count(10) |
| Получить общую длину списка | len() |
len(arr) |
| Подсчитайте частоту всех элементов | collections.Counter |
Counter(arr) |
| Количество условий (если больше 5) | выражение генератора | sum(1 for x in arr if x > 5) |
Если вам нужно узнать, сколько раз «все элементы» появляются в списке одновременно, используйтеCounterБудет запускаться много разcount()Гораздо более эффективно (O(n) против O(n^2)).
из коллекций Счетчик импорта
данные = [1, 2, 2, 3, 3, 3, 4]
counts = Счетчик(данные)
print(counts) # Вывод: Counter({3: 3, 2: 2, 1: 1, 4: 1})
print(counts[3]) # Получаем количество раз 3:3
print(counts.most_common(1)) # Получаем элемент с наибольшим количеством вхождений
if x in listСравниватьif list.count(x) > 0Гораздо быстрее, потому чтоinОн остановится, как только найдет первый.count()Будет выполнено только «поверхностное сравнение». Если список содержит другой список, он не будет учитываться внутри подсписка.list.count()Это приведет к резкому падению производительности, поэтому приоритет следует отдатьCounter。Если вы хотите подсчитать количество элементов, соответствующих определенной логике (например, строки длиной более 3), вы можете объединитьsum():
слова = ['привет', 'привет', 'питон', 'а', 'код']
# Подсчитаем количество слов длиной > 3
big_word_count = sum(1 для w в словах, если len(w) > 3)
print(big_word_count) # Вывод: 3
[key, value]。список1 = [
["а", 1],
["б", 2],
["с", 3]
]
список2 = [
["с", 30],
["а", 10],
["д", 40]
]
#Преобразовать список1 в dict
dict1 = {k: v для k, v в списке1}
dict2 = {k: v для k, v в списке2}
# Найти все ключи
all_keys = sorted(set(dict1.keys()) | set(dict2.keys()))
# Объединить результаты
объединен = []
для k во всех_клавишах:
v1 = dict1.get(к)
v2 = dict2.get(к)
merged.append([k, v1, v2])
для строки в слиянии:
печать (строка)
['a', 1, 10]
['b', 2, None]
['c', 3, 30]
['d', None, 40]
Noneнаполнять.[key, value1, value2]。В Python, если у вас есть два списка (например,selected_fields_listиaSqlValuesStr_list), и необходимо перебирать их одновременно, наиболее распространенным и Pythonic способом является использование встроенного методаzip()функция.
zip()Функция упаковывает несколько итерируемых объектов (Iterable) в последовательность кортежей. Каждая итерация цикла удаляет элемент в соответствующей позиции из каждого списка.
импортировать повторно
# Предположим, что это два списка, которые вы получаете после re.split()
selected_fields = "имя,возраст,город"
aSqlValuesStr = "Алиса, 25, Тайбэй"
selected_fields_list = re.split(r',', selected_fields)
aSqlValuesStr_list = re.split(r',', aSqlValuesStr)
# Выполнить цикл
для поля значение в zip(selected_fields_list, aSqlValuesStr_list):
print(f"Поле: {поле}, значение: {значение}")
Поле: имя, значение: Алиса
Поле: возраст, значение: 25
Поле: город, значение: Тайбэй
Когда вы используетеzip()При использовании функций необходимо обратить внимание на следующие моменты:
zip()Итерация остановится на самом коротком списке. еслиselected_fields_listимеет 3 элемента, иaSqlValuesStr_listПри наличии 4 элементов цикл будет выполняться только 3 раза.itertools.zip_longest。#Пример: несовместимая длина списков
список1 = [1, 2, 3]
список2 = ['а', 'б']
для элемента1, элемента2 в zip(список1, список2):
печать(элемент1, элемент2)
#Вывод будет только:
# 1а
#2б
данные = [
[1, 23, 456],
[7890, 12, 3],
[45, 678, 9]
]
# Вычисляем максимальную ширину каждого столбца
col_widths = [max(len(str(row[i])) для строки в данных) для i в диапазоне(len(data[0]))]
# Форматируем вывод
для строки в данных:
print(" ".join(str(val).rjust(col_widths[i]) for i, val в enumerate(row)))
1 23 456
7890 12 3
45 678 9
Сторонние пакетыtabulateВыровненные таблицы можно вывести напрямую.
from tabulate import tabulate
data = [
[1, 23, 456],
[7890, 12, 3],
[45, 678, 9]
]
print(tabulate(data, tablefmt="grid"))
+------+-----+-----+
| 1 | 23 | 456 |
| 7890 | 12 | 3 |
| 45 | 678 | 9 |
+------+-----+-----+
rjust()Выравнивание.tabulateБыстро создавайте красивые таблицы.В следующем примере показано, как распечатать двумерный список. Когда элементfloatИсправлено отображение двух знаков после запятой, остальные элементы выводятся как есть, с сохранением выравнивания полей.
данные = [
[1, 23.456, 456],
[7890.1, 12, 3.5],
[45, 678,9, 9]
]
# Форматируем каждую строку элемента
форматированные_данные = []
для строки в данных:
новая_строка = []
для значения в строке:
если isinstance(val, float):
s = f"{val:.2f}" # float -> два знака после запятой
еще:
s = ул (значение)
new_row.append(ы)
formatted_data.append(новая_строка)
# Вычисляем максимальную ширину каждого столбца
col_widths = [max(len(row[i]) для строки в formatted_data) для i в диапазоне(len(formatted_data[0]))]
# Форматируем вывод
для строки в formatted_data:
print(" ".join(val.rjust(col_widths[i]) for i, val in enumerate(row)))
1 23.46 456
7890.10 12 3.50
45 678.90 9
isinstance(val, float)Определить числа с плавающей запятой.f"{val:.2f}"Отформатируйте число с плавающей запятой до двух десятичных знаков.Предоставляемая вами структура данных представляет собой список, содержащий несколько словарей, где каждый словарь представляет запись временного ряда (например, данные K-линии).
data = [
{'time': 1759028400000, 'open': '109398.3', 'close': '109364.8', 'high': '109489.2', 'low': '109364.8', 'volume': '518.7594'},
{'time': 1759024800000, 'open': '109305.6', 'close': '109398.3', 'high': '109496.4', 'low': '109296.0', 'volume': '757.0290'},
# ...
]
Если вы хотите получить все значения во всех записях (1759028400000, '109398.3', '109364.8'и т. д.) и собрать их в список, вы можете использовать Nested List Comprehension.
Используйте двухуровневое понимание списка для перебора каждого словаря в списке, а затем вызовите.values()Метод получает значения и, наконец, собирает все значения в плоский список.
данные = [
{'время': 1759028400000, 'открытие': '109398.3', 'закрытие': '109364.8', 'высокая': '109489.2', 'низкая': '109364.8', 'объем': '518.7594'},
{'время': 1759024800000, 'открытие': '109305.6', 'закрытие': '109398.3', 'высокая': '109496.4', 'низкая': '109296.0', 'объем': '757.0290'}
]
все_значения = [
ценность
для записи в данных # Пройти каждую запись словаря во внешнем списке
for value in Record.values() # Обход всех значений в записи словаря
]
печать (все_значения)
В результате получается единый список, содержащий все значения:
[1759028400000, '109398.3', '109364.8', '109489.2', '109364.8', '518.7594', 1759024800000, '109305.6', '109398.3', '109496.4', '109296.0', '757.0290']
Если вам нужно извлечь только определенные поля (например, только всеopenцена), вы можете использовать одноуровневое понимание списка:
data = [
{'time': 1759028400000, 'open': '109398.3', ...},
{'time': 1759024800000, 'open': '109305.6', ...}
]
open_prices = [record['open'] for record in data]
print(open_prices)
Результат вывода:
['109398.3', '109305.6']
Понимание списков — это краткий однострочный синтаксис для создания новых списков из существующих списков.
из даты и времени импорта даты и времени
список_данных = [
{'videoid': 'b5HxsaM_E2Y', 'publishedat': datetime(2025, 12, 7, 3, 0, 53), 'rankno': 7, 'viewcount': 913053, 'query': 'бейсбол'},
{'videoid': 'FEbMCBxsoWI', 'publishedat': datetime(2025, 11, 25, 5, 28, 6), 'rankno': 13, 'viewcount': 754598, 'query': 'бейсбол'},
{'videoid': 'nOJUI0PGB68', 'publishedat': datetime (2025, 12, 7, 3, 7, 46), 'rankno': 14, 'viewcount': 748349, 'query': 'бейсбол'},
{'videoid': 'uMHXIudw_w0', 'publishedat': datetime (2025, 12, 2, 10, 1, 38), 'rankno': 8, 'viewcount': 687949, 'query': 'бейсбол'}
]
target_key = 'идентификатор видео'
# Используйте понимание списка: для каждого элемента словаря в data_list извлеките элемент [target_key]
video_ids = [item[target_key] для элемента в data_list]
print(f"Извлеченный ключ: {target_key}")
print("Все значения videoid:")
печать (video_ids)
['b5HxsaM_E2Y', 'FEbMCBxsoWI', 'nOJUI0PGB68', 'uMHXIudw_w0']
Если в некоторых словарях в списке может отсутствовать целевой ключ (например, в некоторых словарях нет ключа `videoid`), использование `item[target_key]` напрямую приведет к ошибке `KeyError`. Вы можете использовать метод `.get()` словаря или условное выражение для его безопасной обработки.
data_with_missing_key = [
{'videoid': 'A1', 'query': 'футбол'},
{'query': 'basketball'}, # Отсутствует ключ 'videoid'
{'videoid': 'C3', 'query': 'Волейбол'}
]
target_key = 'идентификатор видео'
# Вариант A: используйте .get(), чтобы установить значение по умолчанию None (или любое другое значение)
Safe_video_ids_A = [item.get(target_key) для элемента в data_with_missing_key]
# Вывод: ['A1', Нет, 'C3']
# Вариант Б: извлечь только значения с этим ключом
Safe_video_ids_B = [item[target_key] для элемента в data_with_missing_key, если target_key в элементе]
# Вывод: ['A1', 'C3']
print(f"\nРезультаты безопасного извлечения (План Б): {safe_video_ids_B}")
вы изonesymbollist.values()Полученный результат представляет собой объект представления словаря Python.dict_values. Хотя он выглядит как список, это динамическое представление, а не стандартный список, который можно индексировать или изменять.
dict_values([1763510400000, '0.00015218', '0.00015336', '0.00015415', '0.00015067', '1634523'])
Не показыватьdict_values()Чтобы получить содержимое тега, самый простой и распространенный способ — использовать встроенный методlist()Функция приводит его к списку.
Воляdict_valuesперешел кlist()Функция, которая немедленно скопирует все элементы объекта представления в новый стандартный список.
# Предположим, что это полученный вами объект представления dict_values
dict_values_object = your_dictionary.values() # Предположим, что onesymbollist — это словарь
# Шаг: используйте функцию list() для преобразования
result_list = список (dict_values_object)
печать (список_результатов)
[1763510400000, '0.00015218', '0.00015336', '0.00015415', '0.00015067', '1634523']
Если ваша цель — создать неизменяемую последовательность, вы можете использоватьtuple()Функция преобразует его в кортеж.
result_tuple = tuple(dict_values_object)
print(result_tuple)
(1763510400000, '0.00015218', '0.00015336', '0.00015415', '0.00015067', '1634523')
Обратите внимание: если вы просто хотите обрабатывать значения по одному в цикле, вам не нужно явно преобразовывать их в список.dict_valuesСам по себе является итерируемым объектом (Iterable).
# Предположим, что это полученный вами объект представления dict_values
dict_values_object = your_dictionary.values()
print("Выводные элементы один за другим:")
для значения в dict_values_object:
печать (значение)
Короче говоря, используйтеlist(your_dict.values())— это наиболее распространенный способ получить чистый и действенный список значений.
начать сdict_valuesИзвлекает все значения из объекта представления и объединяет их в одну строку, разделенную только запятыми и пробелами (например:1763510400000, '0.00015218', ...), вам необходимо объединить следующие шаги:
dict_valuesПосмотреть объект.", ".join()метод для объединения этих строк.Предположим, ваш исходный словарь называетсяonesymbol_dict, и вам необходимо преобразовать нестроковые значения (например, метки времени) в строки для использования.join()Установите связь.
onesymbol_dict = {
«время»: 1763510400000,
«открыть»: «0,00015218»,
'закрыть': '0,00015336',
«высокий»: «0,00015415»,
«низкий»: «0,00015067»,
'объем': '1634523'
}
# Шаг 1 и усиление; 2. Получите значения и преобразуйте все значения в строки.
# Используйте понимание списков, чтобы гарантировать, что все элементы являются строками
values_as_strings = [str(v) для v в onesymbol_dict.values()]
# Шаг 3: Используйте ', '.join() для объединения этих строк
values_string = ", ".join(values_as_strings)
печать (строка_значений)
Это создаст одну строку, содержимым которой является только значение без каких-либо внешних скобок илиdict_valuesЭтикетка:
1763510400000, 0.00015218, 0.00015336, 0.00015415, 0.00015067, 1634523
Обратите внимание, что в ожидаемом выводе примера значения, отличные от меток времени, заключены в одинарные кавычки:1763510400000, '0.00015218', ...。
Если ваша цель — чтобы строковые значения сохраняли одинарные кавычки в конечном выводе, вам нужно будет добавлять кавычки вручную во время конкатенации. Обычно это требуется при подготовке строк для операторов SQL или определенных форматов.
# Дополнительный шаг: обработка котировок вручную, предполагая, что нецелые значения требуют кавычек
Quote_values = []
для v в onesymbol_dict.values():
если isinstance(v, (str, float)) или (isinstance(v, int) и v< 1000000000000): # 假設小數字串需要引號
quoted_values.append(f"'{v}'")
else:
quoted_values.append(str(v))
final_quoted_string = ", ".join(quoted_values)
print(final_quoted_string)
Это даст вам ожидаемый формат (при условии, чтоtimeКавычки не требуются, можно использовать другие числовые строки):
1763510400000, '0.00015218', '0.00015336', '0.00015415', '0.00015067', '1634523'
isdigit()Метод можно использовать для проверки того, содержит ли строка только числовые символы.
# Пример
строка = "12345"
если строка.isdigit():
print("это число")
еще:
print("Не число")
Уведомление:isdigit()Невозможно обрабатывать десятичные точки или отрицательные знаки.
Если вам нужно проверить строку с десятичной точкой, вы можете удалить десятичную точку перед использованиемisdigit()。
# Пример
строка = "123,45"
если string.replace(".", "").isdigit():
print("это число")
еще:
print("Не число")
Этот метод не работает с отрицательными числами.
Самый распространенный подход — попытаться преобразовать строку в число с плавающей запятой или целое число и перехватить исключение, если преобразование завершится неудачно.
# Пример
строка = "-123,45"
попробуйте:
float(string) # Вместо этого вы можете использовать int(string) для проверки целых чисел
print("это число")
кроме ValueError:
print("Не число")
Регулярные выражения могут точно соответствовать числам, включая целые, десятичные и отрицательные числа.
# Пример
импортировать повторно
строка = "-123,45"
шаблон = r"^-?\d+(\.\d+)?$"
если re.match(шаблон, строка):
print("это число")
еще:
print("Не число")
В простых случаях используйтеisdigit(). В более сложных случаях (например, работа с десятичными или отрицательными числами) рекомендуется использоватьtry-exceptили регулярное выражение.
f-строка (форматированный строковый литерал) — это мощный и эффективный метод форматирования строк, представленный в Python 3.6. Он обеспечивает краткий и легко читаемый способ встраивания значений переменных и выражений в строки.
Основная особенность f-строки: использование префиксов в начале строки.fилиFи используйте фигурные скобки{}содержать то, что должно быть рассчитано и отображено.
Вы можете поместить любое имя переменной непосредственно в фигурные скобки.
имя = "Алиса"
возраст=30
message = f"Здравствуйте, меня зовут {name}, мне {age} лет."
# Вывод: Здравствуйте, меня зовут Алиса, мне 30 лет.
Преимущество f-строки в том, что вы можете поместить любое допустимое выражение Python в фигурные скобки, и оно будет оценено во время выполнения.
цена = 19,99
налог_ставка = 0,05
итого = цена * (1 + ставка_налога)
# Выполняем вычисления внутри f-строки
result = f"Общая цена, включая налог, составляет: {price * (1 + Tax_rate):.2f} юаней."
# Вывод: общая цена, включая налог, составляет 20,99 юаней.
# Функция вызова
защита get_status():
вернуть «ОК»
status_msg = f"Состояние системы: {get_status()}"
# Вывод: Статус системы: ОК
поддерживает фа-струны и.format()Тот же метод, что и в мини-языке спецификатора формата, с использованием двоеточия.:для разделения выражений и спецификаторов формата.
| код формата | использовать | пример | выход |
|---|---|---|---|
:.2f |
Число с плавающей запятой с двумя десятичными знаками | f"{3.14159:.2f}" |
3.14 |
: <10 |
Выровнять по левому краю, ширина 10 | f"{'Name':<10}" |
Name |
: >10 |
Выровнять по правому краю, ширина 10 | f"{'Value':>10}" |
Value |
:^10 |
Выравнивание по центру, ширина 10 | f"{'Hi':^10}" |
Hi |
:, |
Числовой разделитель тысяч | f"{1000000:,}" |
1,000,000 |
Начиная с Python 3.8, f-строка предоставляет удобную функцию отладки, которая позволяет добавлять знак равенства после переменной.=, автоматически отображает имена переменных и их значения.
user_id = 42
is_active = Истина
debug_output = f"Идентификатор пользователя: {user_id=}, статус: {is_active=}"
# Вывод: идентификатор пользователя user_id=42, статус: is_active=True
'...'вы можете использовать двойные кавычки внутри"...",наоборот.{{}}。\Его не разрешается использовать для представления строковых форматов, таких какf"{{'\n'}}"вызовет ошибки.Подтяжки на стрингах{}Внутри вы можете напрямую использоватьint()Функция преобразует переменную обратно в целочисленный тип. Это самый ясный и прямой метод.
inta = 12 # при условии необработанного целого числа
float_a = inta * 2.0 # Результат — 24,0 (число с плавающей запятой)
# Преобразование числа с плавающей запятой обратно в целое число непосредственно в f-строке
result_str = f"abc def {int(float_a)}"
print(f"Исходное значение (float_a): {float_a}")
print(f"Отформатированный результат: {result_str}")
Вы можете использовать коды целочисленного формата из мини-языка форматирования.dили.0fдля управления выходным форматом.
:dиспользовать:dPython просят рассматривать значение как целое число при отображении. если переменнаяa— это число с плавающей запятой, Python автоматически округлит его до ближайшего целого числа перед отображением (если результат вашего расчета равен $24,0$, он отобразит $24$).
float_a = 24,0
result_d = f"abc def {float_a:d}"
# Вывод: abc def 24
:.0fиспользовать:.0fозначает форматирование значения как числа с плавающей запятой, но требует 0 цифр после десятичной точки. Это также приведет к округлению результатов перед отображением.
float_a = 24,0
result_0f = f"abc def {float_a:.0f}"
# Вывод: abc def 24
Если ваша цель — обеспечить, чтобы результат был абсолютным целым числом без десятичной точки, рекомендуется использовать вариант 1:
str = f"abc def {int(a)}"
В Python,re.split()ФункцияreМощный инструмент в модуле (регулярное выражение), используемый для разделения строк в соответствии с разделителями (шаблонами), определенными в регулярных выражениях, и возврата результатов в виде списка (списка).
re.split(pattern, string, maxsplit=0, flags=0)
pattern: шаблон регулярного выражения, используемый для разделения строк.string: целевая строка, которую нужно обрезать.maxsplit(Необязательно): укажите максимальное количество разрезов. Значение по умолчанию 0 означает отсутствие ограничений на количество разрезов.flags(необязательно): флаги, управляющие поведением регулярных выражений (например,re.IGNORECASE)。Используйте регулярные выражения для определения нескольких или сложных разделителей.
импортировать повторно
text = "яблоко,банан;апельсин-виноград"
# Используйте запятую, точку с запятой или дефис в качестве разделителя
результат = re.split(r'[;,-]', текст)
печать (результат)
# Вывод: ['яблоко', 'банан', 'апельсин', 'виноград']
со стандартными струнамиsplit()другой,re.split()Несколько последовательных разделителей (например, несколько пробелов) можно легко обработать и игнорировать.
текст = "Слово1 Слово2 Слово3"
# Используйте \s+ для соответствия одному или нескольким символам пробелов в качестве разделителей
результат = re.split(r'\s+', текст)
печать (результат)
# Вывод: ['Слово1', 'Слово2', 'Слово3']
Если установленоmaxsplit, операция вырезания будет выполнена только указанное количество раз, а остальные детали останутся в списке последним элементом.
текст = "один:два:три:четыре"
# Разрезать только один раз
результат = re.split(r':', text, maxsplit=1)
печать (результат)
# Вывод: ['один', 'два:три:четыре']
Если вы поместите шаблон-разделитель внутри скобок(), сам разделитель также будет включен между элементами списка результатов.
текст = "15 января 2025 г."
# Поместите дефисы в круглые скобки, чтобы они сохранились
результат = re.split(r'(-)', текст)
печать (результат)
# Вывод: ['2025', '-', '01', '-', '15']
startswith()это строка Python (str) метод объекта, используемый для определения того, начинается ли строка с указанной подстроки.
Если оно соответствует, вернитеTrue; В противном случае вернитеFalse。
str.startswith(prefix[, start[, end]])
prefix: Начальная строка для сравнения может быть одной строкой или кортежем строк.start(Необязательно): укажите, с какой позиции индекса исходной строки следует начинать оценку.end(Необязательно): укажите позицию индекса (исключая конец).Логическое значение: если строка начинается с указанного префикса, вернитеTrue,в противном случаеFalse。
text = "Программирование на Python"
#Основное использование
print(text.startswith("Py")) # True
print(text.startswith("Java")) # False
#Указать диапазон
print(text.startswith("thon", 2)) # True (начиная с индекса 2 — "thon")
# несколько выравниваний
print(text.startswith(("Py", "Java", "C"))) # Верно, потому что любое совпадение
# Не чувствителен к регистру (можно сначала преобразовать в нижний регистр)
print(text.lower().startswith("py")) # True
URL = "https://openai.com"
если url.startswith("https://"):
print("URL безопасного соединения")
files = ["data1.csv", "data2.csv", "readme.txt"]
csv_files = [f for f in files if f.startswith("data")]
print(csv_files) # ['data1.csv', 'data2.csv']
Чтобы определить, «заканчивается» ли строка определенным текстом, вы можете использоватьendswith()методы, синтаксис иstartswith()такой же.
имя файла = "отчет.pdf"
если имя_файла.endswith(".pdf"):
print("Это PDF-файл")
В Python строки являются неизменяемыми объектами. Чтобы удалить последний символ, обычно используется разрезание строки для создания новой строки.
текст = "Привет!"
#Метод 1: используйте нарезку
новый_текст = текст[:-1]
print(new_text) #Вывод: Здравствуйте
#Метод 2: используйте rstrip() для удаления определенных конечных символов
text2 = "Привет!!!"
новый_текст2 = text2.rstrip("!")
print(new_text2) #Вывод: Здравствуйте
#Метод 3: убедитесь, что он не пуст, а затем удалите последний символ.
если текст:
текст = текст[:-1]
печать (текст)
Hello
Hello
Hello
text[:-1]Подстрока от начала до предпоследнего символа будет удалена.rstrip(chars)Указанные символы в конце (не ограничиваясь одним) можно удалить.Чтобы удалить ведущие символы, используйте:
text = text[1:]
s[:-1]。rstrip()。Учитывая строкуstr1, мы надеемся найти вstrAилиstrBТа часть, которая предшествует. Например:
str1 = "Hello World, this is a test. Stop here or continue."
strA = "Stop"
strB = "continue"
Цель состоит в том, чтобы получить"Hello World, this is a test. "。
re.split()Вы можете разделить строку на основе нескольких ключевых слов и взять первую часть:
import re
def get_substring_before(text, strA, strB):
result = re.split(f"{re.escape(strA)}|{re.escape(strB)}", text, maxsplit=1)[0]
return result
str1 = "Hello World, this is a test. Stop here or continue."
strA = "Stop"
strB = "continue"
print(get_substring_before(str1, strA, strB)) # "Hello World, this is a test. "
re.search()можно использовать для сопоставленияstrAилиstrBи получите содержимое перед сопоставлением:
import re
def get_substring_before(text, strA, strB):
match = re.search(f"{re.escape(strA)}|{re.escape(strB)}", text)
return text[:match.start()] if match else text
str1 = "Hello World, this is a test. Stop here or continue."
print(get_substring_before(str1, "Stop", "continue")) # "Hello World, this is a test. "
find()Вы можете вручную выполнить поиск самого раннегоstrAилиstrB, а затем извлеките соответствующую часть:
def get_substring_before(text, strA, strB):
indexA = text.find(strA)
indexB = text.find(strB)
indices = [i for i in [indexA, indexB] if i != -1]
first_index = min(indices, default=len(text))
return text[:first_index]
str1 = "Hello World, this is a test. Stop here or continue."
print(get_substring_before(str1, "Stop", "continue")) # "Hello World, this is a test. "
re.split()Самый простой, подходит для одиночного поиска.re.search()Обеспечьте более гибкое регулярное сопоставление.find()Метод является наиболее эффективным и подходит для простой обработки строк.значения = ["str1", "str2", 123, "str3", 456]
s = ", ".join(str(v) для v в значениях)
print(s) # Вывод: str1, str2, 123, str3, 456
def join_values(*args, sep=", "):
return sep.join(str(v) для v в args)
print(join_values("str1", "str2", 88, "str3"))
# Вывод: строка1, строка2, 88, строка3
данные = {
"str1": "привет",
"str2": "мир",
"int1": 123,
"str3": "ок"
}
# Сортируем по ключу и затем присоединяемся
s = ", ".join(str(data[k]) for k in sorted(data.keys()))
print(s) # привет, мир, 123, ок
s = ", ".join(f"{k}={v}" для k, v в data.items())
печать(и)
# Вывод: str1=привет, str2=мир, int1=123, str3=ok
rows = [
{"str1": "A", "int1": 10},
{"str1": "B", "int1": 20},
]
for row in rows:
print(", ".join(str(v) for v in row.values()))
# A, 10
# B, 20
def join_values(values, sep=", ", quote=False):
если цитировать:
# Используйте полные одинарные кавычки ''
return sep.join(f"'{v}'" для v в значениях)
еще:
return sep.join(str(v) для v в значениях)
значения = ["str1", "str2", 88, "str3"]
print(join_values(значения, кавычки=False))
# Вывод: строка1, строка2, 88, строка3
print(join_values(значения, кавычки=True))
# Вывод: «str1», «str2», «88», «str3»
def join_args(*args, sep=", ", quoted=False):
if quoted:
return sep.join(f"‘{v}’" for v in args)
return sep.join(str(v) for v in args)
print(join_args("str1", "str2", 88, "str3", quoted=True))
# ‘str1’, ‘str2’, ‘88’, ‘str3’
data = {"str1": "hello", "str2": "world", "int1": 123}
print(join_values(data.values(), quoted=True))
# ‘hello’, ‘world’, ‘123’
def join_key_value(d, sep=", ", quoted=False):
if quoted:
return sep.join(f"{k}=‘{v}’" for k, v in d.items())
return sep.join(f"{k}={v}" for k, v in d.items())
print(join_key_value(data, quoted=True))
# str1=‘hello’, str2=‘world’, int1=‘123’
Питонre.matchФункция в модуле регулярных выражений, используемая для сопоставления с начала строки.
Если совпадение прошло успешно, вернитеMatchобъект; в противном случае возвратNone。
re.match(pattern, string, flags=0)
Описание параметра:
pattern: Соответствующее регулярное выражение.string: строка, которую нужно проверить.flags: Необязательный параметр, используемый, например, для изменения поведения сопоставления.re.IGNORECASE。group(n):Вернуться к первомуnзахваченные подгруппы,n=0Верните весь матч.start(): Возвращает начальную позицию матча.end(): Возвращает конечную позицию совпадения.span(): Возвращает соответствующий диапазон (начало, конец).импортировать повторно
#Определяем строку
text = "123 Привет, мир!"
# Используйте re.match для сопоставления чисел с начала
match = re.match(r"(\d+)\s+(.*)", text)
если совпадение:
print(f"Весь результат сопоставления: {match.group(0)}") # 123 Hello World!
print(f"Часть числа: {match.group(1)}") # 123
print(f"Текстовая часть: {match.group(2)}") # Привет, мир!
еще:
print("совпадение не удалось")
Полный результат сопоставления: 123 Hello World!
Числовая часть: 123
Текстовая часть: Привет, мир!
re.matchСоответствует только с начала строки, если начало не совпадает, вернутьNone。re.searchилиre.findall。Регулярное выражение (сокращенно Regex) — это синтаксис, используемый для описания правил сопоставления строк. Он часто используется для поиска, замены или проверки строк.
на PythonreВ модулеpatternЭто основная часть определения этих правил.
\d: Соответствует любому числу (0–9).\D: Соответствует всему, что не является числом.\w: Соответствует любому отдельному символу (букве, цифре, подчеркиванию).\W: Соответствует любому неодиночному символу.\s: Соответствует любому пробельному символу (пробелу, табуляции и т. д.).\S: Соответствует любому символу без пробелов..: Соответствует, за исключением символов новой строки (\n), кроме любого отдельного символа.*: Соответствует предыдущему выражению 0 или более раз.+: Соответствует предыдущему выражению 1 или более раз.?: Соответствует предыдущему выражению 0 или 1 раз.{n}: Соответствует предыдущему выражению ровно n раз.{n,}: Соответствует предыдущему выражению как минимум n раз.{n,m}: Соответствует предыдущему выражению не менее n раз, но не более m раз.^: соответствует началу строки.$: соответствует концу строки.\b: Соответствует границам слов (например, началу или концу слова).\B: Соответствует границам, не содержащим слов.(...):Group, запишите содержимое в скобки.|: Логическое «или», напримерa|bсоответствоватьaилиb。(?:...): группирует, но не захватывает контент.(?=...): Заглядывая вперед, за совпадением должен следовать указанный контент.(?!...): Негативный обзор, соответствие не может сопровождаться указанным содержимым.(?<=...): Прямой просмотр, сопоставлению должно предшествовать указанное содержимое.(?<!...): Отрицательный ретроспективный анализ, сопоставлению не может предшествовать указанный контент.импортировать повторно
# Пример 1: Сопоставление содержимого, начинающегося с цифры
шаблон = r"^\d+"
текст = "123abc"
match = re.match(шаблон, текст)
если совпадение:
print(f"Результат сопоставления: {match.group()}") # Вывод: 123
#Пример 2: Сопоставление текста после чисел
шаблон = r"(\d+)\s+(.*)"
text = "123 Привет, мир"
match = re.match(шаблон, текст)
если совпадение:
print(f"Часть числа: {match.group(1)}") # Вывод: 123
print(f"Текстовая часть: {match.group(2)}") # Вывод: Hello World
re.search()Используется для поиска первого совпадения регулярного выражения в строке и его возврата.MatchОбъект, возвращаемый, если совпадений нетNone。
импортировать повторно
text = «Привет, 2024!»
match = re.search(r"\d+", текст)
если совпадение:
print("Найден номер:", match.group()) # 2024
когдаre.search()Когда совпадение найдено, оно возвращаетMatchОбъекты могут получать доступ к информации следующими способами:
group(): вернуть соответствующую строкуstart(): соответствующий начальный индексend():Конечный индекс совпаденияspan():Вернуть (начало, конец) диапазона индексовимпортировать повторно
text = "Python 3.10 великолепен!"
match = re.search(r"\d+\.\d+", text)
если совпадение:
print("Сопоставить содержимое:", match.group()) # 3.10
print("Начальный индекс:", match.start()) # 7
print("Конечный индекс:", match.end()) # 11
print("диапазон:", match.span()) # (7, 11)
через скобки()создать группу и использоватьgroup(n)для извлечения соответствующего соответствующего контента.
импортировать повторно
text = "Джон Доу, Возраст: 25"
match = re.search(r"(\w+) (\w+), Возраст: (\d+)", text)
если совпадение:
print("Фамилия:", match.group(1)) # Джон
print("name:", match.group(2)) # Доу
print("Возраст:", match.group(3)) # 25
re.search()Возвращается только первый соответствующий результат, тогда какre.findall()Все совпадающие результаты будут возвращены.
import re
text = "Price: $10, Discount: $2, Tax: $1"
match = re.search(r"\$\d+", text)
print("re.search:", match.group()) # $10
matches = re.findall(r"\$\d+", text)
print("re.findall:", matches) # ['$10', '$2', '$1']
re.search()Подходит для поиска первого результата сопоставления и может использоваться дляMatchОбъект для получения подробной информации. Для нескольких совпадающих результатов используйтеre.findall()。
В регулярном выражении(...)Соответствующий контент будет записан и сохранен вgroup(n), но не группа захвата(?:...)Он используется только для организационной структуры и не влияет на номер группы, поэтому сопоставление происходит быстрее.
Если используется в регулярном выражении()организовать условия сопоставления, которые повлияютgroup(n)число. использовать(?:...)Это гарантирует, что индекс группы останется неизменным.
import re
text = "2024-03-12"
pattern = r"(\d{4})-(?:\d{2})-(\d{2})"
match = re.search(pattern, text)
print(match.group(1)) # 2024
print(match.group(2)) # 12
использовать(?:...|...)могу позволить|Оператор влияет на сопоставление содержимого, но не на групповой доступ.
import re
text = "bar123"
pattern = r"(?:foo|bar|baz)\d+"
match = re.search(pattern, text)
print(match.group()) # bar123
При анализе параметров Chrome используйте(?:...)Это гарантирует, что формат соответствия не повлияет на номер группы.
import re
cmdline = '--user-data-dir="C:\\Users\\moirg\\AppData\\Local\\Google\\Chrome\\User Data"'
match = re.search(r'--user-data-dir=(?:"([^"]+)"|(\S+))', cmdline)
user_data_dir = match.group(1) or match.group(2)
print(user_data_dir) # C:\Users\moirg\AppData\Local\Google\Chrome\User Data
(?:...)Он может повысить производительность регулярных выражений, избежать влияния на индекс группы и подходит для|Операции и сопоставление конкретных условий делают код более эффективным и понятным.
import datetime
now = datetime.datetime.now()
print(now)
dt = datetime.datetime(2025, 7, 2, 14, 30, 0)
print(dt)
now = datetime.datetime.now()
formatted = now.strftime("%Y-%m-%d %H:%M:%S")
print(formatted)
dt_str = "2025-07-02 14:30:00"
parsed = datetime.datetime.strptime(dt_str, "%Y-%m-%d %H:%M:%S")
print(parsed)
now = datetime.datetime.now()
delta = datetime.timedelta(days=7)
next_week = now + delta
print(next_week)
today = datetime.date.today()
print(today)
dt1 = datetime.datetime(2025, 7, 1)
dt2 = datetime.datetime(2025, 7, 2)
print(dt1 < dt2)
dt1 = datetime.datetime(2025, 7, 1, 12, 0, 0)
dt2 = datetime.datetime(2025, 7, 2, 14, 30, 0)
diff = dt2 - dt1
print(diff)
print(diff.total_seconds())
сегодня = дата-время.дата.сегодня()
print(today.weekday()) # 0 = понедельник, 6 = воскресенье
Когда один объект datetime не имеет часового пояса (наивный), а другой имеет часовой пояс (осведомлен) и вычитается, он выдает:
TypeError: can't subtract offset-naive and offset-aware datetimes
from datetime import datetime
def is_aware(dt):
return dt.tzinfo is not None and dt.tzinfo.utcoffset(dt) is not None
def is_naive(dt):
return not is_aware(dt)
dt1 = datetime.now() # naive
dt2 = datetime.now().astimezone() # aware
print(is_naive(dt1), is_aware(dt1))
print(is_naive(dt2), is_aware(dt2))
Подходит для ситуаций в разных часовых поясах или когда требуется точный расчет времени.
из даты и времени импорта даты и времени, часового пояса
sql_dt = sql_dt.replace(tzinfo=timezone.utc) # поддержка передачи данных SQL
now_dt = datetime.now(timezone.utc) # Использовать информацию о текущем времени
разница = now_dt - sql_dt
печать(diff.total_секунды())
sql_dt = sql_dt.replace(tzinfo=None)
now_dt = datetime.now()
diff = now_dt - sql_dt
В Python вы можете использовать встроенные модулиstatisticsизstdev()илиpstdev()Рассчитайте стандартное отклонение выборки или стандартное отклонение генеральной совокупности.
статистика импорта
соотношения = [2,3, 2,8, 3,1, 2,5, 3,0]
# средний
среднее = сумма(отношения) / len(отношения)
#Выборочное стандартное отклонение (n-1)
std_sample = статистика.stdev(отношения)
#Стандартное отклонение матрицы (n)
std_population = статистика.pstdev(коэффициенты)
print(f"Среднее: {среднее:.2f}")
print(f"Стандартное отклонение выборки: {std_sample:.3f}")
print(f"Стандартное отклонение населения: {std_population:.3f}")
Средний: 2,74
Стандартное отклонение выборки: 0,303
Стандартное отклонение населения: 0,271.
Если вы не хотите полагаться наstatisticsМодуль, вы можете рассчитать самостоятельно, используя математические формулы:
соотношения = [2,3, 2,8, 3,1, 2,5, 3,0]
среднее = сумма(отношения) / len(отношения)
#Стандартное отклонение (население)
дисперсия = sum((x - среднее) ** 2 для x в отношениях) / len(отношения)
std_dev = дисперсия ** 0,5
print(f"Стандартное отклонение: {std_dev:.3f}")
Стандартное отклонение: 0,271
statistics.stdev(): стандартное отклонение выборки (деленное наn-1)statistics.pstdev(): Родительское стандартное отклонение (деленное наn)pstdev()stdev()avg = sum(data) / len(data)statistics.stdev(data)statistics.pstdev(data)# Пример цветового кода ANSI
print("\033[31м красный текст\033[0м")
print("\033[32м зеленый текст\033[0м")
print("\033[33myellow text\033[0m")
print("\033[34м синий текст\033[0м")
print("\033[35м фиолетовый текст\033[0м")
print("\033[голубой текст длиной 36 м\033[0 м")
print("\033[37м белый текст\033[0м")
print("\033[1;31м жирный красный текст\033[0м")
print("\033[42 м зеленый фоновый текст\033[0 м")
# Формат: \033[стиль; цвет переднего плана; цвет фона м
# Стиль: 0=по умолчанию, 1=жирный, 4=подчеркивание
# Цвет переднего плана: 30~37
# Цвет фона: 40~47
print("\033[1;33;44m жирный желтый текст + синий фон\033[0m")
Защиту color_text(текст, color_code):
верните f"\033[{color_code}m{text}\033[0m"
print(color_text("Внимание!", "1;31")) # Жирный красный
print(color_text("Успех!", "1;32")) # Жирный зеленый
импортсистем
если sys.stdout.isatty():
print("Терминал может поддерживать цвета ANSI")
еще:
print("Это может быть файл или среда вывода, не поддерживающая цвет")
импорт колорамы
колорама.init()
print("\033[32mЭтот текст должен быть зеленым\033[0m")
защита support_ansi():
попробуйте:
print("\033[31м тестовый красный\033[0м")
вернуть истину
кроме:
вернуть ложь
print("ANSI поддерживается", если support_ansi(), иначе "ANSI не поддерживается")
colorama。В Python,input()Сама функция не поддерживаетTabЗавершено автоматически.
Для достижения этой функции вы можете объединитьreadlineМодуль, который позволяет пользователям использоватьTabВыполните автодополнение (аналогично Bash или IPython).
импортировать строку чтения
# Определить список строк, которые можно дополнить
СЛОВА = ['яблоко', 'банан', 'вишня', 'виноград', 'апельсин', 'арбуз']
def Completer(текст, состояние):
"""Функция автозаполнения: сравнение доступных строк на основе входных префиксов"""
options = [w вместо w в WORDS, если w.startswith(text)]
если состояние < Лен (варианты):
варианты возврата [состояние]
еще:
возврат Нет
# Включить функцию завершения
readline.set_completer(завершитель)
readline.parse_and_bind('вкладка: завершена')
# Пользовательский ввод (поддерживает Tab)
user_input = input("Введите название фрукта (для завершения можно нажать Tab): ")
print(f"Вы ввели: {user_input}")
readline.set_completer()Установите логику автозаполнения.readline.parse_and_bind('tab: complete')позволятьTabКлюч запускает автозаполнение.completer(text, state):
text— это введенный в данный момент текст.stateПредставляет соответствующий элемент (0, 1, 2...).None。Вы также можете обновить список завершения на основе текущего контекста или динамического содержимого:
импортировать строку чтения
Защиту Dynamic_completer (текст, состояние):
current_words = ['кошка', 'автомобиль', 'собака', 'утка', 'олень']
options = [w вместо w в current_words, если w.startswith(text)]
если состояние < Лен (варианты):
варианты возврата [состояние]
возврат Нет
readline.set_completer(dynamic_completer)
readline.parse_and_bind('вкладка: завершена')
команда = input("Введите имя животного: ")
print("Вы вводите:", команда)
readlineМодуль находится вLinux / macOSВышеуказанные пресеты доступны.pip install pyreadline3
readlineМодули позволяютinput()Поддерживает завершение табуляции.pyreadline3набор.Самый распространенный цикл используется для запуска фиксированного количества раз или последовательности.
# от 0 до 4
для меня в диапазоне (5):
печать(я) #0,1,2,3,4
#Укажите начальную точку, конечную точку и размер шага
для я в диапазоне (2, 10, 2):
печать(я) #2,4,6,8
Непосредственно перебирать списки, строки, словари и т. д.
фрукты = ["яблоко", "банан", "вишня"]
для фруктов во фруктах:
принт(фрукты)
для ch в «привет»:
печать (ч)
#Перебор словаря
person = {"name": "Том", "возраст": 25}
для ключа значение в person.items():
печать (ключ, значение)
Он всегда будет выполняться, если условие истинно.
count = 0
while count < 5:
print(count)
count += 1
Контролируйте процесс цикла.
для меня в диапазоне (10):
если я == 3:
продолжить # пропустить этот раз
если я == 7:
перерыв # Закончить раньше
распечатать(я)
Вернитесь в круг и поместите его обратно в круг.
for i in range(3):
for j in range(2):
print(f"i={i}, j={j}")
Вы можете добавить либо на время, либо на времяelse, будет выполнено только «нормальное завершение (без перерыва)».
для меня в диапазоне (5):
распечатать(я)
еще:
print("Цикл завершается нормально")
Метод краткого письма позволяет завершить цикл и сгенерировать список в одну строку.
squares = [x**2 for x in range(5)]
print(squares) # [0,1,4,9,16]
for in range(): Подходит для фиксированного времени или последовательности.для итерируемого объекта: подходит для обработки списков, строк и словарей.while: Подходит для циклов с неопределенным количеством раз и заканчивающихся в соответствии с условиями.break / continue / else: Управляйте процессом цикла.Python использует оператор try...кроме для перехвата и обработки ошибок, возникающих во время выполнения программы, чтобы предотвратить ее сбой.
попробуйте:
# Код, который может вызывать исключения
результат=10/0
кроме ZeroDivisionError:
# Код, выполняемый при возникновении определенного исключения
print("Делитель не может быть равен нулю")
кроме исключения как e:
#Перехватываем все остальные типы исключений
print(f"Произошла ошибка: {e}")
еще:
# Выполнить, если в блоке try не возникает исключений
print("работает нормально")
наконец:
# Будет выполнено независимо от возникновения исключения
print("Очистить ресурсы или закрыть файлы")
Вы можете использовать кортежи в исключении для одновременной обработки нескольких типов ошибок.
попробуйте:
# Выполняем операции
пройти
кроме (ValueError, TypeError):
print("Введенный тип данных или значение неверен")
Используйте ключевое слово raise, чтобы вручную инициировать исключения на основе логических требований.
age = -1
if age < 0:
raise ValueError("年齡數值不可為負數")
классМойКласс:
def __init__(self, значение):
self.value = значение
Защитный дисплей (сам):
print(f"Значение: {self.value}")
объект = МойКласс(10)
obj.display() # Вывод: Значение: 10
Статические методы определяются с помощью декоратора @staticmethod и не имеют ничего общего с категориями и объектами. Они не могут получить доступ к свойствам категории или свойствам объекта. Применяется к некоторым инструментальным функциям:
класс МойКласс:
@staticmethod
Защиту добавить(а, б):
вернуть а + б
результат = MyClass.add(5, 3)
print(result) # Вывод: 8
Методы класса определяются с помощью декоратора @classmethod, первым параметром является сам класс (обычно называемый cls), а к атрибутам класса можно получить доступ:
класс МойКласс:
количество = 0
@classmethod
защита приращения_count (cls):
cls.count += 1
МойКласс.increment_count()
print(MyClass.count) # Вывод: 1
Python поддерживает наследование классов. Подклассы могут наследовать свойства и методы родительского класса и переопределять методы родительского класса:
Родитель класса:
защита приветствия (сам):
print("Привет от родителя!")
класс Ребенок (Родитель):
защита приветствия (сам):
print("Привет от Чайлда!")
объект = Ребенок()
obj.greet() # Вывод: Привет от ребенка!
Атрибуты категории принадлежат всей категории и являются общими для всех объектов; Атрибуты объекта принадлежат каждому объекту:
класс МойКласс:
class_attr = "Я атрибут класса"
def __init__(self, значение):
self.instance_attr = значение
obj1 = МойКласс(10)
obj2 = МойКласс(20)
print(MyClass.class_attr) # Вывод: я атрибут класса
print(obj1.instance_attr) # Вывод: 10
print(obj2.instance_attr) # Вывод: 20
Все классы в Python по умолчанию наследуются от объекта, который является встроенным базовым классом, предоставляющим некоторые базовые методы, такие как __str__ и __eq__:
класс MyClass (объект):
def __init__(self, значение):
self.value = значение
защита __str__(сам):
return f"MyClass со значением {self.value}"
объект = МойКласс(5)
print(obj) # Вывод: MyClass со значением 5
В Python наследование классов позволяет подклассам (производный класс) наследовать свойства и методы родительского класса (базовый класс) для повторного использования кода. Например:
Родитель класса:
защита приветствия (сам):
print("Привет от родителя!")
класс Ребенок (Родитель):
пройти
с = Ребенок()
c.greet() # Вывод: Привет от родителя!
Подклассы могут переопределять (Override) методы родительского класса и переписывать его функции:
Родитель класса:
защита приветствия (сам):
print("Привет от родителя!")
класс Ребенок (Родитель):
защита приветствия (сам):
print("Привет от Чайлда!")
с = Ребенок()
c.greet() # Вывод: Привет от ребенка!
В подклассе вы можете вызвать метод родительского класса через super() и расширить поведение родительского класса:
Родитель класса:
защита приветствия (сам):
print("Привет от родителя!")
класс Ребенок (Родитель):
защита приветствия (сам):
супер().приветствие()
print("Привет от Чайлда!")
с = Ребенок()
c.greet()
# Вывод:
# Привет от Родителя!
# Привет от Чайлда!
Python поддерживает множественное наследование, а подклассы могут наследовать несколько родительских классов одновременно:
класс Родитель1:
защита приветствия (сам):
print("Привет от Parent1!")
класс Родитель2:
защита приветствия (сам):
print("Привет от Parent2!")
класс Child(Parent1, Parent2):
пройти
с = Ребенок()
c.greet() # Вывод: Привет от Parent1! (согласно очередности наследования)
Множественное наследование использует MRO (порядок разрешения методов) для определения порядка разрешения методов. Это можно проверить с помощью атрибута `__mro__`:
печать(Child.__mro__) # Вывод: (, , , )
Используйте модуль abc для определения абстрактного базового класса, чтобы заставить подклассы реализовывать определенные методы:
из abc импорт ABC, абстрактный метод
класс AbstractParent(ABC):
@abstractmethod
защита приветствия (сам):
пройти
класс Child(AbstractParent):
защита приветствия (сам):
print("Привет от Чайлда!")
с = Ребенок()
c.greet() # Вывод: Привет от ребенка!
классКлассB:
защита приветствия (сам):
print("Привет из класса B!")
# Динамически создать временный класс, унаследованный от ClassB
TempClass = type('TempClass', (ClassB,), {
'greet': лямбда self: (print("Привет от TempClass!"), super(TempClass, self).greet())[0]
})
#Создаем экземпляр и тестируем
темп = ТемпКласс()
temp.greet()
type('TempClass', (ClassB,), {...})greetМетод состоит в том, чтобы сначала распечатать новое сообщение, а затем передатьsuper()вызвать родительскую категориюgreet。
Hello from TempClass!
Hello from ClassB!
Предположим, есть две категории.AClassиBClass, у них есть функции с одинаковым именем и параметрами.
Мы хотим иметь возможность легко переключать используемые категории без необходимости изменения основной логики программы.
класс АКласс:
процесс определения (я, данные):
print(f"Обработка AClass: {data}")
результат определения (сам):
вернуть «результат из AClass»
класс BКласс:
процесс определения (я, данные):
print(f"Обработка BClass: {data}")
результат определения (сам):
вернуть «результат из BClass»
# Вы можете контролировать, какую категорию использовать, через настройки
USE_A = Истина
#Динамический выбор категорий
SelectedClass = AClass, если USE_A, иначе BClass
# Создайте экземпляр и используйте его
объект = ВыбранныйКласс()
obj.process("Тестовые данные")
печать(obj.result())
Обработка AClass: тестовые данные
Результаты AClass
Обработка BClass: тестовые данные
Результаты BClass
защита get_class (имя):
отображение = {
«А»: Класс А,
«Б»: BКласс
}
return Mapping.get(name, AClass) # По умолчанию — AClass
# Динамический выбор
cls = get_class("B")
объект = кл()
obj.process("Тестовые данные")
В Python,Не обязательно требуетсяНаписан как C++ или Javaabstract class.
Python принимает «утиную типизацию». Пока объекты имеют одинаковые имена методов и поведение, их можно считать совместимыми.
класс АКласс:
процесс определения (я, данные):
print(f"Обработка AClass: {data}")
класс BКласс:
процесс определения (я, данные):
print(f"Обработка BClass: {data}")
защита запуска (объект):
obj.process("data") # Нет необходимости указывать тип, пока есть этот метод
запустить (АКласс())
запустить (BКласс())
Обработка класса A: данные
Обработка B-класса: данные
Хотя Python не требует соблюдения типов, если вы хотите четко определить интерфейс при групповой разработке или больших проектах, вы можете использоватьabcМоды.
из abc импорт ABC, абстрактный метод
класс BaseClass (ABC):
@abstractmethod
процесс определения (я, данные):
пройти
класс AClass(БазовыйКласс):
процесс определения (я, данные):
print(f"Обработка AClass: {data}")
класс BClass(БазовыйКласс):
процесс определения (я, данные):
print(f"Обработка BClass: {data}")
# BaseClass() сообщит об ошибке, поскольку абстрактный метод не реализован
abcМоды.В Python,Модульэто файл, содержащий программный код, обычно с расширением файла.pyКонец. Модули могут определять функции, категории, переменные, а также могут содержать исполняемый код для облегчения повторного использования и структурирования программы.
Python черезimportКлючевое слово для представления модуля, например:
импорт математики
print(math.sqrt(16)) # Вывод 4.0
Разработчики могут создавать свои собственные моды. Например, создайтеmymodule.py:
# mymodule.py
def greet(name):
return f"Hello, {name}!"
Используйте в другом файле программы:
import mymodule
print(mymodule.greet("Alice"))
os: Обработка операций, связанных с операционной системой.sys: доступ к информации, связанной с интерпретатором Python.datetime: Дата и время обработки.math: Предоставляет математические функции.random: генерировать случайные числа.В Python,УпаковкаЭто способ организации модулей. Пакет — это каталог, содержащий несколько модулей, что упрощает управление и обслуживание программы благодаря иерархической структуре.
__init__.pyархив (опущен в Python 3.3+, но добавлен, чтобы помочь четко определить набор).Создайте файл с именемmypackageКомплект:
mypackage/
│── __init__.py
│── module1.py
└── module2.py
module1.pyпример:
def add(a, b):
return a + b
module2.pyпример:
def multiply(a, b):
return a * b
импортировать mypackage.module1
импортировать mypackage.module2
print(mypackage.module1.add(2, 3)) # Вывод 5
print(mypackage.module2.multiply(2, 3)) # Вывод 6
из импорта mypackage.module1 добавить
из mypackage.module2 импортировать умножить
print(add(10, 5)) # Вывод 15
print(multiply(10, 5)) # Вывод 50
В Python, чтобы получить текущий модульИмя пакета, вы можете использовать специальные переменные__package__. Это и__module__Концепция получения текущего имени модуля аналогична.
mypackage/
│── __init__.py
└── submodule.py
submodule.pyсодержание:
print("__name__:", __name__)
print("__package__:", __package__)
print("__module__:", __module__)
Если используется в других программах какimport mypackage.submoduleИмпортируйте, результат примерно следующий:
__name__: mypackage.submodule
__package__: mypackage
__module__: __main__
__name__: Полное имя модуля.__package__: имя пакета, которому принадлежит текущий модуль. Если это модуль верхнего уровня, это будет пустая строка.__module__: Обычно используется в определении класса или функции, чтобы указать, в каком модуле они определены.__package__Помогите подтвердить пути к пакетам.Есть два основных способа проверить версию пакета Python: через терминал (командную строку) или запустив его в коде Python. Это поможет вам убедиться, соответствует ли среда требованиям проекта.
Это самый быстрый метод, не требующий входа в интерактивную среду Python.
имя пакета pip show(Напримерpip show pandas)。pip list。список пипов | findstr "Имя пакета"(Окна) илисписок пипов | grep "имя пакета" (Linux/Mac)。имя пакета списка conda。Если вам необходимо определить версию при выполнении программы, вы можете использовать следующие два метода:
import pandas
print(pandas.__version__)
from importlib.metadata import version
print(version('pandas'))
| метод | Инструкции/Код | Применимые ситуации |
|---|---|---|
| Пип-команда | pip show |
Просмотр подробной информации, такой как путь установки, автор, зависимости и т. д. |
| Список пипов | pip list |
Получите краткий обзор всех пакетов и версий в вашей текущей среде. |
| внутренние свойства | .__version__ |
Делайте логические выводы во время работы сценария. |
| Metadata | version() |
Стандартизированный способ проверки без загрузки всего пакета. |
Иногда проблема не в пакете, а в самом интерпретаторе Python:
python --versionimport sys
print(sys.version)
pip listОтображаемая версия отличается от версии, выполненной в VS Code. Пожалуйста, подтвердитеInterpreterПравильный ли выбор.importlibПроверка неустановленных пакетов выдаст ошибкуPackageNotFoundError。pip showне чувствителен к регистру, но для некоторой логики кода могут потребоваться точные имена.В Python доступ к объектам классов можно получить черезcls.__module__Найдите имя модуля, определяющего категорию, а затем используйтеsys.modulesПолучите объект модуля и, наконец, прочитайте его.__package__Свойство для получения имени пакета.
импортсистем
# Предположим, что категория определена в mypackage.submodule
классМойКласс:
пройти
# Получить имя модуля, к которому принадлежит категория
имя_модуля = МойКласс.__модуль__
print("Имя модуля:", имя_модуля)
# Получить объект модуля
mod = sys.modules[имя_модуля]
# Получите имя пакета из объекта модуля
print("Имя пакета:", mod.__package__)
Сам модуль является объектом, и к нему можно получить прямой доступ.__package__свойство.
импорт математики
импортировать mypackage.submodule как подмодуль
# math — это стандартный модуль библиотеки функций, пакета нет, поэтому __package__ — пустая строка
print("math.__package__:", math.__package__)
# Модули для пользовательских комплектов
print("sub.__package__:", sub.__package__)
Имя модуля: mypackage.submodule
Имя пакета: мойпакет
math.__package__:
sub.__package__: мой пакет
категория → __module__ → sys.modules[...] → __package__Объект модуля → __package__Получите напрямуюКогда файл Python выполняется напрямую, имя его модуля —__main__. Это делает использование толькоcls.__module__Невозможно получить исходное имя и путь к файлу.
Предположим, что структура вашего проекта:
/проект
|-- test_runner.py <-- Файл, который вы запускаете напрямую (будет рассматриваться как __main__)
|-- тест/
|-- db_test.py <-- Файл, определяющий DbCmdAgent
Если вы выполните следующий код в `test_runner.py`:
из test.db_test импортировать DbCmdAgent
Agent_obj = DbCmdAgent(...) # Создание экземпляра
# В настоящее время cls.__module__ по-прежнему имеет значение «test.db_test» (правильное имя модуля)
Однако, если вы определите категории в `test_runner.py`:
# Содержимое test_runner.py
класс DbCmdAgent:
пройти
агент_объект = DbCmdAgent()
#В настоящее время cls.__module__ == '__main__' (неверное имя модуля)
Это означает, что класс, для которого вы получаете информацию, определен в файле, который исполняется как `__main__`.
inspectМодуль может напрямую получить путь к файлуНезависимо от того, определена ли категория в `__main__`, вы можете обойти атрибут `__module__` и использоватьinspectмодуль, чтобы получить путь к файлу исходного кода, соответствующий этой категории. Это более надежный и универсальный метод.
импортная проверка
импортировать ОС
# --- Ситуация моделирования: категории, определенные в __main__ (исполняемый в данный момент скрипт) ---
класс DbCmdAgent:
"""Эта категория определена в исполняемом в данный момент основном скрипте"""
def __init__(сам, данные):
self.data = данные
Agent_obj = DbCmdAgent("некоторые_данные")
защита get_class_location_robust(obj):
"""
Используйте Inspect.getfile, чтобы обойти проблему __module__ == '__main__'.
"""
cls = тип (объект)
# 1. Используйте Inspect.getfile(), чтобы получить путь к файлу, определяющему категорию.
попробуйте:
путь_файла = проверить.getfile(cls)
# 2. Получите имя файла и каталог
имя_файла = os.path.basename(путь_файла)
каталог = os.path.dirname(путь_файла)
py_name = os.path.splitext(имя_файла)[0]
# 3. Если __module__ — это __main__, замените его именем архива, чтобы предоставить больше контекста.
имя_модуля = cls.__module__
если имя_модуля == '__main__':
имя_модуля = имя_py_# Используйте db_test или test_runner в качестве контекста
кромеТипОшибка:
# Обработка встроенных типов
file_path = "Н/Д (встроенное расширение или расширение C)"
имя_файла = "Н/Д"
каталог = "Н/Д"
py_name = "Н/Д"
имя_модуля = cls.__module__
вернуть {
"имя_модуля_или_основной": имя_модуля,
"py_name_no_ext": py_name,
«каталог»: каталог,
«путь_файла»: путь_файла,
}
# Выполняем и просматриваем результаты
location_info = get_class_location_robust(agent_obj)
print("--- Информация о файле определения категории ---")
print(f"Имя файла (имя .py): {location_info['py_name_no_ext']}")
print(f"Путь к каталогу (Пакет): {location_info['directory']}")
print(f"Полный путь к файлу: {location_info['file_path']}")
inspect.getfile(type(obj)): это наиболее надежный способ получить исходный путь к файлу определений напрямую, совершенно независимо от того, рассматривается ли модуль.__main__。__module__Это отражает только пространство имен модуля класса в текущей программе, но не обязательно его фактическое имя в структуре проекта.Этот метод используетimportlib.import_moduleПопробуйте импортировать указанный модуль. Если вы столкнетесьModuleNotFoundError, попытается импортировать свои подмодули из текущего загруженного пакета.
импортировать импортную библиотеку
импортсистем
защита Safe_import (имя_модуля):
попробуйте:
# Попробуйте импортировать напрямую
вернуть importlib.import_module(имя_модуля)
кроме ModuleNotFoundError:
# Если не удалось, попробуйте импортировать подмодуль из известного пакета
для пакета в списке (sys.modules.keys()):
если pkg, а не pkg.startswith("_"):
попробуйте:
return importlib.import_module(f"{pkg}.{module_name}")
кроме ModuleNotFoundError:
продолжать
поднять # Если все еще не найдено, выдать исключение
импортировать число
mod1 = Safe_import("random") # Это может быть успешным, потому что это стандартная библиотека
mod2 = Safe_import("linalg") # Попробую numpy.linalg
print(mod2.__name__) # Вывод numpy.linalg
sys.modulesСохраните все загруженные модули.package.module_nameметод, попробуйте еще раз.В Python,sys.path— это список, содержащий все пути к каталогам, которые интерпретатор Python будет искать по порядку при попытке импортировать модуль. Когда вы выполняетеimport some_module, Python проверит по порядкуsys.pathкаждый каталог в списке, пока не найдете каталог с именемsome_moduleфайлы (например,some_module.py、some_module/__init__.pyждать).
sys.pathСписки обычно состоят из следующих трех частей и ищутся в следующем порядке:
sys.path[0]) обычно является выполняющимся в данный момент скриптом Python (например,main.py) находится в каталоге.'', который представляет текущий рабочий каталог (текущий рабочий каталог, CWD).PYTHONPATHпеременные системной среды.sys.pathсередина.PYTHONPATHОбычно используется для постоянного добавления в путь поиска некоторых часто используемых каталогов проектов или библиотек, расположенных в нестандартных местах, без необходимости вручную устанавливать их в каждом проекте.os, sys, json, socket) каталог установки.pipУстановлены сторонние пакеты (например.fastapi, numpy, pandas) каталог установки. В виртуальной среде он обычно расположен вlib/site-packagesкаталог.В дополнение к вышесказанномуPYTHONPATHКроме того, существует несколько переменных среды, связанных со средой выполнения Python, которые влияют на поведение интерпретатора и поиск пути, но влияютsys.pathОсновные переменные, составляющиеPYTHONPATH:
| Системные переменные | Описание функции | Связь с sys.path |
|---|---|---|
PYTHONPATH |
Определяет дополнительные каталоги, которые будут добавлены в путь поиска модов. | прямое воздействиеsys.pathсостав. |
PYTHONHOME |
Используется для установки альтернативного пути к каталогу установки Python, особенно для встроенных систем. | Косвенно влияет на стандартную библиотеку иsite-packagesрасположение. |
PATH |
Используется операционной системой для поиска исполняемых файлов (например,python.exe) путь. |
не влияет напрямуюsys.path, но влияет на то, какой интерпретатор Python выполняется. |
VIRTUAL_ENV |
Когда вы находитесь в виртуальной среде, эта переменная указывает на корневой каталог виртуальной среды. | косвенное воздействиеsys.path, поскольку это обеспечиваетsite-packagesОно исходит из виртуальной среды, а не всей системы. |
потому чтоsys.path— это обычный список Python, который вы можете динамически изменять во время работы программы, но такие изменения вступают в силу только в рамках текущего сеанса интерпретатора:
импортсистем
импортировать ОС
# Добавьте родительский каталог в путь поиска (обычно используется для тестирования или внутренней ссылки на проект)
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
Затенение модулей (или затенение имен) — распространенная ошибка или проблема программирования в Python. Это происходит, когда вы случайно создаете файл кода или имя переменной, которое конфликтует с именем встроенного модуля или сторонней библиотеки, которую вы пытаетесь импортировать или использовать.
sys.path), чтобы найти мод.socket, json, random) или файл или каталог с тем же именем, что и у сторонней библиотеки (например, вы создаете файл с именемsocket.pyфайл), Python сначала загрузит ваш локальный файл.В результате ваш локальный файл «закрывает» или «переопределяет» стандартный модуль, который должен быть загружен, что делает ваш код неспособным получить доступ к функциям стандартного модуля (например,socket.AF_UNSPEC) завершится ошибкой, поскольку загруженный вами локальный файл не имеет этих свойств.
| Имя стандартного модуля | Имя локального файла, вызвавшего тень | в результате |
|---|---|---|
socket |
socket.py |
Невозможно использовать стандартныйsocketСетевые константы модуля (например,AF_INET, AI_PASSIVE)。 |
json |
json.py |
Невозможно использовать стандартныйjsonМодульныйloadsилиdumpsфункция. |
test(название проекта) |
test.py |
В среде модульного тестирования могут возникнуть конфликты с внутренней логикой среды тестирования. |
socket.pyпереименованnetwork_handler.py。import sys; print(sys.path)Проверьте путь поиска Python, чтобы убедиться, что он загружает ваши локальные файлы вместо каталога стандартной библиотеки.Чтобы получить текущее выполнение программы Python__main__Имя файла .py, которому он принадлежит, которое можно использовать.__main__.__file__илиsys.argv[0]. Но в интерактивном режиме Jupyter или-cМожет не существовать во время выполнения и поэтому требует безопасного обращения.
импортировать ОС
импортсистем
импортировать __main__
защита get_main_py_path():
"""Возвращает абсолютный путь к файлу .py, которому принадлежит main. Если его невозможно найти, возвращается None"""
# Случай 1: Нормальное выполнение .py
main_file = getattr(__main__, "__file__", нет)
если основной_файл:
вернуть os.path.abspath(main_file)
# Случай 2: Решение sys.argv[0]
если len(sys.argv) > 0:
argv0 = sys.argv[0]
если argv0 отсутствует ("", "-c", ""):
кандидат = os.path.abspath(argv0)
если os.path.exists(кандидат):
возвратный кандидат
# Случай 3: Интерактивный режим, Jupyter, встраивание и т. д.
возврат Нет
# Пример
путь = get_main_py_path()
если путь:
print("Основной путь:", путь)
print("основное имя файла:", os.path.basename(path))
еще:
print("main.py не найден (возможно, в интерактивной среде или не запущен из архива)")
path = get_main_py_path()
filename = os.path.basename(path) if path else None
print(filename)
__main__.__file__Это самый надежный способ, но он не всегда существует.sys.argv[0]это метод резервного копирования, но вам необходимо подтвердить, что значение не-cили<stdin>。
To get the parameter names and their corresponding values of a function in Python, you can use the `inspect` module, which provides introspection utilities. Specifically, `inspect.signature()` can help you retrieve the names of the parameters, and you can pass the current frame's local variables to get their values.
Here is an example that demonstrates how to get the function name, parameter names, and their values:
```python
import inspect
# Sample function
def my_function(a, b, c=5):
# Get the current frame
frame = inspect.currentframe()
# Get the function name
func_name = frame.f_code.co_name
print(f"Function name: {func_name}")
# Get the parameter names and their values
args, _, _, values = inspect.getargvalues(frame)
# Print parameter names and values
for arg in args:
print(f"Parameter name: {arg}, Value: {values[arg]}")
# Call the function
my_function(1, 2)
```
### Output:
```
Function name: my_function
Parameter name: a, Value: 1
Parameter name: b, Value: 2
Parameter name: c, Value: 5
```
### Explanation:
1. **`inspect.currentframe()`**: Retrieves the current execution frame.
2. **`frame.f_code.co_name`**: Extracts the name of the current function.
3. **`inspect.getargvalues(frame)`**: Gets the argument names and their corresponding values from the frame. This function returns a tuple containing:
- `args`: List of argument names.
- `_`: Placeholder for unused information.
- `values`: Dictionary containing argument names as keys and their values.
This allows you to print both the names of the function's parameters and their values at runtime.
В Python вы можете использоватьinspect.signature()Получить информацию о параметрах функции,
и дальше отParameter.annotationСвойство получает аннотацию типа (подсказку типа) для каждого параметра.
импортная проверка
def my_function(a: int, b: str, c: float = 3.14) -> bool:
вернуть ул(а) == б
сиг = проверить.подпись(my_function)
для имени, параметра в sig.parameters.items():
print(f"Имя параметра: {имя}")
print(f"Значение по умолчанию: {param.default}")
print(f"Введите аннотацию: {param.annotation}")
печать()
Имя параметра: а
По умолчанию: <class 'inspect._empty'>
Введите аннотацию: <class 'int'>
Имя параметра: б
По умолчанию: <class 'inspect._empty'>
Введите аннотацию: <class 'str'>
Имя параметра: c
По умолчанию: 3.14
Введите аннотацию: <class 'float'>
param.annotationПолучит аннотации типов (например,int、str)。inspect._empty。get_type_hints()Получите полный словарь подсказок типов.Этот метод автоматически разрешает прямые ссылки (типы, помеченные как строки).
from typing import get_type_hints
hints = get_type_hints(my_function)
print(hints)
{'a': <class 'int'>, 'b': <class 'str'>, 'c': <class 'float'>, 'return': <class 'bool'>}
inspect.signature()Можно получить порядок и имя параметра.param.annotationВы можете проверить аннотацию типа каждого параметра.get_type_hints()Легче получить все подсказки типов (включая возвращаемые значения) одновременно.В Python вы можете использовать объект__class__атрибут илиtype()функция,
Получите категорию (класс), к которой он принадлежит, а затем получите имя категории.
класс Животное:
пройти
класс Собака(Животное):
пройти
объект = Собака()
#Метод 1: Используйте __class__.__name__
print(obj.__class__.__name__) # Вывод: Собака
#Метод 2: использовать type()
print(type(obj).__name__) # Вывод: Собака
#Метод 3. Получите полное имя модуля и категории.
print(obj.__class__) # Вывод: <class '__main__.Dog'>
print(obj.__class__.__module__) # Вывод: __main__
Dog
Dog
<class '__main__.Dog'>
__main__
obj.__class__: получить объект категории объекта.obj.__class__.__name__: Получить строку названия категории.type(obj)Эквивалентноobj.__class__。__module__: можно получить имя модуля, в котором определена категория.Чтобы одновременно получить полное «имя модуля + категории», вы можете написать:
cls = type(obj)
full_name = f"{cls.__module__}.{cls.__name__}"
print(full_name)
__main__.Dog
type(obj).__name__Это самый простой способ получить имя категории.f"{obj.__class__.__module__}.{obj.__class__.__name__}"。Ниже приведен пример кода, который использует Python для определения того, к какому классу наследования принадлежит свойство:
импортная проверка
класс Базовыйкласс:
base_attr = "Я атрибут из BaseClass"
Подкласс класса (Базовыйкласс):
sub_attr = "Я атрибут из подкласса"
# Определить функцию для поиска категории, к которой принадлежит атрибут
защита find_attribute_owner(cls, attr_name):
для базы в Inspect.getmro(cls): # Получить MRO (порядок разрешения метода)
если attr_name в base.__dict__:
возвратная база
возврат Нет
# тест
sub_obj = Подкласс()
атрибуты = sub_obj.__class__.__dict__.items() # Получить все атрибуты на уровне категории
для имени, значения в атрибутах:
владелец = find_attribute_owner(sub_obj.__class__, имя)
print(f"Атрибут '{name}' принадлежит категории: {owner.__name__}")
__dict__, в котором хранятся атрибуты, определенные категорией.Для категорий в примере результаты выполнения следующие:
Атрибут «__module__» принадлежит классу: SubClass.
Атрибут «sub_attr» принадлежит классу: SubClass.
Атрибут «__doc__» принадлежит классу: SubClass.
Атрибут «base_attr» принадлежит классу: BaseClass.
class MyClass:
def fun1(self):
'''
Fun1 comment
'''
pass
obj = MyClass()
print(obj.fun1.__doc__)
import inspect
class MyClass:
def fun1(self):
'''
Fun1 comment
'''
pass
print(inspect.getdoc(MyClass.fun1))
В Python вы можете использовать встроенныйwarningsМодули, которые предупреждают пользователей во время выполнения (а не во время компиляции) о том, что функция устарела, и предлагают новые альтернативы.
импортировать предупреждения
защита old_function(x, y):
предупреждения.предупреждать(
«Функция old_function() устарела, используйте вместо нее new_function(x, y).»,
категория = Предупреждение об устаревании,
уровень стека = 2
)
вернуть х + у
защита new_function(x, y):
вернуть х + у
result = old_function(3, 4)
print(result)
Предупреждение об устаревании: функция old_function() устарела, вместо нее используйте new_function(x, y).
результат = старая_функция (3, 4)
7
warnings.warn()Предупреждение отображается на этапе выполнения и не прерывает программу.category=DeprecationWarningИспользуется для обозначения предупреждений об устаревании.stacklevel=2Пусть предупреждающее сообщение укажет на местоположение вызывающего абонента, а не внутри функции.python -W error::DeprecationWarning your_script.py
Декораторы можно использовать, чтобы позволить нескольким старым функциям использовать одну и ту же логику запроса на прекращение поддержки:
импортировать предупреждения
из оберток импорта functools
защита устарела (новое_имя_функции):
декоратор защиты (функция):
@wraps(функция)
def-обертка(*args, **kwargs):
предупреждения.предупреждать(
f"Функция {func.__name__}() устарела, используйте вместо нее {new_func_name}().",
категория = Предупреждение об устаревании,
уровень стека = 2
)
return func(*args, **kwargs)
возвратная обертка
вернуть декоратор
@deprecated("новая_функция")
защита old_function(x, y):
вернуть х + у
В Python,@staticmethodи@classmethodОба декоратора могут определять методы, которые можно вызывать без создания экземпляра класса, но их назначение и поведение различаются.
@staticmethodне принимает какой-либо неявный первый аргумент (нетselfилиcls) метод. Это как обычная функция, просто принадлежащая пространству имен класса.@staticmethod。класс МойКласс:
@staticmethod
защита static_method(x, y):
вернуть х + у
# Статические методы можно вызывать без создания экземпляра
result = MyClass.static_method(5, 10) # Результат: 15
сосредоточиться:@staticmethodКатегория недоступна (cls) или экземпляр (self)。
@classmethod— это сама категория принятия (cls) в качестве первого параметра. Это позволяет ему получать доступ к статусу категории и изменять его.@classmethod。классМойКласс:
класс_переменная = 0
def __init__(self, значение):
self.value = значение
MyClass.class_variable += 1
@classmethod
защита get_class_variable (cls):
вернуть cls.class_variable
#Создать экземпляр
obj1 = МойКласс(10)
obj2 = МойКласс(20)
# Метод категории вызова
print(MyClass.get_class_variable()) # Результат: 2
сосредоточиться:@classmethodМожет получить доступ к статусу уровня категории (cls)。
| особенность | @staticmethod | @classmethod |
|---|---|---|
| первый параметр | Нет неявного первого аргумента | cls(сама категория) |
| экземпляр доступа | никто | никто |
| Категория доступа | никто | иметь |
| использование | Служебные функции, связанные с категориями, но не требующие экземпляров или категорий. | Необходимо манипулировать данными уровня категории или предоставить альтернативные конструкторы. |
Сам Python не предоставляет «статический метод по умолчанию» или «метод класса по умолчанию», то есть функцию автоматического выполнения метода при первом вызове любого статического метода или метода класса. Но мы можем добиться аналогичного поведения с помощью методов ленивой загрузки.
Вы можете определить статическую переменную в классе для отслеживания инициализированного состояния, а затем выполнить логику инициализации при первом вызове статического метода или метода класса.
класс МойКласс:
инициализирован = False # Статическая переменная, отслеживающая, была ли она инициализирована
@staticmethod
защита init_once():
если не MyClass.initialized:
print("Выполнение логики инициализации...")
MyClass.initialized = Истина
@classmethod
защита class_method (cls):
cls.init_once()
print("Вызов метода класса")
@staticmethod
защита static_method():
МойКласс.init_once()
print("Вызвать статический метод")
# Вызовите метод категории в первый раз, чтобы запустить инициализацию
MyClass.class_method() # Вывод: выполнение логики инициализации... Вызов метода класса
# Вызываем метод категории второй раз и больше не выполняем инициализацию
MyClass.class_method() # Вывод: вызов метода класса
# При первом вызове статического метода инициализация не выполняется, поскольку он уже инициализирован.
MyClass.static_method() # Вывод: вызов статического метода
initialized: This variable is used to track whether the category has been initialized. Начальное значениеFalse。init_once()метод: Этот метод отвечает за выполнение логики инициализации и будетinitializedустановлен наTrue, чтобы предотвратить повторную инициализацию.Хотя Python не имеет встроенного «статического метода по умолчанию» или «метода класса по умолчанию», с помощью статических переменных и методов отложенной загрузки вы можете автоматически выполнять логику инициализации при первом вызове статического метода или метода класса и гарантировать, что эта логика будет выполнена только один раз.
В Python поток — это механизм, используемый для реализации параллелизма. Это позволяет программе выполнять несколько задач одновременно в рамках одного процесса (Процесса). Это очень полезно для выполнения операций с интенсивным вводом-выводом (таких как сетевое соединение, чтение и запись файлов) и может предотвратить блокировку программы (блокировку) в ожидании завершения внешних операций.
В стандартном интерпретаторе CPython имеется «Глобальная блокировка интерпретатора» (Global Interpreter Lock, GIL). GIL гарантирует, что только один поток может выполнять биткод Python в любой момент времени. Это означает:
multiprocessingмодуль).threadingPython использует стандартную библиотеку функцийthreadingМодуль для обработки потоков выполнения. Существует два основных метода создания потоков:
Это самое простое и распространенное использование.
импорт потоков
время импорта
задача def (имя, задержка):
"""Целевая функция, выполняемая потоком"""
print(f"Тема {имя}: Начало...")
time.sleep(delay) # Имитация трудоемких операций ввода-вывода
print(f"Тема {name}: Задача выполнена.")
#Создаем поток выполнения
thread1 = threading.Thread(target=task, args=("T1", 2))
thread2 = threading.Thread(target=task, args=("T2", 4))
# Начать ветку
поток1.start()
поток2.start()
# Дождитесь завершения всех потоков (заблокируйте основной поток, пока они не завершатся)
поток1.join()
поток2.join()
print("Все потоки выполнения завершены. Основная программа завершается.")
threading.ThreadкатегорияПодходит для более сложных сценариев, инкапсулируя логику потока выполнения в категорию.
импорт потоков
время импорта
класс MyThread(threading.Thread):
def __init__(я, имя, задержка):
супер().__init__()
self.name = имя
self.delay = задержка
защита запуска (сам):
"""
При запуске потока автоматически вызывается метод run().
Здесь вы определяете задачи, которые будет выполнять поток.
"""
print(f"Поток {self.name}: Начало...")
time.sleep(self.delay)
print(f"Тема {self.name}: Задача выполнена.")
#Создаем и запускаем поток
поток3 = МойПоток("T3", 3)
поток3.start()
поток3.join()
print("Пользовательский поток выполнения завершен.")
Когда несколько потоков получают доступ к общим данным и изменяют их, могут возникнуть условия гонки. Вам необходимо использовать механизм синхронизации для защиты ваших данных:
Lock: Блокировка — это самый простой примитив синхронизации. Вызывается перед тем, как поток получит доступ к общему ресурсуlock.acquire(), позвоните после завершенияlock.release()。RLock(Реентерабельная блокировка): позволяет одному и тому же потоку получать блокировку несколько раз.Semaphore(Журнал): используется для ограничения количества потоков, которые могут одновременно получать доступ к ресурсам.импорт потоков
# Общие ресурсы
счетчик = 0
# Создать блокировку
блокировка = резьба.Lock()
защита приращения_счетчика():
глобальный счетчик
# Получите блокировку, чтобы гарантировать, что только один поток может выполнить этот блок одновременно
блокировка.приобретать()
попробуйте:
# Раздел соревнований
текущее_значение = счетчик
time.sleep(0.001) # Имитация переключения
счетчик = текущее_значение + 1
наконец:
# Снять блокировку
блокировка.выпуск()
темы = []
для меня в диапазоне (100):
t = threading.Thread(target=increment_counter)
потоки.append(т)
т.старт()
за т в темах:
t.join()
print(f"Окончательное значение счетчика: {counter}") # Если блокировки нет, это значение не может быть 100
ПитонthreadingМодуль предоставляет функцию создания и управления потоками выполнения, но из-за ограничений операционной системы и философии проектирования Python не предоставляет безопасный, прямой и принудительный метод остановки (уничтожения) внешних потоков выполнения. Принудительная остановка может привести к утечке ресурсов или повреждению данных.
Следовательно, остановка потока выполнения должна достигаться с помощью **Механизма сотрудничества****, то есть позволяя потоку выполнения самостоятельно проверять флаг остановки и корректно завершать работу.
Это самый безопасный и наиболее рекомендуемый метод остановки потока. Он требует, чтобы поток периодически проверял внешнюю переменную (флаг) в цикле выполнения задачи.
импорт потоков
время импорта
# Общий флаг остановки
stop_flag = поток.Событие()
def Monitored_task (имя, задержка):
"""
Функция задачи, которая периодически проверяет флаг остановки.
"""
print(f"Тема {имя}: Начало...")
я = 0
while not stop_flag.is_set(): # Проверяем, установлен ли флаг
я += 1
print(f"Поток {name}: шаг выполнения {i}")
# Моделируйте трудоемкие операции и регулярно проверяйте
time.sleep(задержка)
# Здесь вы можете установить ограничение на количество выполнений, чтобы не было бесконечного цикла
если я >= 5:
сломать
print(f"Поток выполнения {name}: получил сигнал остановки или задача завершилась и корректно завершился.")
# --- Главный блок управления программой ---
#Создаем поток выполнения
worker_thread = threading.Thread(target=monitored_task, args=("Worker-1", 1))
# Начать ветку
рабочий_поток.start()
print("\nОсновная программа: поток выполнения запущен, подождите 3 секунды...\n")
time.sleep(3) # Пусть поток поработает некоторое время
# Отправить сигнал остановки
print("\nОсновная программа: Установить флаг остановки...\n")
stop_flag.set() # Установить событие и позволить is_set() вернуть True
# Подождите, пока поток корректно завершится и завершится (обычно быстро)
рабочий_поток.join()
print("\nОсновная программа: поток благополучно остановлен и присоединен. Программа завершена.")
threading.Event(): простой примитив синхронизации. Внутри него поддерживается флаг Боллинджера.stop_flag.is_set(): проверьте, имеет ли флаг значение True (т. е. выдается ли сигнал остановки).stop_flag.set():Установите флаг в значение True, чтобы отправить сигнал остановки.while not stop_flag.is_set():: это основная управляющая структура потока. Пока не получен сигнал остановки, цикл будет продолжать выполняться.worker_thread.join(): убедитесь, что основная программа будет ждать завершения рабочего потока (корректного завершения), прежде чем продолжить выполнение. Это важный шаг для обеспечения чистого завершения процедуры.Хотя существуют некоторые экспериментальные или небезопасные способы принудительной остановки, такие как использование `_thread.stop()` или создание исключения, эти методы могут привести к:
Поэтому в Python вам всегда следует использовать скоординированный механизм пометки для остановки потоков.
Это наиболее рекомендуемый подход в многопоточных средах. Вместо того, чтобы все потоки захватывали один и тот же объект, каждый поток имеет независимую копию объекта. В Python вы можете использоватьthreading.local()достичь.
импорт потоков
# Создайте область потока для хранения объектов
thread_data = threading.local()
защита get_service():
# Если текущий поток не имеет собственного сервиса, создайте его
если нет, hasattr(thread_data, 'service'):
print(f"Создать новое соединение для потока {threading.current_thread().name}")
thread_data.service = create_new_connection()
вернуть поток_данных.сервис
задача определения():
сервис = get_service()
# Выполняем операции...
Если объект должен быть одинаковым (например, запись в один и тот же файл или работа с одним и тем же глобальным счетчиком), вы должны использоватьLock. Это гарантирует, что только один поток может одновременно получить доступ к объекту, избегая условий гонки.
блокировка = резьба.Lock()
защита Safe_task():
с замком:
# Внутри этого блока другие потоки должны ждать
общий_объект.do_something()
---
Если вы хотите избежать риска конфликтов блокировок или сбоев, связанных с несколькими потоками, следует рассмотреть две основные альтернативы:
В настоящее время это самый популярный подход в Python (например, основной принцип FastAPI). Он работает в одном потоке и ожидает ввода-вывода (например, запросов API, запросов к базе данных), переключая задачи.
импортировать асинхронный код
асинхронная защита fetch_api (url):
# Используйте асинхронные библиотеки, такие как aiohttp
ответ = ожидайте call_api (url)
обратный ответ
асинхронное определение main():
# Выполнять несколько задач одновременно, но переключаться внутри одного потока
результаты = ждут asyncio.gather(fetch_api("url1"), fetch_api("url2"))
Поток выполнения Python ограничен GIL (глобальной блокировкой интерпретатора) и не может по-настоящему распараллеливать операции.multiprocessingБудет открыто несколько независимых экземпляров интерпретатора Python.
из многопроцессорного процесса импорта
задача определения (имя):
print(f"Процесс {name} выполняется")
если __name__ == "__main__":
p = Процесс(цель=задача, args=('A',))
п.старт()
p.join()
Если вы хотите полностью разделить задачи, вы можете использовать Celery или Redis Queue. Поместите задачу в очередь и позвольте внутреннему работнику (который может представлять собой несколько процессов или несколько компьютеров) подобрать и выполнить ее.
---| план | Решение | Применимые ситуации |
|---|---|---|
| Thread-Local | Каждый поток получает копию | Служба API, подключение к базе данных |
| Asyncio | Однопоточное переключение (несинхронное) | Высокое число одновременных сетевых запросов (рекомендуется) |
| Multiprocessing | независимое пространство памяти | Вычисления на ЦП, полностью избегая конфликтов совместного использования |
Когда вы используете локальное хранилище потоков (TLS), цель состоит в том, чтобы защитить эти «непотокобезопасные» объекты (такие как служба API, подключения к базе данных). Но если между потоками необходимо обмениваться данными (например, результаты, загруженные потоком А, необходимо обработать потоком Б), необходимо установить специальный «канал связи».
Питонqueue.QueueЯвляется ли потокобезопасным. Это самый стандартный и безопасный способ передачи информации между потоками. Он уже обработал всю логику блокировки внутри себя.
импорт потоков
очередь импорта
# Создайте глобальную очередь, к которой будут иметь доступ все потоки выполнения
Task_queue = очередь.Очередь()
Защитный продюсер():
# Производим данные и помещаем их в очередь
data = {"video_id": "abc", "status": "pending"}
Task_queue.put (данные)
защита потребителя():
# Получаем данные из очереди
данные = Task_queue.get()
# Обработка данных...
Task_queue.task_done()
Если вам нужно поделиться большим списком или словарем, вы можете использовать общие глобальные переменные, но доступ к ним должен осуществляться с помощью сопоставления.threading.Lock。
общие_результаты = []
results_lock = резьба.Lock()
задача определения():
result = "Результаты некоторых операций"
#Блокировка перед доступом к общим ресурсам
с результатами_блокировки:
shared_results.append(результат)
# Автоматически разблокировать после выхода из блока with
Иногда вы хотите делиться не «данными», а «состоянием» (например, сообщать другим потокам, что API инициализирован).
api_ready = резьба.Событие()
инициализатор защиты():
#Выполняем инициализацию
api_ready.set() # Отправить сигнал
рабочий рабочий():
api_ready.wait() # Ждем сигнала, пока инициализатор не вызовет set()
print("Начнём работать")
| Тип контента | место хранения | стиль управления |
|---|---|---|
| Объекты инструментов(API, подключение к БД) | Thread-Local (регион) | У каждого есть копия, чтобы избежать сбоев. |
| Информация о миссии(идентификатор, параметр) | Очередь (глобальная) | Используйте потокобезопасную передачу очереди. |
| Результат расчета(статистика) | Глобальный список/Dict (глобальный) | Должно соответствоватьthreading.Lock。 |
Проще говоря: **"Получите частные инструменты (соединения) самостоятельно и поместите общедоступную информацию (данные) в очередь (Очередь/Блокировка)".**
В многопоточной среде, когда несколько потоков пытаются одновременно изменить одну и ту же глобальную переменную или общий ресурс (например, файл, соединение с базой данных, глобальный список), возникает ошибка.Состояние гонки, что приводит к путанице данных.threading.LockЭто примитив синхронизации, который гарантирует, что только один поток может одновременно войти в защищенный блок кода.
Самый безопасный и рекомендуемый способ — сопоставитьwithИспользуйте повествовательные предложения. Это гарантирует, что даже если внутри блока возникнет исключение, блокировка будет снята правильно, чтобы избежать взаимоблокировки.
импорт потоков
# 1. Создайте объект блокировки
my_lock = резьба.Lock()
общий_счетчик = 0
защита приращения_задачи():
глобальный общий_счетчик
# 2. Используйте with для автоматического управленияacquire() и Release().
с my_lock:
# Код в этом блоке может выполняться только одним потоком одновременно
темп = общий_счетчик
температура += 1
общий_счетчик = температура
# Запускаем несколько тестов потоков
threads = [threading.Thread(target=increment_task) для _ в диапазоне (100)]
для t в потоках: t.start()
для t в потоках: t.join()
print(f"Окончательный счетчик: {shared_counter}")
Хотя это и не рекомендуется, иногда требуется более точный контроль. Вы должны вручную позвонитьacquire()получить замок иfinallyпозвонить в блокrelease()。
блокировка = резьба.Lock()
защита manual_task():
lock.acquire() #Получить блокировку. Если замок уже занят, он заблокируется (подождет) здесь.
попробуйте:
# Выполняем задачи
пройти
наконец:
lock.release() # Должен быть освобожден, иначе другие потоки никогда не смогут выполниться
threading.LockЭто не реентерабельно. Это означает, что если тот же поток снова запросит ту же блокировку, когда он уже удерживает блокировку, он «заблокируется» сам (взаимная блокировка).
threading.RLock()(Реентерабельный замок).Google API Serviceобъект.Чрезмерное использование блокировок приведет к снижению производительности программы, поскольку несколько потоков попадут «в очередь на выполнение». Если возможно, отдайте приоритет использованиюqueue.Queueили то, что мы обсуждали ранееThread-Local Storage, эти методы обычно более эффективны и менее подвержены ошибкам, чем частая блокировка.
В Python,async defиawaitреализованАсинхронное программированиеосновной синтаксис. Они не позволяют программе зависать во время ожидания задач ввода-вывода (таких как сетевые запросы, чтение файлов) и вместо этого могут выполнять другие задачи, значительно повышая производительность.
Когда вы добавляете определение функции с помощьюasync, функция станетФункция сопрограммы. Когда вы его вызываете, он не выполняет содержимое немедленно, а возвращает «объект сопрограммы».
асинхронная защита fetch_data():
print("Начать получение данных...")
# Моделирование трудоемких задач
вернуть {"данные": "успех"}
# Прямой вызов получит только объект сопрограммы и не выполнит печать
результат = выборка_данных()
print(result) # Вывод: <coroutine object fetch_data at ...>
awaitможет быть толькоasync defДля внутреннего использования. Его функция — «временно приостановить текущую сопрограмму, дождаться завершения последующих задач и получить возвращаемое значение». Во время ожидания система может выполнять другие асинхронные задачи.
импортировать асинхронный код
асинхронное определение main():
# Используйте await для выполнения сопрограммы и получения результатов
данные = ожидайте выборки_данных()
print(f"Собрать результаты: {данные}")
# Запускаем запись для асинхронных программ
asyncio.run(main())
| грамматика | Описание функции | На что следует обратить внимание |
|---|---|---|
| async def | Объявить асинхронную функцию | Возвращается объект сопрограммы, а не результат выполнения. |
| await | Дождитесь завершения асинхронных задач | Может быть написано только внутри асинхронных функций. |
| asyncio.run() | Запустить самую внешнюю асинхронную запись | Программу обычно нужно вызвать только один раз. |
await, ты получишьcoroutineобъекта, когда вы пытаетесь прочитать свойства (например,result.text) будет распыляться, когдаAttributeError。SyntaxError. Вы должны убедиться, что внешняя функция имеетasyncУход.asyncиспользуется в функцияхtime.sleep()Это заблокирует весь цикл событий. Пожалуйста, используйте вместо этогоawait asyncio.sleep()。Представьте, что вы готовите:
await) при этом, когда вы пойдете нарезать овощи, звук закипающей воды (уведомление о событии) позовет вас разобраться с этим.loop.run_until_complete()даasyncioМетод нижнего уровня в модуле используется для выполнения сопрограммы до ее завершения и возврата результата. После Python 3.7, хотя официально рекомендуется использоватьasyncio.run(), но вам все равно придется использовать этот метод в некоторых конкретных ситуациях (например, когда вам нужно повторно использовать циклы событий или настроить логику запуска).
использоватьrun_until_completeСначала необходимо получить или создать объект цикла событий, а затем передать ему сопрограмму.
импортировать асинхронный код
асинхронная защита my_task():
ожидайте asyncio.sleep(1)
вернуть «Задача выполнена»
# 1. Получить цикл событий
цикл = asyncio.get_event_loop()
# 2. Выполнить сопрограмму до завершения и напрямую получить возвращаемое значение
результат = цикл.run_until_complete(my_task())
print(result) #Output: Задача завершена
Оба могут получить возвращаемое значение, но управляют жизненным циклом по-разному:
| характеристика | asyncio.run() (рекомендуется) | loop.run_until_complete() |
|---|---|---|
| степень автоматизации | высокий. Автоматически создавайте, замыкайте циклы и очищайте задачи. | Низкий. Жизненным циклом цикла необходимо управлять вручную. |
| возможность повторного использования | Низкий. Каждый вызов создает новый цикл. | высокий. В одном цикле может выполняться несколько задач. |
| Ограничения использования | Невозможно использовать в уже работающем цикле. | Более гибкий и часто используется в устаревшем коде или средах тестирования. |
Если вы находитесь в уже запущенном скрипте и хотите убедиться, что сопрограмма выполнена и значение получено, вы можете использовать этот метод:
импортировать асинхронный код
асинхронное определение add(a, b):
вернуть а + б
цикл = asyncio.new_event_loop()
asyncio.set_event_loop(цикл)
попробуйте:
# Выполняем первое задание
val1 = цикл.run_until_complete(добавить(10, 20))
#Выполняем второе задание
val2 = цикл.run_until_complete(add(val1, 5))
print(f"Окончательный результат: {val2}")
наконец:
# Должно быть закрыто вручную
цикл.закрыть()
Если вы хотите, чтобы несколько сопрограмм выполнялись параллельно и равномерно получали возвращаемое значение, вам необходимо сопоставитьasyncio.gather:
асинхронная задача определения (идентификатор):
вернуть f"результат {id}"
цикл = asyncio.get_event_loop()
# сбор объединит несколько сопрограмм в одну задачу, а run_until_complete будет ждать завершения всех.
результаты = цикл.run_until_complete(asyncio.gather(задача(1), задача(2), задача(3)))
print(results) #Output: ['Результат 1', 'Результат 2', 'Результат 3']
async defвызов внутри функцииrun_until_complete, выльетсяThis event loop is already running. Пожалуйста, всегда используйте его внутри асинхронных функций.await。loop.close()для освобождения ресурсов, иначе программа может не завершиться нормально или выдать предупреждение.run_until_completeВернет сопрограммуreturnЕсли в сопрограмме возникает неперехваченное исключение, оно будет выброшено на вызывающую сторону.asyncio.run()Это API высокого уровня, представленный начиная с Python 3.7. Это наиболее рекомендуемый способ запуска асинхронных программ. оно автоматически позаботится об этомУстановите цикл событий, выполните сопрограмму и закройте цикл после завершения.. Самое главное, что оно будет передано непосредственно обратно в сопрограмму.returnценить.
Вам просто нужноasync defВызов функции передаетсяasyncio.run(), она вернет результат как обычная синхронная функция.
импортировать асинхронный код
асинхронная защита Calculate_score (имя):
print(f"Подсчет очков {name}...")
await asyncio.sleep(1) # Имитация трудоемких задач
вернуть 95
# Получите результат возврата напрямую
Final_score = asyncio.run(calculate_score("Чжан Сяомин"))
print(f"Итоговый результат: {final_score}") # Вывод: 95
Обычно мы определяемmain()функционировать как точка входа и получать результаты всех подзадач внутри, и, наконец, с помощьюasyncio.run(main())Единый вывод.
асинхронная защита Task_a():
вернуть «яблоко»
асинхронная защита Task_b():
вернуть «банан»
асинхронное определение main():
# Используйте сбор в основном для одновременного выполнения
результаты = ждут asyncio.gather(task_a(), Task_b())
return results # Возвращаем список
# Получите возвращаемое значение main через asyncio.run
all_fruits = asyncio.run(main())
print(all_fruits) # Вывод: ['apple', 'banana']
| Элементы правил | иллюстрировать |
|---|---|
| единственный вход | В продолжении выполнения обычно вызывается только один раз.asyncio.run()。 |
| Автоматическая очистка | Он автоматически отменяет все оставшиеся задачи и закрывает пул потоков, что очень безопасно. |
| Предел вложенности | не могууже естьasync defвнутренний вызов функцииasyncio.run()。 |
Если вы находитесь внутри асинхронной функции и пытаетесь получить результаты другой асинхронной функции, используйтеawait, вместоasyncio.run()。
# Демонстрация ошибки
асинхронная защита sub_task():
вернуть 10
асинхронное определение main():
# Здесь произойдет ошибка: RuntimeError: asyncio.run() нельзя вызвать из работающего цикла событий.
res = asyncio.run(sub_task())
# Правильная коррекция
асинхронное определение main():
res = await sub_task() # Пожалуйста, используйте await в асинхронной среде
asyncio.run()В качестве кнопки запуска программы поместите ее вif __name__ == "__main__":в блоке.asyncio.run()Исключение будет выброшено напрямую. Рекомендуетсяrunвнешний слой плюсtry...except。asyncio.run()можно удалить целиком.NumPy(Numerical Python) — самая важная библиотека научных вычислений в Python. Он обеспечивает эффективные объекты многомерного массива.ndarrayи большую библиотеку математических функций для работы с этими массивами. Это основа науки о данных, машинного обучения (например, Pandas, Scikit-learn, TensorFlow) и других областей.
forКруг.импортировать numpy как np
# Создаём одномерные и двумерные массивы
arr1 = np.array([1, 2, 3])
arr2 = np.array([[1, 2], [3, 4]])
# Быстро создать определенный массив
нули = np.zeros((3, 3)) # матрица 3x3 со всеми нулями
ones = np.ones((2, 4)) # матрица 2x4 со всеми единицами
глаз = np.eye(3) # единичная матрица 3x3
range_arr = np.arange(0, 10, 2) # [0, 2, 4, 6, 8]
| Функция | Пример кода | иллюстрировать |
|---|---|---|
| Проверка формы | arr.shape |
Возвращает размер каждого измерения (например, (3, 2)). |
| изменить форму | arr.reshape(1, 6) |
Изменение размеров без изменения данных. |
| Умножение матрицы | np.dot(a, b)илиa @ b |
Выполните умножение матриц в линейной алгебре. |
| статистическая функция | np.mean(), np.std() |
Рассчитайте среднее, стандартное отклонение, максимальное и минимальное значения. |
Синтаксис нарезки NumPy аналогичен синтаксису Python List, но более мощный и поддерживает одновременную многомерную нарезку:
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# Получаем второй столбец (индекс 1)
print(arr[1, :]) # [4, 5, 6]
# Получаем подматрицу 2x2 в правом нижнем углу
print(arr[1:, 1:]) # [[5, 6], [8, 9]]
pip install numpyилиconda install numpy。import numpy as np
print(np.__version__)
Как упоминалось ранее,NumbaОн может прекрасно распознавать структуру массива NumPy и далее компилировать сложные операции NumPy в машинный код, достигая предела выполнения, близкого к родному языку C.
NumbaЭто JIT-компилятор с открытым исходным кодом, специально разработанный для ускорения кода Python, обрабатывающего большие объемы данных. Он может переводить функции Python в машинный код со скоростью выполнения, сравнимой со скоростью C, C++ или Fortran, и особенно подходит дляNumPyОперации с массивами.
Самый простой способ использовать Numba — добавить@jitили@njitДекоратор.
из numba import njit
импортировать numpy как np
# @njit представляет режим «nopython», который гарантирует отсутствие входа в парсер Python и является самым быстрым
@njit
защита fast_function(n):
итого=0
для я в диапазоне (n):
всего += я
общая сумма возврата
# Первый вызов скомпилируется, второй вызов напрямую выполнит машинный код
печать (fast_function (10000000))
| модель | Декоратор | иллюстрировать |
|---|---|---|
| режим nopython | @njit |
Рекомендуется.Полностью отделен от интерпретатора Python и напрямую компилируется в машинный код. Если код программы содержит части, которые не могут быть скомпилированы, будет сообщено об ошибке. |
| объектный режим | @jit |
Если его не удастся скомпилировать, он вернется к синтаксическому анализатору Python для выполнения. Улучшения производительности обычно ограничены. |
Чтобы воспользоваться преимуществами многоядерных возможностей вашего процессора, просто включитеparallel=Trueи использоватьprange。
из numba import njit, prange
@njit(параллельно=Истина)
защитапараллельная_сумма(А):
с = 0
# prange автоматически распределит циклы по разным ядрам процессора
для меня в prange(A.shape[0]):
s += А[я]
вернуть с
pip install numbaилиconda install numba。llvmliteбиблиотека).import numba
print(numba.__version__)
dict、listИли низкая производительность при настройке объектов.Pandas — это инструмент анализа и манипулирования данными на основе Python, предназначенный для обработки структурированных данных, таких как табличные данные или данные временных рядов.
импортировать панд как pd
# Создать фрейм данных
data = {'Имя': ['Алиса', 'Боб', 'Чарли'],
«Возраст»: [25, 30, 35],
«Город»: [»Тайбэй», «Тайчжун», «Гаосюн»]}
df = pd.DataFrame(данные)
# Просмотр данных
печать (дф)
# Фильтровать информацию старше 28 лет
filtered_df = df[df['age'] > 28]
печать (filtered_df)
Pandas предоставляет эффективные, гибкие и интуитивно понятные методы работы, которые особенно подходят для анализа и обработки данных. Это один из незаменимых инструментов в области науки о данных и машинного обучения.
Pandas — мощный инструмент анализа данных, и как новички, так и опытные пользователи могут извлечь выгоду из его простого в использовании дизайна и обширных функций.
Сначала вам нужно установитьgoogletransнабор. Введите следующую команду в командной строке:
pip install googletrans==4.0.0-rc1
Примечание. Пожалуйста, подтвердите версию при установке.4.0.0-rc1, поскольку более старые версии могут больше не работать.
Вот пример перевода с английского на традиционный китайский:
из переводчика импорта Googletrans
#Инициализируем объект переводчика
переводчик = Переводчик()
# Перевести текст
text = "Привет, как дела?"
результат = переводчик.translate(text, src="en", dest="zh-tw")
# Вывод результатов перевода
print("исходный текст:", текст)
print("Перевод:", result.text)
Вы можете переводить на несколько языков, вот коды распространенных языков:
enzh-twzh-cnjakofrdeGoogletrans — это неофициальный API-интерфейс Google Translate, который может перестать работать из-за изменений со стороны Google. Если вы обнаружите, что функция перевода не работает, рассмотрите возможность использования других API перевода, например официального облачного перевода Google. API.
DeepL предоставляет услуги высокоточного перевода, но для использования API разработчика требуется ключ API.
Инструмент перевода, предоставляемый Microsoft, поддерживает многоязычный перевод, но требует использования настроек ключа API Azure.
Служба перевода, предоставляемая Amazon Web Services (AWS), обеспечивает эффективный перевод многоязычных текстов, доступ к которой осуществляется через ключ API, предоставленный AWS.
LibreTranslate — это инструмент перевода с открытым исходным кодом, который может настроить собственный сервер и не требует ключа API. Некоторые сторонние публичные серверы также предлагают возможность использовать их без ключа API.
TextBlob — это инструмент для обработки естественного языка со встроенными функциями Google Translate. Однако более старые версии не требуют ключа API и, возможно, придется обратить внимание на поддержку версий.
MyMemory обеспечивает перевод на основе памяти. Для некоторых функций не требуется ключ API, но для расширенного использования может потребоваться приложение.
Среди конкурентов Googletrans LibreTranslate и некоторые версии TextBlob предлагают варианты, не требующие ключа API. Если вам нужен инструмент, который совершенно бесплатен и не требует дополнительной настройки, рассмотрите эти варианты.
OpenCC(Open Chinese Convert) — проект с открытым исходным кодом, посвященный преобразованию упрощенного китайского языка в традиционный китайский. Это не просто преобразование слов в слова, но, что более важно, оно обрабатываетуровень словарного запасаконверсия и различия в привычках использования слов в разных регионах (материковый Китай, Тайвань, Гонконг).
В Python наиболее часто используемой библиотекой упаковки являетсяopencc-python-reimplemented。
# Инструкции по установке
pip install переопределенная opencc-python
# Пример базового кода
из opencc импортировать OpenCC
# Инициализация, s2t расшифровывается как Simplified to Traditional (упрощенный до традиционного)
cc = OpenCC('s2t')
text = "Искусственный интеллект изменил мир"
результат = cc.convert(текст)
print(result) #Вывод: Искусственный интеллект изменил мир
| Имя схемы | иллюстрировать | Применимые ситуации |
|---|---|---|
| s2t | Упрощенный китайский на традиционный китайский | Преобразуйте стандартные символы из простых в традиционные. |
| t2s | Традиционный китайский на упрощенный китайский | Стандартные символы преобразуются из традиционных в упрощенные. |
| s2twp | С упрощенного китайского на тайваньский традиционный китайский (включая словарный запас) | Чаще всего используется на Тайване.Превратим «программное обеспечение» в «программное обеспечение». |
| tw2s | Тайваньский традиционный китайский на упрощенный китайский | Преобразуйте тайваньские идиомы в упрощенный китайский язык материкового Китая. |
| s2hk | Упрощенный до традиционного гонконгского | Это соответствует привычкам использования слов в Гонконге (например, «里» заменено на «里»). |
Если вы не хотите писать программу, OpenCC также можно использовать непосредственно в терминале:
# Преобразование input.txt в выходной.txt, используя упрощенный режим в традиционный тайваньский.
opencc -i input.txt -o output.txt -c s2twp.json
reimplementedВерсия..jsonОпределения файлов, вы можете перейти в каталог установки OpenCC, чтобы увидеть, как работают эти словари.В следующем примере показано, как использовать Python для запроса всех фонетических обозначений китайских иероглифов. мы используемpypinyinКомплект для получения пиньинь китайских иероглифов и настройки таблицы соответствия пиньинь фонетическим символам.
pip install pypinyin
Ниже приведен код Python, включая таблицу фонетического соответствия и логику программы для запроса и генерации результатов HTML.
из pypinyin импорт пиньинь, стиль
из шаблона импорта jinja2
# Простая таблица соответствия от Пиньинь до Чжуинь
pinyin_to_zhuyin = {
"a": "ㄚ", "ai": "ㄞ", "an": "ㄢ", "ang": "ㄤ", "ao": "ㄠ",
"ба": "ㄅㄚ", "бай": "ㄅㄞ", "бан": "ㄅㄢ", "bang": "ㄅㄤ", "бао": "ㄅㄠ",
# Опустить некоторые соответствия и нужно их улучшить самостоятельно
«хао»: «ㄏㄠ», «хао»: «ㄏㄠ», «хо»: «ㄏㄠˇ», «хао»: «ㄏㄠˋ»
}
# Запросить все китайские иероглифы пиньинь и преобразовать их в пиньинь
защита get_zhuyin (символ):
пиньинь = пиньинь (char, style=Style.NORMAL, гетероним=True)
unique_pinyins = set(пиньины[0])
zhuyins = {p: pinyin_to_zhuyin.get(p, p) for p in unique_pinyins} # Преобразование пиньинь в чжуинь
список возврата (zhuyins.values())
# Символы запроса
chinese_char = 'good' # можно заменить другими символами
zhuyin_results = get_zhuyin(chinese_char)
pinyin_to_zhuyinСловарь для сопоставления пиньинь с фонетическими символами. Эту таблицу соответствия необходимо расширить отдельно.heteronym=TrueУбедитесь, что отображаются все произношения многофонетических символов.импортировать ОС
# Проверяем, является ли это файлом
если os.path.isfile("example.txt"):
print("Файл существует")
# Проверяем, является ли это папкой
если os.path.isdir("my_folder"):
print("Папка существует")
# Проверяем, существует ли файл или папка
если os.path.exists("путь/к/проверке"):
print("путь существует")
из пути импорта pathlib
путь = Путь("пример.txt")
если путь.существует():
print("путь существует")
если путь.is_file():
print("это файл")
если путь.is_dir():
print("Это папка")
В Python самым стандартным и мощным модулем для копирования, перемещения, переименования и удаления файлов являетсяshutil(для операций высокого уровня) иos(для основных операций пути).
Операция копирования имеет разные функции в зависимости от того, необходимо ли сохранять метаданные (например, время создания, разрешения):
импортировать Shutil
# Копируем один файл
Shutil.copy2('source.txt', 'destination.txt')
# Скопируйте всю папку (папка назначения не должна существовать)
Shutil.copytree('my_folder', 'backup_folder')
Основная логика перемещения и переименования очень похожа. использоватьshutil.moveМожет выполняться на дисках, в то время какos.renameЕго часто используют для переименования одного и того же диска.
| Функция | Общие команды | иллюстрировать |
|---|---|---|
| Переместить файлы или каталоги | shutil.move(src, dst) |
Перемещайте файлы или целые каталоги по новым путям, поддерживая перекрестные разделы. |
| Переименовать файл | os.rename(old, new) |
Измените имя файла или каталога. |
импортировать Shutil
импортировать ОС
# Переместить файлы
Shutil.move('test.txt', 'архив/test.txt')
# Переименование
os.rename('старое_имя.txt', 'новое_имя.txt')
Операции удаления следует использовать с осторожностью, поскольку эти команды обычно не попадают в корзину, а напрямую удаляют их без возможности восстановления.
# Удалить один файл
если os.path.exists('temp.txt'):
os.remove('temp.txt')
# Принудительно удалить всю папку
Shutil.rmtree('old_data_folder')
Прежде чем выполнять копирование или перемещение, проверьте, существует ли путь, чтобы избежать сбоя программы:
os.path.join()илиpathlibМодуль для объединения путей для обеспечения работы программы между Windows (обратная косая черта) и Linux (косая черта).try...exceptпакет.shutil.copyиshutil.moveЕсли файл с таким же именем уже существует в пути назначения, он обычно перезаписывается напрямую. Перед выполнением следует подтвердить, нужно ли его переименовывать, чтобы избежать этого.ПитонloggingПакет представляет собой мощный встроенный набор для эффективного управления журналами в приложениях. Независимо от того, регистрируете ли вы отладочную информацию, отслеживаете ошибки или контролируете производительность,loggingКаждый пакет может предоставлять многоуровневые и многоформатные методы журналирования.
DEBUG、INFO、WARNING、ERRORиCRITICAL。Вот базовыйloggingПример конфигурации комплекта:
журнал импорта
# Установить регистратор
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)
# Установить обработчик
console_handler = logging.StreamHandler()
file_handler = logging.FileHandler('app.log')
# Установить форматтер
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(форматтер)
file_handler.setFormatter(форматтер)
# Добавляем обработчик в регистратор
logger.addHandler(console_handler)
logger.addHandler(file_handler)
# Тестируйте разные уровни журналов
logger.debug('Это отладочное сообщение')
logger.info('Это информационное сообщение')
logger.warning('Это предупреждающее сообщение')
logger.error('Это сообщение об ошибке')
logger.critical('Это серьезное сообщение')
loggingПоддерживаются следующие уровни журнала:
DEBUG: Самый низкий уровень, используемый для отладочной информации.INFO: Общая информация, например, рабочее состояние системы.WARNING: предупреждающая информация, но не приведет к остановке программы.ERROR: Информация об ошибке, которая обычно вызывает проблемы из-за ошибок.CRITICAL: Самая серьезная ошибка, которая может привести к завершению работы программы.Можно использоватьFormatterКласс, определяющий формат вывода журнала. Например:
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
Этот формат выведет что-то похожее на следующее:
2024-10-25 10:00:00 - my_logger - ИНФО - Это информационное сообщение
loggingПакет предоставляет различные варианты управления журналами, позволяя разработчикам настраивать уровни журналов, форматы вывода и места назначения в соответствии с потребностями, улучшая удобство обслуживания и эффективность отладки приложений.
на Pythonloggingв комплекте,HandlerЭто ключевой компонент, отвечающий за определение места вывода журнала. Разные процессоры могут выводить журналы в разные места назначения, включая консоль, файл, сеть и даже электронную почту.StreamHandlerОдин из наиболее часто используемых процессоров, он отвечает за вывод логов на консоль.
существоватьlogging, некоторые общиеHandlerвключать:
StreamHandler: Вывод журнала вstdoutилиstderr(обычно консоль).FileHandler: Вывод журналов в файл.NullHandler: Игнорировать вывод журнала, подходит для ситуаций, когда отображение не требуется.SMTPHandler: отправлять журналы по электронной почте.StreamHandler— наиболее часто используемый процессор для вывода на консоль, он обычно отправляет сообщения журнала в стандартную ошибку (stderr). через настройкиStreamHandler, что позволяет отображать журналы непосредственно на консоли, что подходит для мониторинга состояния системы в реальном времени.
Если вы не хотите, чтобы логи отображались на консоли, вы можете удалить их из Logger.StreamHandlerили используйте вместо негоNullHandlerчтобы избежать вывода.
В следующем примере показано, как настроитьloggingи удалите вывод консолиStreamHandler:
журнал импорта
# Установить регистратор
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)
# Добавляем StreamHandler для вывода на консоль
console_handler = logging.StreamHandler()
logger.addHandler(console_handler)
# Тестовый вывод
logger.info("Это сообщение будет отображено на консоли")
# Удалить вывод консоли
logger.removeHandler(console_handler)
logger.info("Это сообщение не будет отображаться на консоли")
Можно использоватьNullHandlerЧтобы отключить весь вывод журнала:
журнал импорта
# Настраиваем Logger и добавляем NullHandler
logger = logging.getLogger('my_logger')
logger.addHandler(logging.NullHandler())
# Это сообщение не будет отображаться в консоли
logger.info("Это сообщение не будет отображаться")
HandlerдаloggingКомпонент в наборе, определяющий местоположение вывода. черезStreamHandler, сообщения журнала могут отображаться на консоли для мониторинга в режиме реального времени. Если вывод консоли не нужен, его можно удалитьStreamHandlerили используйтеNullHandlerчтобы отключить вывод журнала.
Чтобы включить идентификатор потока в logging.Formatter, вы можете использовать%(thread)dсвойство. При этом отображается уникальный целочисленный идентификатор, присвоенный потоку системой.
журнал импорта
# Добавьте %(thread)d для отображения идентификатора потока
log_formatter = logging.Formatter(
'%(asctime)s.%(msecs)03d %(thread)d %(levelno)s %(message)s',
"%Y-%m-%d %H:%M:%S"
)
#Пример вывода:
# 2025-12-20 16:30:45.123 140735612345678 20 Это сообщение журнала.
В дополнение к целочисленному идентификатору вы также можете выбрать отображение имени потока в соответствии с вашими потребностями:
Этот код показывает, как применить этот формат в многопоточной среде:
журнал импорта
импорт потоков
# 1. Установить форматтер
log_format = '%(asctime)s.%(ms)03d [Thread:%(thread)d] %(levelno)s %(message)s'
date_format = "%Y-%m-%d %H:%M:%S"
форматтер = logging.Formatter(log_format, date_format)
# 2. Установите процессор журнала
обработчик = logging.StreamHandler()
handler.setFormatter(форматтер)
logger = logging.getLogger("ThreadTest")
logger.addHandler(обработчик)
logger.setLevel(logging.INFO)
# 3. Функция тестирования
задача определения():
logger.info("Подпоток выполняется")
# Начать тестирование
logger.info("Основной поток запущен")
t = threading.Thread(цель=задача)
т.старт()
t.join()
Python имеет встроенную поддержку SQLite и подходит для небольших приложений.
import sqlite3
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
cursor.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)")
cursor.execute("INSERT INTO users (name) VALUES (?)", ("Alice",))
conn.commit()
cursor.execute("SELECT * FROM users")
print(cursor.fetchall())
cursor.close()
conn.close()
Используется для подключения к базе данных MySQL.
pip install pymysql
import pymysql
conn = pymysql.connect(host="localhost", user="root", password="password", database="test")
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
print(cursor.fetchall())
cursor.close()
conn.close()
Используется для подключения к PostgreSQL.
pip install psycopg2
import psycopg2
conn = psycopg2.connect(dbname="testdb", user="user", password="password", host="localhost")
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
print(cursor.fetchall())
cursor.close()
conn.close()
Используется для подключения к Microsoft SQL Server.
pip install pyodbc
import pyodbc
conn = pyodbc.connect("DRIVER={SQL Server}; SERVER=localhost; DATABASE=test; UID=user; PWD=password")
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
print(cursor.fetchall())
cursor.close()
conn.close()
Подходит для файловых баз данных.
pip install pymongo
import pymongo
client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["testdb"]
collection = db["users"]
collection.insert_one({"name": "Alice", "age": 25})
print(list(collection.find()))
Подходит для кэширования и высокопроизводительного доступа по принципу «ключ-значение».
pip install redis
import redis
r = redis.Redis(host="localhost", port=6379, decode_responses=True)
r.set("name", "Alice")
print(r.get("name"))
Подходит для полнотекстового поиска и анализа.
pip install elasticsearch
from elasticsearch import Elasticsearch
es = Elasticsearch("http://localhost:9200")
doc = {"name": "Alice", "age": 25}
es.index(index="users", document=doc)
print(es.search(index="users", query={"match_all": {}}))
Поддерживает несколько баз данных SQL и предоставляет функции ORM.
pip install sqlalchemy
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, sessionmaker
engine = create_engine("sqlite:///example.db")
Base = declarative_base()
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
name = Column(String)
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
session.add(User(name="Alice"))
session.commit()
print(session.query(User).all())
sqlite3(встроенный),pymysql(MySQL)、psycopg2(PostgreSQL)、pyodbc(SQL Server)。pymongo(MongoDB)、redis(Redis)、elasticsearch(Elasticsearch)。SQLAlchemy(Поддерживает несколько баз данных SQL).Установите PyMySQL, используя следующие инструкции:
pip install pymysql
Используйте PyMySQL для подключения к серверу MySQL:
импортпимиsql
# Установить соединение
conn = pymysql.connect(
хост="локальныйхост",
пользователь="ваш_пользователь",
пароль="ваш_пароль",
база данных="ваша_база_данных",
набор символов="utf8mb4",
курсоркласс=pymysql.cursors.DictCursor # Возвращает формат словаря
)
#Создаем курсор
курсор = conn.cursor()
# Запросить информацию
курсор.execute("ВЫБРАТЬ * ИЗ вашей_таблицы")
результат = курсор.fetchall()
для строки в результате:
печать (строка)
# Закрыть соединение
курсор.закрыть()
конн.закрыть()
При выполнении операторов INSERT, UPDATE и DELETE необходимо внести изменения:
попробуйте:
с conn.cursor() в качестве курсора:
sql = "ВСТАВИТЬ В пользователей (имя, возраст) ЗНАЧЕНИЯ (%s, %s)"
курсор.execute(sql, («Алиса», 25))
conn.commit() # Отправляем изменения
кроме исключения как e:
conn.rollback() # Откат при возникновении ошибки
print("Произошла ошибка:", e)
Можно использоватьcallprocВызов хранимой процедуры:
with conn.cursor() as cursor:
cursor.callproc("your_stored_procedure", (param1, param2))
result = cursor.fetchall()
print(result)
использоватьexecutemanyЧтобы выполнить массовую вставку:
data = [("Bob", 30), ("Charlie", 28), ("David", 35)]
sql = "INSERT INTO users (name, age) VALUES (%s, %s)"
with conn.cursor() as cursor:
cursor.executemany(sql, data)
conn.commit()
Используйте параметризованные запросы для предотвращения атак с использованием SQL-инъекций:
name = "Alice"
sql = "SELECT * FROM users WHERE name = %s"
with conn.cursor() as cursor:
cursor.execute(sql, (name,))
result = cursor.fetchall()
print(result)
Обязательно закройте соединение с базой данных после завершения работы программы:
conn.close()
PyMySQL автоматическиdatetime.datetimeПреобразование в MySQL DATETIME и может быть передано напрямую.
import pymysql
import datetime
conn = pymysql.connect(
host="localhost",
user="root",
password="pwd",
database="testdb",
cursorclass=pymysql.cursors.DictCursor
)
with conn:
with conn.cursor() as cur:
now = datetime.datetime.now()
sql = """
INSERT INTO logs (msg, created_at)
VALUES (%s, %s)
"""
cur.execute(sql, ("hello world", now))
conn.commit()
today = datetime.date.today()
sql = "INSERT INTO records (start_date) VALUES (%s)"
cur.execute(sql, (today,))
conn.commit()
Найденное поле автоматически станетdatetime.datetimeтип.
sql = "ВЫБРАТЬ идентификатор, созданный_at ИЗ журналов ORDER BY id DESC LIMIT 1"
cur.execute(sql)
строка = cur.fetchone()
dt = строка["create_at"]
печать(дт, тип(дт))
# Например: 2025-07-01 15:22:33
formatted = dt.strftime("%Y-%m-%d %H:%M:%S")
print(formatted)
start = datetime.datetime(2025, 1, 1, 0, 0, 0)
sql = """
SELECT * FROM logs
WHERE created_at >= %s
"""
cur.execute(sql, (start,))
rows = cur.fetchall()
begin = datetime.datetime(2025, 1, 1)
end = datetime.datetime(2025, 1, 31, 23, 59, 59)
sql = """
SELECT * FROM logs
WHERE created_at BETWEEN %s AND %s
"""
cur.execute(sql, (begin, end))
rows = cur.fetchall()
sql = "SELECT created_at FROM logs_str LIMIT 1"
cur.execute(sql)
row = cur.fetchone()
dt = datetime.datetime.strptime(row["created_at"], "%Y-%m-%d %H:%M:%S")
print(dt)
items = [
("log1", datetime.datetime.now()),
("log2", datetime.datetime.now()),
]
sql = "INSERT INTO logs (msg, created_at) VALUES (%s, %s)"
cur.executemany(sql, items)
conn.commit()
strptimeРучной разбор.импортпимиsql
импорт даты и времени
# Устанавливаем соединение с базой данных
conn = pymysql.connect(
хост = 'локальный хост',
пользователь = 'корень',
пароль = 'ваш_пароль',
база данных = 'ваш_дб',
курсоркласс=pymysql.cursors.DictCursor # Возвращает поля как словарь
)
с подключением:
с conn.cursor() в качестве курсора:
sql = "ВЫБЕРИТЕ идентификатор, созданный_в ИЗ вашей_таблицы LIMIT 1"
курсор.execute(sql)
результат = курсор.fetchone()
dt = result['created_at'] # Предположим, что поле созданного_at имеет тип datetime
печать (дт)
печать (тип (дт))
dt_str = dt.strftime("%Y-%m-%d %H:%M:%S")
print(dt_str)
# Если созданный_at хранится в строковом формате (например, CHAR/VARCHAR)
dt = datetime.datetime.strptime(result['created_at'], "%Y-%m-%d %H:%M:%S")
печать (дт)
# Если DictCursor не установлен, данные будут кортежем, а метод значения будет следующим:
курсор = conn.cursor()
курсор.execute("ВЫБЕРИТЕ идентификатор, созданный_в ИЗ вашей_таблицы")
строка = курсор.fetchone()
dt = строка[1]
импортпимиsql
импорт даты и времени
# Устанавливаем соединение с базой данных
conn = pymysql.connect(
хост = 'локальный хост',
пользователь = 'корень',
пароль = 'ваш_пароль',
база данных = 'ваш_дб',
курсоркласс = pymysql.cursors.DictCursor
)
с подключением:
с conn.cursor() в качестве курсора:
sql = "ВЫБЕРИТЕ созданный_at ИЗ ПРЕДЕЛА вашей_таблицы 1"
курсор.execute(sql)
результат = курсор.fetchone()
dt_from_sql = result['created_at'] # тип даты и времени
сейчас = дата-время.дата-время.сейчас()
# Рассчитать разницу во времени
разница = сейчас - dt_from_sql
print(f"Разница в днях: {diff.days}")
diff = now.date() - dt_from_sql.date()
print(f"Разница в чистых датах в днях: {diff.days}")
импортпимиsql
импорт даты и времени
# Устанавливаем соединение с базой данных
conn = pymysql.connect(
хост = 'локальный хост',
пользователь = 'корень',
пароль = 'ваш_пароль',
база данных = 'ваш_дб',
курсоркласс = pymysql.cursors.DictCursor
)
с подключением:
с conn.cursor() в качестве курсора:
sql = "ВЫБЕРИТЕ созданный_at ИЗ ПРЕДЕЛА вашей_таблицы 1"
курсор.execute(sql)
результат = курсор.fetchone()
dt_from_sql = result['created_at'] # тип даты и времени
сейчас = дата-время.дата-время.сейчас()
# Рассчитать разницу во времени
разница = сейчас - dt_from_sql
часы = diff.total_секунды() / 3600
print(f"Разница в часах: {hours}")
print(f"Разница равна целому числу часов: {int(hours)}")
В InnoDB, механизме хранения данных MySQL по умолчанию, уровень изоляции по умолчанию равенREPEATABLE READ(повторяемое чтение).
Это означает, что после того, как вы выполните первый запрос в той же транзакции (транзакции), MySQL создаст «снимок» транзакции. Даже если данные в базе данных будут изменены другими программами через секунду, пока ваша транзакция не завершится, второй запрос все равно увидит те же данные снимка, что и в первый раз. Это необходимо для обеспечения последовательности «повторяемого чтения».
Это самый стандартный подход. Прежде чем выполнить второй запрос, вызовитеconnection.commit(). Отправка завершит текущую транзакцию, и MySQL создаст новый снимок во время следующего запроса и прочитает последние данные.
# Первый запрос
курсор.execute(sql)
результат1 = курсор.fetchall()
# Принудительное обновление: зафиксировать текущую транзакцию
соединение.коммит()
# Второй запрос будет собирать самую свежую информацию.
курсор.execute(sql)
результат2 = курсор.fetchall()
Если вы хотите, чтобы каждая команда SQL вступила в силу немедленно и видели последние результаты, вы можете включить автоматическую отправку после установления соединения. Итак, каждыйexecute()будут рассматриваться как независимые вопросы.
Connection.autocommit = Истина
# Все последующие выполнения (sql) будут напрямую считывать последний статус базы данных
Вы можете изменить уровень изоляции наREAD COMMITTED(прочитайте содержимое коммита). На этом уровне каждый раз, когда запрос выполняется в рамках одной и той же транзакции, будут считываться последние отправленные данные.
# Устанавливается перед выполнением запроса
курсор.execute("УСТАНОВИТЬ УРОВЕНЬ ИЗОЛЯЦИИ СЕАНСА ТРАНЗАКЦИИ ЧТЕНИЕ ЗАПРЕЩЕНО")
connection(проводная) область транзакции, а неcursorСам объект. Если вы заново создадите курсор, но используете то же соединение и не зафиксируете, проблема все равно будет существовать.В многопоточной среде Python, если несколько потоков используют одно и то же соединение с базой данных, возникнут серьезные конфликты. Это связано с тем, что связанные объекты обычно не являются потокобезопасными. Несколько потоков, одновременно отправляющих команды SQL или считывающих результаты, могут привести к путанице данных, исключениям транзакций или прерываниям соединения. Поэтому рекомендуется использовать пул соединений для выделения независимых соединений каждому потоку.
mysql-connector-pythonВстроенная простая функция пула соединений. Вы можете заранее создать пул и «заимствовать» из него соединения, когда потоки в этом нуждаются.
импорт потоков
импортировать mysql.connector
из пула импорта mysql.connector
# 1. Создайте пул соединений (глобальная переменная)
db_config = {
"хост": "локальный хост",
"пользователь": "корень",
"пароль": "пароль",
"база данных": "test_db"
}
Connection_pool = mysql.connector.pooling.MySQLConnectionPool(
имя_пула="мой_пул",
Pool_size=5, # Установите размер пула, который должен быть больше или равен количеству потоков
**db_config
)
# 2. Выполнение функции задачи потока
защита thread_task (task_id):
конн = Нет
попробуйте:
# Получаем независимое соединение из пула
conn = Connection_pool.get_connection()
курсор = conn.cursor()
# Выполняем операции
курсор.execute("ВЫБРАТЬ СЕЙЧАС()")
результат = курсор.fetchone()
print(f"Время чтения потока выполнения {task_id}: {result}")
# Примечание. На этом уровне изоляции не забудьте зафиксировать изменения, если есть какие-либо изменения.
# conn.commit()
кроме исключения как e:
print(f"Произошла ошибка в потоке {task_id}: {e}")
наконец:
# Важно: закройте курсор и соединение (здесь закрытие вернет соединение с пулом, а не прервет его)
если conn и conn.is_connected():
курсор.закрыть()
конн.закрыть()
# 3. Запуск нескольких потоков выполнения
темы = []
для меня в диапазоне (3):
t = threading.Thread(target=thread_task, args=(i,))
потоки.append(т)
т.старт()
за т в темах:
t.join()
Если вы разрабатываете более крупное приложение, SQLAlchemy обеспечивает более мощное и автоматизированное управление соединениями (QueuePool). Он автоматически обрабатывает сбои соединения, перезапуск и распределение потоков.
из импорта sqlalchemy create_engine
из sqlalchemy.orm импортировать создатель сеанса
# Пул соединений будет автоматически включен при создании Engine
двигатель = create_engine(
"mysql+mysqlconnector://root:password@localhost/test_db",
размер_пула=10,
max_overflow=20
)
# Используйте создатель сеансов, чтобы гарантировать, что каждый поток получит независимый сеанс
Сессия = создатель сеанса (привязка = двигатель)
защита sqlalchemy_task():
сеанс = сеанс()
попробуйте:
# Выполняем операции
# сеанс.execute(...)
сеанс.коммит()
наконец:
session.close() # Возвращаем соединение
withСинтаксис для управления курсором и соединением, чтобы гарантировать возможность возврата соединения даже в случае возникновения исключения.commit()илиrollback(), в противном случае соединение может иметь статус незавершенной транзакции при возвращении в пул, что повлияет на следующего пользователя.Чтобы выполнить хранимые процедуры MySQL в Python, вы можете использоватьmysql-connector-pythonилиPyMySQL。
pip install mysql-connector-python
импортировать mysql.connector
# Подключаемся к базе данных
conn = mysql.connector.connect(
хост="локальныйхост",
пользователь="ваш_пользователь",
пароль="ваш_пароль",
база данных="ваша_база_данных"
)
курсор = conn.cursor()
# Вызов хранимой процедуры
курсор.callproc("your_stored_procedure", (param1, param2))
# Получите результаты
для результата в курсоре.stored_results():
печать (результат.fetchall())
# Закрыть соединение
курсор.закрыть()
конн.закрыть()
Чтобы выполнить хранимые процедуры SQL Server в Python, вы можете использоватьpyodbc。
pip install pyodbc
импортировать pyodbc
# Подключаемся к SQL-серверу
conn = pyodbc.connect("DRIVER={SQL Server};"
"СЕРВЕР=ваш_сервер;"
"БАЗА ДАННЫХ=ваша_база_данных;"
"UID=ваш_пользователь;"
"PWD=ваш_пароль")
курсор = conn.cursor()
# Выполняем хранимую процедуру
курсор.execute("{CALL your_stored_procedure (?, ?)}", (param1, param2))
# Получите результаты
строки = курсор.fetchall()
для строки в строках:
печать (строка)
# Закрыть соединение
курсор.закрыть()
конн.закрыть()
Чтобы выполнить хранимые процедуры PostgreSQL в Python, вы можете использоватьpsycopg2。
pip install psycopg2
импорт psycopg2
# Подключаемся к PostgreSQL
conn = psycopg2.connect(
dbname="ваша_база_данных",
пользователь="ваш_пользователь",
пароль="ваш_пароль",
хост="локальныйхост",
порт="5432"
)
курсор = conn.cursor()
# Выполняем хранимую процедуру
курсор.callproc("your_stored_procedure", (param1, param2))
# Получите результаты
строки = курсор.fetchall()
для строки в строках:
печать (строка)
# Закрыть соединение
курсор.закрыть()
конн.закрыть()
fetchall()илиstored_results()чтобы получить результаты.requestsЭто наиболее часто используемый набор HTTP-запросов в Python, используемый для доступа к REST API, загрузки веб-страниц, отправки данных формы и т. д. Он лучше, чем встроенныйurllibБолее краткий и простой в использовании.
pip install requests
запросы на импорт
#Отправить GET-запрос
URL = "https://api.pionex.com/api/v1/common/symbols"
ответ = запросы.получить (URL)
# Проверяем, успешно ли
если ответ.код_статуса == 200:
данные = ответ.json()
print("Запрос успешен, поле возврата:", list(data.keys()))
еще:
print("Запрос не выполнен:", response.status_code)
import requests
url = "https://httpbin.org/post"
payload = {"key": "value", "symbol": "BTC_USDT"}
headers = {"Content-Type": "application/json"}
res = requests.post(url, json=payload, headers=headers)
print(res.json())
| метод | использовать |
|---|---|
requests.get() | Получить информацию (наиболее часто используемый) |
requests.post() | Отправьте информацию или формы |
requests.put() | Обновить информацию |
requests.delete() | Удалить данные |
response.status_code | Код состояния HTTP |
response.json() | Разобрать ответ JSON |
response.text | Получите оригинальный текстовый контент |
response.raise_for_status() | Автоматически генерировать исключения ошибок HTTP |
запросы на импорт
попробуйте:
r = Requests.get("https://api.pionex.com/api/v1/unknown")
r.raise_for_status()
кроме запросов.исключения.HTTPError как e:
print("Ошибка HTTP:", e)
кроме запросов.исключения.RequestException как e:
print("Общая ошибка запроса:", e)
pandasилиasyncioЕго можно использовать для получения больших объемов данных.raise_for_status()даrequestsВ модулеResponseМетод объекта, используемый для проверки того, является ли код состояния ответа HTTP ошибкой (например, 4xx или 5xx).
Если код состояния показывает, что запрос не выполнен, он автоматически выдастrequests.exceptions.HTTPErrorИсключения используются для облегчения отладки или остановки выполнения.
запросы на импорт
URL = "https://api.pionex.com/api/v1/common/symbols"
ответ = запросы.получить (URL)
# Проверьте, успешен ли код состояния HTTP (200~299).
ответ.raise_for_status()
# В случае успеха JSON можно безопасно проанализировать
данные = ответ.json()
print("Запрос выполнен успешно, получено количество торговых пар:", len(data.get("data", [])))
Запрос прошел успешно, получено количество торговых пар: 248.
запросы на импорт
попробуйте:
r = Requests.get("https://api.pionex.com/api/v1/invalid_endpoint")
r.raise_for_status()
кроме запросов.исключения.HTTPError как e:
print("Ошибка HTTP:", e)
кроме запросов.исключения.RequestException как e:
print("Исключение запроса:", e)
HTTPError。запросы на импорт
# Вызов API
URL = "https://api.example.com/data"
ответ = запросы.получить (URL)
# Подтверждаем, что ответ успешен
если ответ.код_статуса == 200:
print("Данные получены успешно")
еще:
print(f"Ошибка: {response.status_code}")
# Анализ ответа JSON данные = ответ.json() #Доступ к данным JSON печать(данные["ключ1"]) print(данные["ключ2"]["подключ"])
запросы на импорт
# URL-адрес API
URL = "https://jsonplaceholder.typicode.com/posts"
# Отправить запрос
ответ = запросы.получить (URL)
# Проверить статус ответа и проанализировать
если ответ.код_статуса == 200:
данные = ответ.json()
# Перечислите названия каждой статьи
для публикации в данных:
print(f"Идентификатор сообщения: {post['id']}, заголовок: {post['title']}")
еще:
print(f"Ошибка вызова API, код состояния: {response.status_code}")
попробуйте:
данные = ответ.json()
распечатать (данные)
кроме ValueError:
print("Ответ не в допустимом формате JSON")
Python предоставляетjsonМодуль конвертации (сериализации) данных в формат JSON,
И его можно сохранить как файл (дамп) или перезагрузить (загрузить) для достижения эффекта кэширования.
json.dump(obj, file): записать объект Python в файл (формат JSON).json.dumps(obj): преобразовать объект в строку JSON.json.load(file): прочитать JSON из файла и преобразовать его обратно в объект Python.json.loads(str): преобразовать строку JSON обратно в объект Python.импортировать JSON
импортировать ОС
файл_кэша = "кэш_данных.json"
# Источник данных моделирования
данные = {
"имя": "Алиса",
«возраст»: 30,
"хобби": ["чтение", "музыка", "программирование"]
}
#Запись данных в файл JSON (дамп)
с open(cache_file, "w",coding="utf-8") как f:
json.dump(данные, f, обеспечения_ascii=False, отступ=2)
print("Данные в файле кэшированы.")
# Чтение данных JSON из файла (загрузка)
если os.path.exists(cache_file):
с open(cache_file, "r",coding="utf-8") как f:
загруженные_данные = json.load(f)
print("Загруженные данные:", loading_data)
Данные были кэшированы в файле.
Загруженные данные: {'имя': 'Алиса', 'возраст': 30, 'хобби': ['чтение', 'музыка', 'программирование']}
ensure_ascii=False: Убедитесь, что китайские символы не преобразуются в кодировку Unicode.indent=2: сделать файл JSON более читабельным.json.load()Автоматически восстановит JSON до соответствующих типов, таких как dict, list, int, str и т. д.импортировать JSON, ОС
CACHE_PATH = "result_cache.json"
защита дорогой_расчет():
print("Выполнение сложной операции...")
вернуть [x**2 для x в диапазоне (5)]
защита get_cached_result():
#Загружаем кэш, если он существует
если os.path.exists(CACHE_PATH):
с open(CACHE_PATH, "r") как f:
вернуть json.load(f)
# В противном случае запись в кеш после расчета
результат = дорогой_расчет()
с open(CACHE_PATH, "w") как f:
json.dump(результат, е)
вернуть результат
данные = get_cached_result()
print("Получить данные:", данные)
Выполнение сложных операций...
Получить данные: [0, 1, 4, 9, 16]
Получить данные: [0, 1, 4, 9, 16]
json.dump(): Запись в файл JSON.json.load(): Чтение из файла JSON.dumps()иloads()Обработка строк.Это наиболее стандартный и распространенный способ хранения серии записей в одном формате. Рассматривайте все точки данных как список (соответствующие квадратные скобки в JSON).[]) элемент.
[
{"time": 1759028400000, "open": "109398.3", "close": "109364.8", "high": "109489.2", "low": "109364.8", "volume": "518.7594"},
{"time": 1759024800000, "open": "109305.6", "close": "109398.3", "high": "109496.4", "low": "109296.0", "volume": "757.0290"},
...
]
В Python вы просто создаете список словарей, а затем используетеjson.dumps()Выполните сериализацию.
import json
data_list = [
{'time': 1759028400000, 'open': '109398.3', 'close': '109364.8', 'high': '109489.2', 'low': '109364.8', 'volume': '518.7594'},
{'time': 1759024800000, 'open': '109305.6', 'close': '109398.3', 'high': '109496.4', 'low': '109296.0', 'volume': '757.0290'}
]
json_output = json.dumps(data_list, indent=4)
# print(json_output)
Если каждая точка данныхtimeЗначение уникально, и его можно использовать в качестве ключа объекта верхнего уровня для создания структуры словаря. Эта структура облегчает прямой запрос конкретных данных через метки времени.
{
"1759028400000": {"open": "109398.3", "close": "109364.8", "high": "109489.2", "low": "109364.8", "volume": "518.7594"},
"1759024800000": {"open": "109305.6", "close": "109398.3", "high": "109496.4", "low": "109296.0", "volume": "757.0290"},
...
}
Вам нужно перебрать список данных и преобразовать каждую точку данных.timeЗначение извлекается как ключ словаря.
импортировать JSON
исходные_данные = [
{'время': 1759028400000, 'открытие': '109398.3', 'закрытие': '109364.8', 'высокая': '109489.2', 'низкая': '109364.8', 'объем': '518.7594'},
{'время': 1759024800000, 'открытие': '109305.6', 'закрытие': '109398.3', 'высокая': '109496.4', 'низкая': '109296.0', 'объем': '757.0290'}
]
data_dict = {}
для элемента в source_data:
# Убедитесь, что временная метка является строкой, поскольку ключи JSON должны быть строками.
time_key = str(пункт['время'])
# Скопируйте или создайте новый словарь и удалите поле «время», поскольку оно теперь является ключевым
значение_данных = элемент.копия()
del value_data['время']
data_dict[time_key] = значение_данных
json_output = json.dumps(data_dict, отступ = 4)
# печать(json_output)
В Python используйте встроенныйjsonМодули — лучший способ сериализовать структуры данных Python, такие как списки и словари, в формат JSON. Ваша целевая структура соответствует в Python списку, содержащему словари.
Предположим, что данные, которые вы получаете в результате запроса к базе данных, уже представляют собой список, каждый элемент которого является словарем, а имена ключей соответствуют нужным вам именам полей JSON.
db_data = [
{'время': 1759028400000, 'открытие': '109398.3', 'закрытие': '109364.8', 'высокая': '109489.2', 'низкая': '109364.8', 'объем': '518.7594'},
{'время': 1759024800000, 'открытие': '109305.6', 'закрытие': '109398.3', 'высокая': '109496.4', 'низкая': '109296.0', 'объем': '757.0290'},
# ... дополнительные данные
]
json.dumps()Вам просто нужно импортироватьjsonмодуль и использоватьjson.dumps()Функция преобразует объект списка Python в строку в формате JSON.
импортировать JSON
# Предположим, что db_data готова
# Используйте json.dumps() для сериализации списков Python в строки JSON
# indent=4 используется для украшения вывода и облегчения чтения.
json_output_string = json.dumps(db_data, indent=4)
печать (json_output_string)
Это создаст строку JSON, соответствующую вашей цели:
[
{
"time": 1759028400000,
"open": "109398.3",
"close": "109364.8",
"high": "109489.2",
"low": "109364.8",
"volume": "518.7594"
},
{
"time": 1759024800000,
"open": "109305.6",
"close": "109398.3",
"high": "109496.4",
"low": "109296.0",
"volume": "757.0290"
}
]
Если ваш драйвер базы данных возвращает список кортежей (например:[(1759028400000, '109398.3', ...), ...]), вам необходимо преобразовать его в список словарей, прежде чем выполнять описанную выше сериализацию.
# Предположим, что имя поля следующее
field_names = ['время', 'открытие', 'закрытие', 'высокий', 'низкий', 'объем']
кортеж_данные = [
(1759028400000, '109398.3', '109364.8', '109489.2', '109364.8', '518.7594'),
#...
]
# Понимание списка
список_диктов = [
dict(zip(field_names, row))
для строки в tuple_data
]
# Теперь list_of_dicts можно передавать непосредственно в json.dumps() для сериализации.
В Python способ реализации веб-API и вывода JSON зависит от используемой вами платформы. Наиболее непосредственно соответствует PHPecho json_encode()Логика встроена с использованием PythonjsonМодули, но в веб-среде заголовки обычно автоматически обрабатываются с помощью инструментов, предоставляемых платформой.
FastAPI — лучший выбор для современной разработки Python, он автоматически преобразует файлы Pythondict(словарь) илиlist(список) в JSON и установите правильныйContent-Type。
из fastapi импортировать FastAPI
приложение = ФастAPI()
@app.get("/api/stocks")
защита get_stocks():
# Непосредственно возвращаем словарь Python, FastAPI автоматически обрабатывает json_encode
data = ["AAPL", "TSLA", "NVDA", "GOOGL"]
вернуть {"акции": данные}
В Flask официально представленоjsonifyФункция, помимо преобразования данных, также поможет вам установить заголовок ответа наapplication/json。
из фляги импорта Flask, jsonify
приложение = Колба(__name__)
@app.route('/api/stocks')
защита get_stocks():
data = ["AAPL", "TSLA", "NVDA", "GOOGL"]
# Эквивалент PHP echo json_encode($data) и добавления заголовка
вернуть jsonify (данные)
Если вы используете большой фреймворк Django, вы обычно будете использоватьJsonResponseобъект.
from django.http import JsonResponse
def stock_api(request):
data = {"stocks": ["AAPL", "TSLA"]}
return JsonResponse(data)
Если вы просто хотите просто получить строку JSON (например, записать в файл или настроить вывод), вы можете использоватьjson.dumps()。
импортировать JSON
data = {"name": "Близнецы", "возраст": 18}
# Это наиболее близкая к низкоуровневой реализации PHP json_encode()
json_string = json.dumps(данные)
печать (json_string)
| Функция | PHP (Vanilla) | Python (FastAPI / Flask) |
|---|---|---|
| Установить заголовки JSON | header('Content-Type: application/json') |
Автоматическая обработка кадров (с использованиемreturn dictилиjsonify) |
| Объект в строку JSON | json_encode($data) |
json.dumps(data) |
| Выход и конец | echo ...; exit; |
return ... |
returnСловарь, и они сделают за вас все преобразования форматов.Google API — это в основном сервис, предоставляемый через Google Cloud Platform (GCP), позволяющий разработчикам получать доступ к различным функциям Google (таким как поиск, карты, облачные диски и т. д.). Большинство API Google следуют архитектуре RESTful и используют формат JSON для обмена данными.
Прежде чем использовать какой-либо API Google, необходимо сначала создать проект в Google Cloud Console и настроить метод аутентификации. В основном делится на два типа:
В Python для упрощения разработки официально рекомендуются следующие библиотеки:
google-api-python-client: Универсальный API-клиент для большинства служб Discovery.google-auth: Специально обрабатывает аутентификацию и управление токенами.google-cloud-storage / google-cloud-vision: Клиентская библиотека, оптимизированная для конкретных облачных сервисов.pip install google-api-python-client google-auth-httplib2 google-auth-oauthlib。execute()。API Google не являются полностью бесплатными и неограниченными. Каждый API имеет свой собственный метод выставления счетов по квоте:
| категория | Представитель API | Основная цель |
|---|---|---|
| Автоматизация работы | Google Sheets / Calendar / Gmail | Автоматизируйте формы, планируйте и отправляйте электронные письма. |
| Данные и хранение | Cloud Storage / BigQuery | Храните большие файлы и выполняйте анализ больших данных. |
| ИИ | Vision / Translation / Natural Language | Распознавание изображений, перевод текста и анализ настроений. |
| мультимедиа | YouTube Data API | Ищите видео и управляйте содержимым канала. |
Используйте API Google (например, YouTube, Drive, Gmail и т. д.) в Python, обычно черезgoogle-api-python-clientв библиотекеbuildфункция для создания объекта службы. Этот объект инкапсулирует все методы API и является вашим основным каналом связи с серверами Google.
Чтобы создать объект службы, вам потребуются имя API, версия и ключ аутентификации (ключ API) или учетные данные (OAuth2).
из сборки импорта googleapiclient.discovery
# Инициализируем API данных YouTube v3
ютуб = сборка(
'ютуб',
'v3',
DeveloperKey = 'ВАШ_API_KEY'
)
# Пример вызова API
запрос = youtube.videos().list(part="snippet", id="dQw4w9WgXcQ")
ответ = запрос.выполнить()
Это основная причина, по которой вы столкнулись с аварией раньше.build()Сгенерированный объект Service и его внутренниеhttpобъект транспортного уровняНе потокобезопасноиз. В многопоточной среде обязательно следуйте следующим рекомендациям:
youtube.execute()。run()Выполняется в методеbuild()。googleapiclient.discovery.ResourceПример.звоните частоbuild()Производительность будет снижена из-за повторной загрузки «Документа обнаружения» (дополнительная задержка примерно 1-2 секунды). Вы можете оптимизировать:
# Отключите загрузку файлов исследования (если вы установили предварительно скомпилированные библиотеки или хотите ускорить работу)
# Примечание. Для этого необходимо, чтобы в вашей среде уже были соответствующие определения.
youtube = build('youtube', 'v3', DeveloperKey='KEY', static_discovery=True)
Наиболее распространенная ошибка, возникающая при вызове методов службы:HttpError. Вы должны поймать его, чтобы справиться с исчерпанием квоты или проблемами с разрешениями.
из googleapiclient.errors импортировать HttpError
попробуйте:
ответ = youtube.channels().list(part="statistics", mine=True).execute()
кроме HttpError как e:
если e.resp.status == 403:
print("Квота API исчерпана или недостаточно разрешений")
элиф e.resp.status == 401:
print("Аутентификация недействительна")
еще:
print(f"Ошибка HTTP: {e}")
| API-функции | параметр имени | параметры версии |
|---|---|---|
| YouTube Data | 'youtube' | 'v3' |
| Google Drive | 'drive' | 'v3' |
| Google Sheets | 'sheets' | 'v4' |
| Gmail API | 'gmail' | 'v1' |
Если вы используете один и тот же объект службы Google API в нескольких потоках (например,YoutubeApi.youtube), вы можете столкнуться с проблемами потокобезопасности. нижнийhttplib2илиurllib3Транспортный уровень генерирует состояние гонки (Race Condition), когда несколько потоков одновременно обращаются к одному и тому же объекту соединения, что приводит к сбою программы непосредственно на базовом сетевом уровне. Иногда это даже вызывает ошибку на уровне языка C, приводящую к непосредственному закрытию интерпретатора Python. Вот почемуtry...exceptПричина, по которой его нельзя перехватить.
Не создавайте глобальный домен в основном потокеyoutubeОбъекты доступны каждому. Каждый поток должен создать свой собственный экземпляр службы API при запуске. Таким образом, каждый поток имеет собственное сетевое соединение и кэш, не мешая друг другу.
импорт потоков
из сборки импорта googleapiclient.discovery
защита get_youtube_service():
# Вызовите эту функцию внутри каждого потока для создания независимых объектов
return build('youtube', 'v3', DeveloperKey='YOUR_API_KEY')
защита thread_task (video_id):
попробуйте:
# Создайте выделенный сервис в потоке выполнения
local_youtube = get_youtube_service()
запрос = local_youtube.videos().list(
part="фрагмент,статистика",
id=video_id
)
ответ = запрос.выполнить()
print(f"Успешно получено: {video_id}")
кроме исключения как e:
print(f"Ошибка потока: {e}")
# Запускаем несколько потоков
t1 = threading.Thread(target=thread_task, args=("vid1",))
t2 = threading.Thread(target=thread_task, args=("vid2",))
t1.start()
t2.start()
Если вы не хотите создавать объекты повторно, вы можете использоватьthreading.LockУбедитесь, что одновременно может выполняться только один потокexecute(). Хотя это приведет к тому, что вызов API будет помещен в очередь (теряя эффект ускорения параллелизма), это гарантирует, что он не выйдет из строя.
импорт потоков
# Создаем глобальную блокировку
api_lock = резьба.Lock()
защита thread_task_with_lock(video_id):
# Используйте с, чтобы обеспечить автоматическое снятие блокировки
с API_lock:
попробуйте:
запрос = YoutubeApi.youtube.videos().list(
часть="фрагмент",
id=video_id
)
vlist = запрос.выполнить()
кроме исключения как e:
print(f"Ошибка: {e}")
Если вы используете более старую версию клиентской библиотеки, вы можете указать ее явно при создании службы.httpобъект и сделать его непотокобезопасным или использоватьhttplib2.Http()независимый экземпляр. Но это обычно сложнее, поэтому рекомендуется отдать предпочтение варианту 1.
socket.setdefaulttimeout(10), чтобы предотвратить постоянное занятие ресурсов определенным потоком выполнения из-за зависания сети.pip install smtplib email
Эти два модуля обычно встроены в Python и не требуют дополнительной установки.
импортировать смтплиб
из email.mime.text импортировать MIMEText
из email.mime.multipart импорт MIMEMultipart
# Установите отправителя, получателя, тему и содержание
отправитель = 'ваш_адрес@example.com'
получатель = '[email protected]'
subject = 'тестовое письмо'
body = 'Это тестовое письмо, отправленное Python. '
# Создать контент электронной почты
сообщение = MIMEMultipart()
сообщение['От'] = отправитель
msg['Кому'] = получатель
msg['Тема'] = тема
msg.attach(MIMEText(тело, 'простой'))
#Отправить с помощью Gmail SMTP
smtp_server = 'smtp.gmail.com'
smtp_port=587
имя пользователя = 'ваш_адрес@example.com'
пароль = 'your_app_password' # Рекомендуется использовать пароль приложения вместо общего пароля
с smtplib.SMTP(smtp_server, smtp_port) в качестве сервера:
сервер.starttls()
server.login(имя пользователя, пароль)
server.send_message(мсг)
print('Письмо было отправлено')
pip install google-api-python-client google-auth-httplib2 google-auth-oauthlibФильтры можно создавать через API Gmail, например, когда отправителем является определенный почтовый ящик, метка автоматически добавляется.
из сборки импорта googleapiclient.discovery
из google_auth_oauthlib.flow импортировать InstalledAppFlow
из google.auth.transport.requests Запрос на импорт
импортировать ОС
импортный маринованный огурец
# Требуемая область авторизации
ОБЛАСТИ = ['https://www.googleapis.com/auth/gmail.settings.basic',
'https://www.googleapis.com/auth/gmail.modify']
защита gmail_service():
учетные данные = нет
если os.path.exists("token.pickle"):
с open("token.pickle", "rb") в качестве токена:
creds = Pickle.load(токен)
если не creds или не creds.valid:
если creds и creds.expired и creds.refresh_token:
creds.refresh(Запрос())
еще:
поток = InstalledAppFlow.from_client_secrets_file("credentials.json", ОБЛАСТИ)
creds = flow.run_local_server(порт=0)
с open("token.pickle", "wb") в качестве токена:
Pickle.dump(кредиты, токен)
return build("gmail", "v1", учётные данные=creds)
# Создать фильтр Gmail
защита create_filter():
service = gmail_service()
filter_config = {
"критерии": {
"from": "[email protected]" # Условие: отправитель
},
"действие": {
"addLabelIds": ["Label_123456"], # внутренний идентификатор ярлыка Gmail
"removeLabelIds": ["INBOX"] # Необязательно: удалить папку "Входящие"
}
}
результат = service.users().settings().filters().create(
идентификатор пользователя="я",
тело = filter_config
).execute()
print("Создано успешно, идентификатор фильтра:", result["id"])
если __name__ == "__main__":
create_filter()
Label_123456– это идентификатор ярлыка Gmail, доступный черезusers().labels().list()получать.Правила (фильтр), созданные API Gmail, будут автоматически активироваться при поступлении новых писем, и никаких дополнительных «выполнений» не требуется.
Используйте API Gmail для поиска совпадающих сообщений, а затем помечайте их или перемещайте в пакетном режиме.
из сборки импорта googleapiclient.discovery
из google_auth_oauthlib.flow импортировать InstalledAppFlow
из google.auth.transport.requests Запрос на импорт
импортировать ОС
импортный маринованный огурец
ОБЛАСТИ = ['https://www.googleapis.com/auth/gmail.modify']
защита gmail_service():
учетные данные = нет
если os.path.exists("token.pickle"):
с open("token.pickle", "rb") в качестве токена:
creds = Pickle.load(токен)
если не creds или не creds.valid:
если creds и creds.expired и creds.refresh_token:
creds.refresh(Запрос())
еще:
поток = InstalledAppFlow.from_client_secrets_file("credentials.json", ОБЛАСТИ)
creds = flow.run_local_server(порт=0)
с open("token.pickle", "wb") в качестве токена:
Pickle.dump(кредиты, токен)
return build("gmail", "v1", учётные данные=creds)
#Применить правила Gmail к существующим электронным письмам
защита run_rule():
сервис = gmail_service()
# Критерии поиска, например from:[email protected]
запрос = "от:[email protected]"
результаты = service.users().messages().list(userId="me", q=query).execute()
messages = results.get("сообщения", [])
если нет сообщений:
print("Нет писем, соответствующих критериям")
возвращение
для сообщений в сообщениях:
service.users().messages().modify(
идентификатор пользователя="я",
id=msg["id"],
тело={
"addLabelIds": ["Label_123456"], # Добавить новый ярлык
"removeLabelIds": ["INBOX"] # Удалить входящие
}
).execute()
print(f"{len(messages)} сообщений обработано")
если __name__ == "__main__":
run_rule()
qУсловия и модификации партий.from:, subject:, has:attachment。Самый распространенный и рекомендуемый способ создания сервера HTTP API на Python — использовать эффективную и многофункциональную веб-инфраструктуру. Ниже представлены три основные концепции и их характеристики:
FastAPI — это современная и быстрая (на базе Starlette и Pydantic) веб-инфраструктура для создания API. Он изначально поддерживает асинхронные операции (async/await) и автоматически генерирует файлы OpenAPI (Swagger UI).
# Установка: pip install fastapi uvicorn
из fastapi импортировать FastAPI
приложение = ФастAPI()
# Определить корневой маршрут (GET-запрос)
@app.get("/")
защита read_root():
return {"Привет": "Мир"}
# Определить маршрут с параметрами
@app.get("/items/{item_id}")
Защиту read_item (item_id: int, q: str = Нет):
вернуть {"item_id": item_id, "q": q}
# Сервер выполнения (при условии, что имя файла — main.py)
# Выполнить в терминале: uvicorn main:app --reload
Flask — это микрофреймворк, который упрощает ядро и позволяет разработчикам свободно выбирать такие компоненты, как базы данных и библиотеки проверки. Он подходит для небольших проектов или приложений, требующих высокой степени настройки.
# Установка: pip install flask
из колбы импортировать Flask, jsonify, запрос
приложение = Колба(__name__)
#Определяем маршрут API
@app.route("/data", методы=['GET'])
защита get_data():
return jsonify({"message": "Это данные Flask API"})
#Определяем POST-маршрут
@app.route("/submit", методы=['POST'])
защита post_data():
данные = request.get_json()
return jsonify({"получено": данные}), 201
#Выполнить сервер
# if __name__ == '__main__':
# app.run(debug=True)
DRF — это мощный инструмент для быстрого создания RESTful API на основе полнофункциональной веб-инфраструктуры Django. Он предоставляет все функции, необходимые для крупных API, таких как сериализаторы, наборы представлений модели, аутентификация и контроль разрешений.
Примечание. Пример кода DRF длиннее и требует сначала создания проекта и приложения Django, поэтому он здесь опущен, но это лучший вариант для больших проектов.
Хотя идиоматический подход к FastAPI заключается в использовании декораторов@app.get()Украшайте функции напрямую, но для лучшей организации и структурирования больших приложений (особенно при использовании внедрения зависимостей или модульности маршрутов) вы можете инкапсулировать обработчики маршрутов в классы, часто называемые шаблоном «APIRouter» или «представлениями на основе классов».
Для этого необходимо использовать **fastapi.APIRouter** и **декораторы методов** для достижения этой цели.
мы будем использоватьAPIRouterчтобы определить маршрут, а затем зарегистрировать метод класса в качестве обработчика.
# Установка: pip install fastapi uvicorn
из импорта fastapi APIRouter, FastAPI, зависит
от ввода импорта с аннотациями
# Шаг 1. Создайте экземпляр APIRouter
маршрутизатор = APIRouter(
prefix="/api/v1", # Установите префикс для этой группы маршрутизации
tags=["items"] # Используется для классификации файлов.
)
# Шаг 2: Определите категории, содержащие логику маршрутизации
класс ItemService:
"""Обрабатывать всю бизнес-логику, связанную с объектами, и обработку маршрутизации"""
def __init__(self, db_dependenty: str):
# Имитация внедрения зависимостей (Dependency Injection)
self.db_connection = зависимость_дб
# Используйте @router.get для оформления методов класса
@router.get("/")
защита read_root (сам):
# Реализовать логику read_root
return {"message": "Hello World из класса ItemService!", "db_status": self.db_connection}
# Реализуем логику read_item
# Параметр {item_id} берется из URL-пути
@router.get("/{item_id}")
def read_item(self, item_id: int, q: str | None = None):
вернуть {
"item_id": item_id,
«запрос»: q,
"status": "Обработка завершена"
}
#Вспомогательная функция: имитация внедрения зависимостей (Dependency)
защита get_db():
# На практике это вернет соединение с базой данных
вернуть «База данных успешно подключена»
# Шаг 3. Создайте фабричную функцию для экземпляров классов и внедрите зависимости.
# Annotated[str, Depends(get_db)] указывает, что db_connection предоставляется get_db
def get_item_service(db_connection: Annotated[str, Depends(get_db)]):
# Возвращаем экземпляр ItemService
вернуть ItemService (db_connection)
# Шаг 4. Создайте субъект приложения FastAPI
приложение = ФастAPI()
# Шаг 5: Ядро! Используйте Depends для монтирования методов класса ItemService в приложение.
# Здесь используются зависимости, чтобы FastAPI знал, как получить экземпляр ItemService
app.include_router(
маршрутизатор,
зависимости = [Зависит (get_item_service)]
)
Сохраните приведенный выше код какmain.pyи запустите сервер Uvicorn:
uvicorn main:app --reload
ItemService.read_rootметод.ItemService.read_itemметод.Ключом к этому шаблону является:
APIRouterопределять маршруты.@router.get/@router.postи другие декораторы.app.include_routerизdependenciesпараметры.Преимущество этого в том, что бизнес-логика (вItemService(внутренний) отделен от определения маршрутизации, что улучшает модульность и тестируемость программного кода.
Если вы запускаете приложение Flask в терминале и запускаете его с помощью app.run(), самый простой способ — использовать сигнал прерывания клавиатуры.
При модульном тестировании или сценариях, когда вам необходимо автоматически завершить работу сервера после выполнения определенной операции, вам необходимо отправить команду остановки через код.
Встроенный сервер разработки Flask фактически использует библиотеку Werkzeug. Вы можете отправить на сервер определенный HTTP-запрос, чтобы он отключился. Для этого необходимо определить специальный маршрут в вашем приложении.
из колбы импорт колбы, запрос
приложение = Колба(__name__)
# Определить секретный маршрут выключения
@app.route('/shutdown', методы=['POST'])
защита Shutdown_server():
# Убедитесь, что только авторизованные пользователи могут звонить в эту конечную точку
func = request.environ.get('werkzeug.server.shutdown')
если функция равна Нет:
поднять RuntimeError('Не работает на сервере разработки Werkzeug')
func() # Вызов закрывающей функции
return 'Сервер отключается...'
# ... другие маршруты ...
# Отправьте POST-запрос по адресу http://127.0.0.1:5000/shutdown в другой программе или скрипте, чтобы выключить сервер.
По умолчанию app.run() блокируется. Чтобы продолжить выполнение другой логики в основном коде, оставляя сервер работающим в фоновом режиме, вам необходимо использоватьthreadingилиmultiprocessingМоды.
импорт потоков
время импорта
из колбы импорта колбы
приложение = Колба(__name__)
# ...ваш маршрут...
защита run_server():
# Примечание: debug=True не следует использовать в производственных средах.
app.run(порт=5000)
# Запускаем сервер в новом потоке
поток = threading.Thread(target=run_server)
поток.start()
print("Сервер Flask запущен в фоновом режиме...")
# Даем серверу поработать некоторое время
время.сон(5)
# (Завершение работы программы) В этом режиме потока нет встроенной простой функции завершения работы.
# Вы должны использовать указанный выше маршрут /shutdown или завершить поток напрямую (не рекомендуется, может быть нечисто).
# Пример: дождитесь завершения потока сервера (после остановки Ctrl+C)
# поток.join()
В производственной среде вы не будете использовать app.run(). Вы будете использовать сервер WSGI (например, Gunicorn или uWSGI). Чтобы остановить эти серверы:
Когда приложение Flask не работает на сервере разработки Werkzeug по умолчанию (например, в производственной среде, использующей Gunicorn, uWSGI или другие серверы ASGI), наиболее надежный способ определить текущую среду — проверить **переменные среды WSGI/ASGI** (т.request.environилиrequest.scope)。
request.environ(Применяется к серверам WSGI, таким как Gunicorn)В функции маршрута Flask вы можете получить доступrequest.environСловарь, который проверяет определенные ключи, установленные сервером WSGI, для определения типа сервера.
из фляги импорт колбы, запрос, jsonify
приложение = Колба(__name__)
@app.route('/server_info')
защита get_server_info():
# По умолчанию: предполагается, что сервер разработки Werkzeug
server_name = "Werkzeug (Сервер разработки)"
# Проверьте общие идентификаторы серверов WSGI
# Проверьте Ганикорн
если «gunicorn.version» в request.environ:
имя_сервера = f"Gunicorn (версия: {request.environ.get('gunicorn.version')})"
# Проверьте uWSGI
elif 'uwsgi.version' в request.environ:
# uWSGI обычно не имеет стандартного ключа версии, но имеет определенные переменные среды
имя_сервера = "uWSGI"
# Проверка официантки (обычный производственный WSGI-сервер)
elif 'waitress.version' в request.environ:
имя_сервера = f"Официантка (версия: {request.environ.get('waitress.version')})"
# Проверьте общие идентификаторы других серверов WSGI
elif 'SERVER_SOFTWARE' в request.environ:
# Многие серверы устанавливают этот стандартный ключ WSGI
имя_сервера = request.environ.get('SERVER_SOFTWARE')
# Если werkzeug.server.shutdown существует, то это почти наверняка Werkzeug
elif 'werkzeug.server.shutdown' в request.environ:
server_name = "Werkzeug (сервер разработки, возможно завершение работы)"
вернуть jsonify({
"текущий_сервер": имя_сервера,
"is_dev_server": (имя_сервера.startswith("Werkzeug"))
})
# Запускаем приложение
# if __name__ == '__main__':
# app.run(debug=True)
В логике завершения работы вашего сервера вы можете использовать эту проверку напрямую, чтобы решить, следует ли выполнять `shutdown_func`:
из запроса на импорт колбы, jsonify
@app.route('/shutdown', методы=['POST'])
защита Shutdown_server():
Shutdown_func = request.environ.get('werkzeug.server.shutdown')
если параметр «shutdown_func» равен «Нет»:
# Среда, не относящаяся к Werkzeug (обычно производственная среда)
вернуть jsonify({
"error": "Эта конечная точка предназначена только для сред разработки. Используйте команды операционной системы, чтобы остановить сервер."
}), 400
#WerkzeugEnvironment
Shutdown_func()
return jsonify({"message": "Сервер отключается..."}), 200
Хотя `SERVER_SOFTWARE` является стандартной переменной среды WSGI, она не обязательно задается всеми серверами, или формат настройки не обязательно является стандартным. Проверка уникального ключа для конкретной конфигурации сервера (например, «gunicorn.version») — наиболее надежный способ.
В Flask он используется для обработки параметров строки запроса в URL-адресах (например,/my_api?abc=3&def=xyвabcиdef) основные инструменты взяты изflaskМодульныйrequestобъект. Вы можете использоватьrequest.argsСловарь для доступа к этим параметрам.
request.argsсловарьrequest.args— объект, похожий на словарь, который содержит вопросительные знаки (?) после всех пар ключ-значение.
из фляги импорт колбы, запрос, jsonify
приложение = Колба(__name__)
@app.route('/my_api', методы=['GET'])
защита get_query_parameters():
#Доступ ко всему словарю параметров запроса
all_params = request.args
print(f"Все параметры: {all_params}")
# --- Метод получения определенных параметров ---
# 1. Используйте .get() для получения параметров (рекомендуется: безопасно и предоставляет значения по умолчанию).
# Получите параметр «abc», по умолчанию «Нет», если он не существует.
abc_value = request.args.get('abc')
# Получите параметр «def», если он не существует, по умолчанию будет установлено значение «default_value».
def_value = request.args.get('def', 'default_value')
# 2. Для доступа напрямую используйте [] (не рекомендуется: KeyError будет выдан, если параметр не существует)
# попробуйте:
# требуемый_парам = request.args['требуется']
# кроме KeyError:
# требуемый_парам = "Отсутствует"
# --- Обработка многозначных параметров ---
# Если URL-адрес /my_api?item=apple&item=banana
item_list = request.args.getlist('item') # Возврат ['apple', 'banana']
вернуть jsonify({
"статус": "успех",
«abc»: abc_value,
"def": def_value,
"item_list": item_list
})
если __name__ == '__main__':
# Тестовый URL 1: http://127.0.0.1:5000/my_api?abc=3&def=xy&item=A&item=B
# Тестовый URL 2: http://127.0.0.1:5000/my_api
app.run(отладка=Истина)
| метод | использовать | Поведение | пример |
|---|---|---|---|
request.args.get('key') |
Безопасное получение одного параметра | Если параметр не существует, вернитеNone, ошибка не возникнет. |
request.args.get('user') |
request.args.get('key', 'default') |
Получить параметры и указать значения по умолчанию | Если параметр не существует, возвращает указанное вами значение по умолчанию. | request.args.get('page', 1) |
request.args['key'] |
Прямой доступ к параметрам | Если параметр не существует, он выдастKeyErrorошибка, приводящая к ошибке сервера 500. |
request.args['id'] |
request.args.getlist('key') |
Получить несколько параметров с одинаковым именем | Возвращает список, содержащий все значения. | request.args.getlist('filter') |
отrequest.argsВсе полученные значения являются строками. Если аргумент должен быть числом или логическим значением, вам необходимо выполнить преобразование типа вручную:
# Получить параметры (строку)
num_str = request.args.get('num', '0')
#Преобразовать в целое число
попробуйте:
num_int = int(num_str)
кроме ValueError:
num_int = 0 # Обработать ошибку преобразования
# Преобразование в логическое значение (обратите внимание: все непустые строки имеют значение True в Python)
bool_str = request.args.get('is_admin', 'false').lower()
is_admin = bool_str == 'истина'
В Flask ключом к различению маршрута является конечная точка, а не имя функции, которое вы определяете в своем коде Python. Вы можете использовать циклы и функции закрытия (Closure) Python для динамического определения и регистрации маршрутов, а также назначения им уникальных конечных точек.
Мы будем использовать фабричную функцию для создания каждого процессора маршрута и указывать уникальное имя «конечной точки» при его регистрации.
из фляги импорта Flask, jsonify
импортировать ОС
приложение = Колба(__name__)
# Предполагая, что это ваш источник данных
динамический_апис = {
"user_info": {"метод": "GET", "обработчик": лямбда: {"данные": "Информация пользователя получена"}},
"product_list": {"метод": "GET", "обработчик": лямбда: {"данные": "Товары в списке"}},
"submit_form": {"method": "POST", "handler": лямбда: {"data": "Форма отправлена"}, "methods": ['POST']},
}
filename_base = "db_agent"
# --- Основная логика: функция фабрики маршрутизации ---
Защиту create_dynamic_route (funstr, handler_func, методы):
"""
Создайте и верните функцию обработчика маршрута (закрытие).
Эта функция фиксирует значения funstr и handler_func.
"""
защита Dynamic_route_handler():
# Имя функции фиксировано, но доступ к funstr возможен во время выполнения
print(f"Обработка запроса: {funstr}")
# Выполняем реальную бизнес-логику
результат = handler_func()
вернуть jsonify (результат)
# Возвращаем созданную функцию
вернуть динамический_route_handler
# --- Цикл динамической регистрации ---
для funstr, api_info в Dynamic_apis.items():
# 1. Создайте URL-путь
url_path = f"/{filename_base}/{funstr}"
# 2. Определите имя конечной точки (используйте funstr для обеспечения уникальности)
endpoint_name = f"{filename_base}_{funstr}_api"
# 3. Получить HTTP-метод
методы = api_info.get("methods", ['GET']) # По умолчанию — GET
# 4. Создать функцию обработки маршрутизации
handler_func = create_dynamic_route(funstr, api_info["handler"], методы)
# 5. Зарегистрировать маршрут
# Используйте параметр endpoint=, чтобы указать уникальное имя вместо имени функции
app.add_url_rule(
URL_путь,
конечная точка=имя_конечной_точки,
view_func=handler_func,
методы = методы
)
print(f"Зарегистрированный маршрут: {url_path} (Конечная точка: {endpoint_name})")"
если __name__ == '__main__':
# Тестовая конечная точка, например: http://127.0.0.1:5000/db_agent/user_info
app.run(отладка=Истина)
Gradio— это библиотека Python с открытым исходным кодом, предназначенная для того, чтобы сделать модели машинного обучения более доступными и интерактивными. С помощью простого кода вы можете быстро создать веб-интерфейс для своей модели машинного обучения, чтобы другие могли его протестировать и использовать.
Использовать Gradio очень просто. Ниже приведен базовый пример, показывающий, как создать простой интерфейс ввода и вывода текста:
импортградиоасгр
#Определяем функции для обработки входных данных
защита приветствие(имя):
вернуть «Привет» + имя + «!»
# Создать интерфейс Gradio
iface = gr.Interface(fn=greet, inputs="text", outputs="text")
# Стартовый интерфейс
iface.launch()
Приведенный выше код создаст простой веб-интерфейс, который позволит пользователям вводить имя, а затем отображать персонализированное приветствие.
Gradio предоставляет разработчикам простой и мощный инструмент, который может быстро преобразовывать модели машинного обучения в веб-приложения, позволяя более широкому кругу пользователей легко тестировать и испытывать результаты ИИ. Независимо от того, используется ли Gradio для личных проектов или командной работы, он идеально подходит для продвижения и демонстрации моделей.
Если вы хотите перенаправить вывод интерфейса Gradio на страницу HTTP-сервера Apache (например, `/results`), вы можете использовать PythonrequestsМодуль для конвертации Gradio
Результаты отправляются на сервер. Вот основные шаги по интеграции Gradio и Apache:
Во-первых, убедитесь, что ваш HTTP-сервер Apache работает и имеет настроенную конечную точку, которая может обрабатывать данные (например,/results). Этой конечной точкой может быть PHP, Python или другой серверный язык для обработки входящих данных.
Вот пример кода для написания приложения Gradio и перенаправления его вывода на HTTP-сервер:
импортградиоасгр
запросы на импорт
# Обработка ввода Gradio и перенаправление на HTTP-сервер
Защиту процесса_and_redirect (входные_данные):
# Обрабатываем входные данные
result = f"Обработано: {input_data}"
#Отправляем запрос HTTP POST на HTTP-сервер Apache и передаем обработанные данные.
url = 'http://your-apache-server-address/results' # Замените адресом вашего сервера
полезная нагрузка = {'результат': результат}
попробуйте:
ответ = запросы.пост (url, данные = полезная нагрузка)
если ответ.код_статуса == 200:
return f"Успешно перенаправлено на {url}."
еще:
return f «Перенаправление не удалось. Код состояния: {response.status_code}»
кроме исключения как e:
return f"Произошла ошибка: {str(e)}"
# Создать интерфейс Gradio
iface = gr.Interface(
fn=process_and_redirect,
входы="текст",
выходы="текст",
title="Перенаправление Gradio на HTTP-сервер"
)
iface.launch()
На вашем сервере Apache должна быть настроена конечная точка для обработки запросов POST, например простой PHP-скрипт для получения данных Gradio:
<?php
// Обработка POST-запросов от Gradio
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$result = $_POST['результат']; // Получаем параметр result из POST-запроса
echo "Данные, полученные от Gradio: " . htmlspecialchars ($ результат);
}
?>
Это позволяет вам использовать приложение Gradio для перенаправления вывода на HTTP-сервер Apache и обработки данных на стороне сервера. Такая интеграция позволяет более широко использовать интерактивные функции Gradio в веб-средах.
Самый простой способ встроить интерфейс Gradio в страницу Apache — использоватьiframeЭтикетка. настраиватьsrcАтрибут представляет собой URL-адрес сервера Gradio.
<!DOCTYPE html>
<html lang="zh">
<голова>
<мета-кодировка="UTF-8">
<title>Встроенный интерфейс Apache Gradio</title>
</голова>
<тело>
<h1>Встроенный интерфейс Gradio</h1>
<iframe src="http://your-gradio-server-address:7860" width="100%" height="800px"frameborder="0"></iframe>
</тело>
</html>
Если вы хотите напрямую получить доступ к интерфейсу Gradio через URL-адрес Apache, вы можете настроить обратный прокси-сервер. Это устраняет необходимость отображать исходный URL-адрес Gradio.
mod_proxyиmod_proxy_httpМоды. Выполните следующие инструкции:sudo a2enmod proxy
sudo a2enmod proxy_http
Или отмените комментарий:
#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
/gradio)。<Location "/gradio">
ProxyPass "http://localhost:7860/"
ProxyPassReverse "http://localhost:7860/"
</Location>
sudo systemctl restart apache2
После завершения вы можете использоватьhttp://your-apache-server-address/gradioОтображение содержимого интерфейса Gradio на страницах Apache.
В Apache убедитесь, что он включенproxyиproxy_httpМоды. Если он еще не включен, вы можете выполнить следующую команду:
sudo a2enmod proxy
sudo a2enmod proxy_http
В файле конфигурации Apache приложения Gradio (например,/etc/apache2/sites-available/yourdomain.conf), добавьте следующие настройки для настройки ProxyPass
и ПроксиПассРеверс:
<VirtualHost *:80>
Имя серверавашдомен.com
# Укажите корневой каталог Gradio на сервер Gradio
ProxyPass/http://localhost:7860/
ProxyPassReverse/http://localhost:7860/
# Убедитесь, что статические ресурсы могут быть проксированы нормально
ProxyPass /static/ http://localhost:7860/static/
ProxyPassReverse /static/ http://localhost:7860/static/
</VirtualHost>
После завершения настройки перезапустите Apache, чтобы изменения вступили в силу:
sudo systemctl restart apache2
Такая конфигурация может явно обрабатывать запросы к статическим ресурсам Gradio, таким какtheme.css) должно решить проблему с отсутствующим стилем. Если статический путь к файлу Gradio не/static/, пожалуйста, измените путь в соответствии с реальной ситуацией.
Доступно в Градиоgr.DataFrameвиджет для отображения или редактирования табличных данных, таких как Pandas DataFrame или другой табличный формат. Здесь мы объясним, как использовать Gradio
Компонент DataFrame используется в приложениях для создания интерактивных таблиц данных.
Если Gradio еще не установлен, вы можете установить его с помощью следующей команды:
pip install gradio
gr.DataFrameвывести данные таблицыВот как использовать Gradio для отображения DataFrame. Допустим, у нас есть DataFrame Pandas, который необходимо отобразить в приложении Gradio:
import gradio as gr
import pandas as pd
#Создаем образец DataFrame
data = {'Имя': ['Алиса', 'Боб', 'Чарли'], 'Возраст': [25, 30, 35], 'Профессия': ['Инженер', 'Дизайнер', 'Доктор']}
df = pd.DataFrame(data)
# Определить функцию для возврата DataFrame
def show_dataframe():
return df
#Создаем интерфейс Gradio
интерфейс = gr.Interface(fn=show_dataframe, выходы=gr.DataFrame(), title="Таблица данных персонала")
interface.launch()
import gradio as gr: Представляем пакет Gradio.data: словарь, используемый для создания образцов данных, содержащий три столбца: имя, возраст и род занятий.show_dataframe: Определите функцию для возврата кадра данных Pandas для отображения.gr.DataFrame(): Создайте компонент DataFrame для отображения таблицы в интерфейсе Gradio.interface.launch(): Запустите приложение Градио.gr.DataFrameВносите интерактивные измененияЕсли вы хотите разрешить пользователям редактировать таблицу, вы можетеgr.DataFrameСредние настройкиeditable=True, позволяя пользователям изменять данные таблицы:
интерфейс = gr.Interface(fn=show_dataframe, выходы=gr.DataFrame(editable=True), title="Редактируемая таблица данных персонала")
Запущенное приложение отобразит редактируемую таблицу, и пользователи смогут изменять данные прямо на веб-странице.
Можно использоватьpsutilмодуль для поиска PID программы Gradio. Сначала убедитесь, что вы установилиpsutil:
pip install psutil
Затем вы можете использовать следующий код, чтобы найти PID программы, связанной с Gradio.
импортировать psutil
# Поиск программ, содержащих «градио»
для процесса в psutil.process_iter(['pid', 'name', 'cmdline']):
if 'gradio' в ' '.join(process.info['cmdline']):
print("Найдено PID программы Gradio:",process.info['pid'])
Как только PID найден, вы можете использоватьterminate()илиkill()метод завершения программы. Например:
для процесса в psutil.process_iter(['pid', 'name', 'cmdline']):
if 'gradio' в ' '.join(process.info['cmdline']):
process.kill() # Принудительно завершить программу
print(f"PID программы Gradio завершен: {process.info['pid']}")
использоватьkill()Этот метод немедленно завершит программу, поэтому убедитесь, что в программе не выполняются важные операции. Этот пример кода завершает работу всех соответствующих программ Gradio.
Можно использоватьpsutilМодуль для поиска программ, прослушивающих определенный порт. Сначала убедитесь, что вы установилиpsutil:
pip install psutil
Затем вы можете использовать следующий код, чтобы найти монитор7860Программный PID порта.
импортировать psutil
#Указываем номер порта для поиска
целевой_порт = 7860
pid_to_kill = Нет
# Поиск программ, слушающих указанный порт
для подключения в psutil.net_connections(kind='inet'):
если conn.laddr.port == target_port и conn.status == psutil.CONN_LISTEN:
pid_to_kill = conn.pid
сломать
если pid_to_kill:
print("Найден PID программы прослушивающего порта 7860:", pid_to_kill)
еще:
print("Программа для прослушивания порта 7860 не найдена")
Как только PID найден, вы можете использоватьpsutil.Processизkill()Метод принудительного завершения программы:
если pid_to_kill:
процесс = psutil.Process(pid_to_kill)
process.kill() # Принудительно завершить программу
print(f"Программа PID прослушивающего порта 7860 была прекращена: {pid_to_kill}")
еще:
print("Невозможно завершить программу, поскольку PID не найден")
Этот код принудительно завершит любую программу, прослушивающую указанный порт. Пожалуйста, подтвердите, что порт действительно используется Gradio, чтобы избежать случайного прекращения работы других служб.
Gradio в первую очередь предназначен для создания быстрых и простых в использовании веб-интерфейсов для отображения моделей машинного обучения. Сам он уже работает на веб-сервере, но его основная цель — предоставить интерфейс взаимодействия человека с компьютером, а не традиционную конечную точку RESTful API.
Если вы хотите использовать функциональность RESTful API в своем приложении Gradio, наиболее рекомендуемым методом является встраивание приложения Gradio в более мощную веб-инфраструктуру, например **FastAPI** или **Flask**. Это позволяет вам использовать основную платформу для определения конечных точек API при подключении пользовательского интерфейса Gradio к подпути.
FastAPI работает быстро и опирается на платформу Starlette вместе с Gradio, что делает процесс внедрения очень простым.
# Установите FastAPI, Uvicorn (сервер) и Gradio.
pip install fastapi uvicorn градиент
Вы будете использовать Gradio.to_app()метод преобразует интерфейс Gradio в приложение ASGI, а затем использует FastAPI.mountфункция для монтирования ее в основное приложение.
из fastapi импортировать FastAPI
из fastapi.responses импортировать JSONResponse
импортградиоасгр
# 1. Определить логику приложения Gradio
защита приветствие(имя):
return f"Привет, {имя}!"
gr_interface = gr.Interface(fn=greet, inputs="text", outputs="text")
# 2. Преобразование интерфейса Gradio в приложение ASGI.
gradio_app = gr_interface.to_app()
# 3. Создайте основное приложение FastAPI.
приложение = FastAPI(
title="Gradio + Сервер FastAPI",
описание="Предоставляет как конечные точки API, так и пользовательский интерфейс Gradio"
)
# 4. (API SVR) Определите конечные точки RESTful API.
@app.get("/api/v1/status")
защита api_status():
return JSONResponse(content={"status": "API работает"})
@app.get("/api/v1/model_inference")
Защиту api_inference (данные: ул):
# Здесь вы можете вызвать логику вашей модели
result = f"Обработанные данные: {data.upper()}"
return JSONResponse(content={"result": result})
# 5. (Gradio SVR) Смонтируйте приложение Gradio по пути /gradio.
# Функция mount() позволяет вам смонтировать другое приложение ASGI по указанному пути.
app.mount("/gradio",gradient_app)
# Сервер выполнения (при условии, что имя файла — main.py)
# Выполните в терминале: uvicorn main:app --host 0.0.0.0 --port 8000 --reload
Сам Gradio также предоставляет экспериментальную функцию, которая позволяет напрямую вызывать базовые функции интерфейса Gradio через параметры URL-адреса без необходимости использования дополнительной веб-инфраструктуры. Это не стандартный RESTful API, но он обеспечивает простой программный доступ.
Однако встраивание Gradio с помощью FastAPI/Flask — это более стандартный и гибкий подход, который обеспечивает более стандартизированный дизайн API, документацию и сертификацию.
Это наиболее распространенная комбинация сканеров, подходящая для новичков и используемая для анализа статических веб-страниц.
pip install requests beautifulsoup4
Пример использования:
import requests
from bs4 import BeautifulSoup
url = "https://example.com"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
print(soup.title.string)
Мощная платформа сканеров, подходящая для крупных проектов сканеров, поддерживающая многопоточные и распределенные сканеры.
pip install scrapy
Пример использования:
scrapy startproject myproject
Создайте в проекте модуль искателя и запустите команду сканирования.
Подходит для динамического сканирования веб-страниц, при котором необходимо имитировать операции пользователя, например обработку контента, отображаемого с помощью JavaScript.
pip install selenium
Пример использования:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://example.com")
print(driver.title)
driver.quit()
Еще один инструмент для обработки динамических веб-страниц. Он имеет более высокую производительность, чем Selenium, и поддерживает несколько браузеров.
pip install playwright
playwright install
Пример использования:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://example.com")
print(page.title())
browser.close()
Основанный на версии Puppeteer для Python, он специально разработан для сканирования динамических веб-страниц.
pip install pyppeteer
Пример использования:
from pyppeteer import launch
async def main():
browser = await launch()
page = await browser.newPage()
await page.goto("https://example.com")
print(await page.title())
await browser.close()
import asyncio
asyncio.get_event_loop().run_until_complete(main())
Эффективный инструмент для отправки HTTP-запросов, поддерживающий асинхронные операции.
pip install httpx
Пример использования:
import httpx
async def fetch():
async with httpx.AsyncClient() as client:
response = await client.get("https://example.com")
print(response.text)
import asyncio
asyncio.run(fetch())
To create a simple web scraper in Python, you can use the requests library to get the page content, and BeautifulSoup to parse the HTML.
Here's an example of a basic web scraper:
import requests
from bs4 import BeautifulSoup
# URL to scrape
url = "https://example.com"
# Send a GET request
response = requests.get(url)
response.raise_for_status() # Check for errors
# Parse the HTML content
soup = BeautifulSoup(response.content, "html.parser")
# Extract specific data (e.g., all the headings)
headings = soup.find_all("h1")
# Print the headings
for heading in headings:
print(heading.text)
Note: You may need to install the libraries with the following commands:
pip install requests
pip install beautifulsoup4
Текст, который нужно извлечь
другой текст
из bs4 импорт BeautifulSoup
#HTML-файл
html_content = """
Текст, который нужно извлечь
другой текст
"""
# Разбор HTML
суп = BeautifulSoup(html_content, 'html.parser')
# Найдите определенные теги и категории
span_tag = суп.find('span', class_='xxxclass')
#Извлекаем текстовое значение
если span_tag:
print(span_tag.text) #Вывод: текст, который нужно извлечь
еще:
print("Соответствующий тег не найден")
# Найти все совпаденияэтикетка
span_tags = суп.find_all('span', class_='xxxclass')
#Извлекаем текст каждой метки
для тега в span_tags:
печать(тег.текст)
span_tag = soup.find('span', {'class': 'xxxclass', 'id': 'specific-id'})
2. **Используйте регулярные выражения для сопоставления категорий**:
import re
span_tag = soup.find('span', class_=re.compile(r'^xxx'))
Selenium — это инструмент с открытым исходным кодом, который в основном используется для автоматизации операций веб-браузера. Он поддерживает несколько браузеров, включая Chrome, Firefox, Safari и т. д., и может использоваться для тестирования веб-приложений или очистки веб-данных.
Ниже приведены шаги по установке Selenium и простой пример использования Python:
# Установите Селен
pip установить селен
#Пример кода
из веб-драйвера импорта селена
из selenium.webdriver.common.by импортировать
# Запуск вебдрайвера
драйвер = вебдрайвер.Chrome()
driver.get("https://www.example.com")
# Находим элементы и выполняем операции
элемент = driver.find_element(By.TAG_NAME, "h1")
печать(element.text)
# Закрыть браузер
драйвер.выйти()
Убедитесь, что установлены Selenium и ChromeDriver:
pip install selenium
Загрузите и установите соответствующую версию Chrome.ChromeDriver。
Пользовательская папка Chrome содержит личные данные, такие как закладки, история, файлы cookie и т. д. Вы можете указать конкретную папку, которая будет использоваться для запуска браузера.
из веб-драйвера импорта селена
из службы импорта selenium.webdriver.chrome.service
из параметров импорта selenium.webdriver.chrome.options
#Укажите путь к ChromeDriver
chromedriver_path = "/путь/к/chromedriver"
#Указываем папку пользователя
user_data_dir = "/путь/к/вашим/пользователям/данным"
# Установите параметры Chrome
chrome_options = Параметры()
chrome_options.add_argument(f"--user-data-dir={user_data_dir}")
chrome_options.add_argument("--profile-directory=Default") # или другое имя подпапки
# Запустить браузер
сервис = Сервис (chromedriver_path)
драйвер = webdriver.Chrome(service=service, options=chrome_options)
# Открыть веб-страницу
driver.get("https://example.com")
# Завершить программу
драйвер.выйти()
user_data_dirПуть является действительным и доступным для записи каталогом.chrome://version。Убедитесь, что он установленseleniumиpsutil:
pip install selenium psutil
Следующий код просканирует все запущенные Chrome и извлечетuser-data-dirпараметр:
import psutil
import re
def get_all_user_data_dirs():
user_data_dirs = set()
for proc in psutil.process_iter(attrs=['pid', 'name', 'cmdline']):
try:
if proc.info['name'] and 'chrome' in proc.info['name'].lower():
cmdline = ' '.join(proc.info['cmdline'])
match = re.search(r'--user-data-dir=([^\s]+)', cmdline)
if match:
user_data_dirs.add(match.group(1))
except (psutil.NoSuchProcess, psutil.AccessDenied):
continue
return list(user_data_dirs)
print(get_all_user_data_dirs())
найти цельuser_data_dirНаконец, его можно использовать с Selenium:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
chrome_user_data_dir = "C:\\Users\\YourUser\\AppData\\Local\\Google\\Chrome\\User Data"
options = Options()
options.add_argument(f"--user-data-dir={chrome_user_data_dir}")
service = Service("chromedriver.exe")
driver = webdriver.Chrome(service=service, options=options)
driver.get("https://www.google.com")
черезpsutilПроанализируйте запущенный процесс Chrome, чтобы получить всеuser-data-dirи использовать специальныеuser_data_dirЗапустите браузер.
Чтобы получить имя пользователя из каталога пользовательских данных Chrome, вам необходимо получить доступ к файлу в этом каталоге, обычно по следующему пути:
C:\Users\[Username]\AppData\Local\Google\Chrome\User Data\(Windows)/Users/[Username]/Library/Application Support/Google/Chrome/(macOS)/home/[Username]/.config/google-chrome/(Linux)Эти папки содержат множество файлов, которые вы можете прочитатьLocal Stateфайл для получения основной информации о пользователе.
Local StateфайлХромLocal StateФайл содержит некоторые основные настройки пользователя, из которых можно получить информацию о пользователе.
импортировать JSON
импортировать ОС
защита get_chrome_user_name(user_data_dir):
local_state_path = os.path.join(user_data_dir, «Локальное состояние»)
#Проверяем, существует ли файл
если нет os.path.exists(local_state_path):
вернуть «Файл локального состояния не найден»
с open(local_state_path, 'r',coding='utf-8') в качестве файла:
local_state = json.load(файл)
# Получить информацию о пользователе из локального состояния
user_name = local_state.get('profile', {}).get('name', 'Неизвестный пользователь')
вернуть имя_пользователя
# Пример: путь к каталогу пользовательских данных Chrome
user_data_dir = r'C:\Users\YourUserName\AppData\Local\Google\Chrome\User Data'
печать (get_chrome_user_name (user_data_dir))
когда ты читаешьLocal StateКогда вы анализируете файл в формате JSON, вы можете получить из него много информации, например:
profile: Содержит информацию о конфигурации пользователя, такую как имя, изображение и т. д.last_version: показывает последнюю версию Chrome.is_logged_in: Показывает, вошел ли пользователь в систему.В большинстве случаев имя пользователя будет расположеноprofile, и может быть извлечен вышеуказанным методом.
Путем анализаLocal StateВы можете легко получить имя пользователя Chrome из данных JSON в файле.
ХромLocal StateФайлы хранят много базовой информации о пользователях. Если вы хотите извлечь из него все имена пользователей, вы можете прочитать файл и проанализировать его содержимое JSON. Вот шаги, как этого добиться.
Local StateАрхивировать и анализироватьВы можете прочитатьLocal Stateфайл, а затем анализирует его содержимое в формате JSON для извлечения всех пользовательских данных.
импортировать JSON
импортировать ОС
защита get_all_users (user_data_dir):
local_state_path = os.path.join(user_data_dir, «Локальное состояние»)
#Проверяем, существует ли файл
если нет os.path.exists(local_state_path):
вернуть «Файл локального состояния не найден»
с open(local_state_path, 'r',coding='utf-8') в качестве файла:
local_state = json.load(файл)
# Получить все пользовательские данные из локального состояния
Profiles = local_state.get('profile', {}).get('info_cache', {})
# Получить все имена пользователей
user_names = [profile.get('name', 'Unknown User') для профиля в Profiles.values()]
вернуть имена_пользователей
# Пример: путь к каталогу пользовательских данных Chrome
user_data_dir = r'C:\Users\YourUserName\AppData\Local\Google\Chrome\User Data'
печать (get_all_users (user_data_dir))
в ChromeLocal StateВ файлах пользовательские данные обычно хранятся вprofileвнизinfo_cache, который представляет собой словарь, в котором профиль каждого пользователя соответствует имени его конфигурации.
Local StateСтруктура файлаНиже приводитсяLocal StateПример структуры в архиве:
{
"profile": {
"info_cache": {
"profile1": {
"name": "User1",
"avatar": "path/to/avatar1.jpg"
},
"profile2": {
"name": "User2",
"avatar": "path/to/avatar2.jpg"
}
}
}
}
Путем анализаLocal Stateфайле вы можете получить имена всех пользователей Chrome. Это позволяет легко составить список всех учетных записей.
в ChromeLocal Stateфайл, данные каждого пользователя содержатся вinfo_cacheсередина. Оттуда вы можете извлечь имя пользователя и соответствующий подкаталог конфигурации.
Local StateАрхивировать и анализироватьВот как это сделать из ChromeLocal StateМетод для получения имен и соответствующих подкаталогов всех пользователей в файле.
импортировать JSON
импортировать ОС
защита get_users_and_profiles (user_data_dir):
local_state_path = os.path.join(user_data_dir, «Локальное состояние»)
#Проверяем, существует ли файл
если нет os.path.exists(local_state_path):
вернуть «Файл локального состояния не найден»
с open(local_state_path, 'r',coding='utf-8') в качестве файла:
local_state = json.load(файл)
# Получить все пользовательские данные из локального состояния
Profiles = local_state.get('profile', {}).get('info_cache', {})
# Получить все имена пользователей и соответствующие им подкаталоги
пользователь_информация = {}
для Profile_key, Profile_data в Profiles.items():
user_name = Profile_data.get('имя', 'Неизвестный пользователь')
Profile_sub_dir = os.path.join(user_data_dir, 'Профиль' + Profile_key)
user_info[имя_пользователя] = Profile_sub_dir
вернуть user_info
# Пример: путь к каталогу пользовательских данных Chrome
user_data_dir = r'C:\Users\YourUserName\AppData\Local\Google\Chrome\User Data'
users_and_profiles = get_users_and_profiles(user_data_dir)
для user_name, Profile_dir в user_and_profiles.items():
print(f"Имя пользователя: {user_name}, подкаталог: {profile_dir}")
существоватьLocal Stateфайл, все пользовательские данные находятся вprofileвнизinfo_cache. У каждого пользователя есть соответствующий ключ конфигурации (например,profile1, profile2ждать). Каждый настроенный профиль содержит имя пользователя (name) и другую соответствующую информацию.
Local StateСтруктура файлаНиже приводитсяLocal StateПример структуры в архиве:
{
"profile": {
"info_cache": {
"Profile 1": {
"name": "User1",
"avatar": "path/to/avatar1.jpg"
},
"Profile 2": {
"name": "User2",
"avatar": "path/to/avatar2.jpg"
}
}
}
}
Profileначало, за которым следует номер (например,Profile 1, Profile 2ждать).Путем анализаLocal Stateфайле вы можете получить имена всех пользователей и соответствующие им подкаталоги конфигурации. Это позволяет вам легко найти расположение данных конфигурации каждого пользователя.
Чтобы получить учетную запись Gmail из каталога пользовательских данных Chrome, вам необходимо извлечь соответствующую информацию из данных конфигурации Chrome. Обычно это достигается путем анализа файлов пользовательских данных Chrome, в частности данных учетной записи Google.
Данные каждого пользователя Chrome будут храниться в отдельной папке, обычно вUser Dataв каталогеProfileвнутри каталога. Если пользователь вошел в учетную запись Google, соответствующую информацию об учетной записи Gmail можно найти в данных конфигурации.
импортировать ОС
импортировать JSON
def get_gmail_from_profile(user_data_dir, имя_профиля):
каталог_профиля = os.path.join(каталог_данных_пользователя, имя_профиля)
accounts_file = os.path.join(profile_dir, 'Веб-данные')
#Проверяем, существует ли файл
если нет os.path.exists(accounts_file):
вернуть «Файл веб-данных не найден»
# Попробуйте прочитать файл веб-данных
попробуйте:
с open(accounts_file, 'r',coding='utf-8') в качестве файла:
web_data = json.load(файл)
# Извлечь учетную запись Gmail из данных
для строки в web_data.get('accounts', []):
если 'gmail' в row.get('email', ''):
вернуть row.get('электронная почта')
вернуть «Учетная запись Gmail не найдена»
кроме исключения как e:
return f «Ошибка чтения файла веб-данных: {e}»
# Пример: путь к каталогу пользовательских данных Chrome
user_data_dir = r'C:\Users\YourUserName\AppData\Local\Google\Chrome\User Data'
# Предположим, вы используете профиль 1
имя_профиля = 'Профиль 1'
print(get_gmail_from_profile(user_data_dir, имя_профиля))
Файлы веб-данных содержат различные данные для входа в Chrome, включая имена учетных записей, пароли и другую соответствующую информацию. В этом примере мы ищемemailполе и проверьте, содержит ли оно почтовый ящик Gmail.
Ниже приведен пример частичной структуры файла веб-данных:
{
"accounts": [
{
"email": "[email protected]",
"password": "encrypted_password_1"
},
{
"email": "[email protected]",
"password": "encrypted_password_2"
}
]
}
email) обычно можно извлечь.Путем анализа профиля пользователя ChromeWeb Dataфайл, вы можете легко получить учетную запись Gmail пользователя. Если пользователь вошел в учетную запись Gmail, в данных появится соответствующий адрес электронной почты.
Распространенные инструменты веб-автоматизации включают Selenium и Playwright. Эти инструменты могут имитировать нажатие, ввод текста и другие действия пользователя.
Используйте такой инструмент, как BeautifulSoup или Playwright, чтобы получить все гиперссылки на вашем веб-сайте (<a href>), чтобы создать список страниц для просмотра.
Откройте браузер с помощью Selenium или Playwright и смоделируйте действия пользователя, такие как нажатие кнопок, прокрутка и даже запуск динамического контента.
Современные веб-сайты часто содержат много динамически генерируемого контента, и вы можете использовать Playwright или Selenium для выполнения JavaScript, чтобы обеспечить правильную загрузку страницы.
На основе просканированных ссылок рекурсивно посетите все страницы веб-сайта и запишите посещенные страницы, чтобы избежать дублирования.
При просмотре каждой страницы моделируйте обычное поведение пользователя, например заполнение форм, отправку информации и запись результатов операций.
из веб-драйвера импорта селена
из selenium.webdriver.common.by импортировать
#Инициализируем браузер
драйвер = вебдрайвер.Chrome()
# Начать просмотр веб-сайта
driver.get("https://example.com")
# Захватить все ссылки
ссылки = driver.find_elements(By.TAG_NAME, "a")
по ссылке в ссылках:
href = link.get_attribute("href")
print(f"Найдена ссылка: {href}")
# Имитировать щелчок
если ссылки:
ссылки[0].клик()
# Закрыть браузер
драйвер.выйти()
При просмотре и моделировании веб-сайтов соблюдайте условия использования соответствующего веб-сайта, чтобы не создавать чрезмерную нагрузку на сервер и не нарушать закон.
из веб-драйвера импорта селена
из selenium.webdriver.common.by импортировать
из selenium.webdriver.support.ui импортировать WebDriverWait
из selenium.webdriver.support импортируйте ожидаемые_условия как EC
#Инициализировать веб-драйвер
драйвер = вебдрайвер.Chrome()
#Открываем целевой сайт
driver.get("https://example.com")
# Подождите, пока появится кнопка, и нажмите
ожидание = WebDriverWait (драйвер, 10)
button = wait.until(EC.element_to_be_clickable((By.ID, "button_id")))
кнопка.клик()
# Подождем, пока загрузятся другие элементы
text_field = wait.until(EC.visibility_of_element_located((By.NAME, "text_field_name")))
text_field.send_keys("Тестовые данные")
# Закрыть браузер
драйвер.выйти()
время импорта
из веб-драйвера импорта селена
#Инициализация веб-драйвера
драйвер = вебдрайвер.Chrome()
#Открываем целевой сайт
driver.get("https://example.com")
time.sleep(3) # Пауза на 3 секунды
# Имитировать нажатие кнопки
кнопка = driver.find_element(By.ID, "button_id")
кнопка.клик()
время.сон(3)
# Закрыть браузер
драйвер.выйти()**Примечание**: `time.sleep` не рекомендуется использовать для формального тестирования, а только в целях отладки.из веб-драйвера импорта селена
#Инициализация веб-драйвера
драйвер = вебдрайвер.Chrome()
#Открываем целевой сайт
driver.get("https://example.com")
# Продолжить после подтверждения вручную
input("Нажмите Enter, чтобы перейти к следующему шагу...")
кнопка = driver.find_element(By.ID, "button_id")
кнопка.клик()
# Продолжаем выполнять другие тесты
input("Нажмите Enter, чтобы перейти к следующему шагу...")
драйвер.выйти()
импортировать модульный тест
из веб-драйвера импорта селена
класс TestExample(unittest.TestCase):
защита setUp(self):
self.driver = веб-драйвер.Chrome()
защита test_step_by_step(self):
водитель = сам.драйвер
driver.get("https://example.com")
input("Проверьте страницу, нажмите Enter, чтобы продолжить...") # Ручная точка останова
кнопка = driver.find_element(By.ID, "button_id")
кнопка.клик()
input("Проверьте результаты операции, нажмите Enter, чтобы продолжить...") # Ручная точка останова
защита TearDown (сам):
self.driver.quit()
если __name__ == "__main__":
unittest.main()
из веб-драйвера импорта селена
из selenium.webdriver.common.by импортировать
# Инициализируем селен
драйвер = вебдрайвер.Chrome()
driver.get("URL-адрес вашей целевой веб-страницы")
# Поиск текста, начинающегося с определенной строки
target_text = "Начальный текст цели"
rows = driver.find_elements(By.CSS_SELECTOR, "таблица tr")
# Сохранить результаты
результат_данные = []
для строки в строках:
ячейки = row.find_elements(By.TAG_NAME, "td")
если ячейки и ячейки[0].text.startswith(target_text):
# Получите информацию об узле
result_data.append([cell.text для ячейки в ячейках])
драйвер.выйти()
# Конвертируем результат в HTML
html_output = "<h2>Результаты поиска</h2>\n"
для i, row_data в перечислении (result_data, start = 1):
html_output += f"<h3>Line {i}</h3>\n<ul>\n"
для данных в row_data:
html_output += f" <li>{данные}</li>\n"
html_output += "</ul>\n"
# показать результаты
печать (html_output)
Результаты поиска
Линия 1
- Целевой начальный текст 1
- Другая информация1
- Другая информация 2
Линия 2
- Целевой вступительный текст 2
- Другая информация1
- Другая информация 2
startswithМетод определения соответствия текста условиям.<h2>и<h3>, и в виде неупорядоченного списка<ul>Организуйте информацию.<head>и<body>: Создавайте только необходимые HTML-теги для удобного встраивания в другие страницы.В Селене,find_elements(By.XPATH, xpath)Используется для поиска всех элементов, соответствующих критериям, на основе селектора XPath и возврата списка. это связано сfind_element(By.XPATH, xpath)В отличие от последнего, последний возвращает только первый соответствующий элемент.
из веб-драйвера импорта селена
из selenium.webdriver.common.by импортировать
# Запустить браузер
драйвер = вебдрайвер.Chrome()
# Открыть веб-страницу
driver.get("https://example.com")
# Используйте XPath, чтобы найти все элементы, соответствующие критериям
elements = driver.find_elements(By.XPATH, "//div[@class='example-class']")
# Обходим найденные элементы и выводим содержимое
для элемента в элементах:
печать(element.text)
# Закрыть браузер
драйвер.выйти()
| XPath-выражение | описывать |
|---|---|
//tagname |
Выбирает все элементы с указанным тегом, например//divпредставлять всеdivэлемент |
//tagname[@attribute='value'] |
Выбирайте элементы на основе значений атрибутов, например.//input[@type='text'] |
//tagname[contains(@attribute, 'value')] |
Атрибуты, содержащие определенный текст, например//div[contains(@class, 'header')] |
//tagname[text()='text'] |
Выберите элементы, которые точно соответствуют тексту, например//button[text()='Отправить'] |
//tagname[contains(text(), 'text')] |
Выберите элементы, содержащие определенный текст, например//p[содержит(текст(), 'Добро пожаловать')] |
//*[@id='some-id'] |
Выберите элемент с определенным идентификатором |
(//tagname)[index] |
Выберитеindexсовпадающие элементы, например(//div)[1]Выберите первый div |
Предположим следующую структуру HTML:
<div class="product">Продукт А</div>
<div class="product">Продукт Б</div>
<div class="product">Продукт C</div>
Мы можем использовать следующий код Selenium, чтобы получить всеproductКатегорияdivэлемент:
elements = driver.find_elements(By.XPATH, "//div[@class='product']")
for element in elements:
print(element.text)
find_elements()Возвращается список, даже если найден только один элемент.find_element(),в противном случаеfind_elements()。find_elements(By.XPATH, xpath)Это мощный и гибкий метод поиска в Selenium, который можно использовать для поиска нескольких элементов на веб-странице и подходит для сканеров и автоматического тестирования.
В Селене,By.LINK_TEXTиBy.PARTIAL_LINK_TEXTИспользуется для поиска элементов по текстовому содержимому гиперссылки:
By.LINK_TEXT: точное совпадение на основе полного текста ссылки.By.PARTIAL_LINK_TEXT: выполнить нечеткое сопоставление на основе части текста ссылки.из веб-драйвера импорта селена
из selenium.webdriver.common.by импортировать
# Запустить браузер
драйвер = вебдрайвер.Chrome()
# Открыть веб-страницу
driver.get("https://example.com")
# Используйте LINK_TEXT для поиска гиперссылок.
element = driver.find_element(By.LINK_TEXT, «Полный текст ссылки»)
print(element.get_attribute("href"))
# Используйте PARTIAL_LINK_TEXT для поиска гиперссылок
element_partial = driver.find_element(By.PARTIAL_LINK_TEXT, "Частичный текст")
print(element_partial.get_attribute("href"))
# Закрыть браузер
драйвер.выйти()
<a href="https://example.com/page1">Полный текст ссылки</a>
<a href="https://example.com/page2">Нажмите здесь, чтобы узнать больше</a>
Предположим, вы хотите нажать<a>Полный текст ссылки</a>, вы можете использовать:
driver.find_element(By.LINK_TEXT, «Полный текст ссылки»).click()
Если гиперссылка «Нажмите здесь, чтобы узнать больше», но мы знаем только «Нажмите здесь», вы можете использовать:
driver.find_element(By.PARTIAL_LINK_TEXT, «Нажмите здесь»).click()
By.PARTIAL_LINK_TEXT。By.LINK_TEXTдля точного совпадения.<a>Ссылка на ярлык.find_elements()вернет список, аfind_element()Возвращается только первый соответствующий элемент.By.LINK_TEXTПолезно для точного поиска полных ссылок, в то время какBy.PARTIAL_LINK_TEXTБолее гибкий и может использоваться для сопоставления части текста ссылки.
из веб-драйвера импорта селена
из selenium.webdriver.common.by импортировать
из selenium.webdriver.support.ui импортировать WebDriverWait
из selenium.webdriver.support импортируйте ожидаемые_условия как EC
драйвер = вебдрайвер.Chrome()
попробуйте:
elems = WebDriverWait(драйвер, 10).until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".item"))
)
print("Элемент найден:", len(elems))
кроме:
print("Элемент не найден в течение 10 секунд")
элементы = driver.find_elements(By.CSS_SELECTOR, ".item")
если не элементы:
print("Элемент не найден")
еще:
print("Количество найденных элементов:", len(elems))
# Переключитесь на iframe и повторите поиск
iframe = driver.find_element(By.TAG_NAME, "iframe")
driver.switch_to.frame(iframe)
элементы = driver.find_elements(By.CSS_SELECTOR, ".item")
print("Найдено:", len(elems))
shadow_host = driver.find_element(By.CSS_SELECTOR, "#shadowHost")
shadow_root = driver.execute_script("return arguments[0].shadowRoot", shadow_host)
elem = shadow_root.find_element(By.CSS_SELECTOR, ".target")
def Safe_find_elements (драйвер, по, селектор, тайм-аут = 10):
попробуйте:
return WebDriverWait(драйвер, тайм-аут).until(
EC.presence_of_all_elements_located((по, селектор))
)
кроме:
return [] # Невозможно найти возвращенный пустой список
elements = Safe_find_elements(драйвер, By.CSS_SELECTOR, ".item")
если элементы:
print("Найдено:", len(elems))
еще:
print("Элемент не найден")
из веб-драйвера импорта селена
из selenium.webdriver.common.alert Предупреждение об импорте
драйвер = вебдрайвер.Chrome()
driver.get("URL")
alert = Оповещение (водитель)
print(alert.text) # Получаем предупреждающее сообщение
alert.accept() # Нажмите ОК
драйвер.выйти()
alert = Оповещение (водитель)
печать(предупреждение.текст)
alert.accept() # Нажмите ОК
# alert.dismiss() # Нажмите, чтобы отменить
alert = Оповещение (водитель)
печать(предупреждение.текст)
alert.send_keys("Тестовый ввод") #Ввод содержимого
alert.accept() # Нажмите ОК
driver.switch_to.alertПереключиться на окно оповещений.try-exceptОбрабатывайте исключения, чтобы избежать сбоев теста.
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
WebDriverWait(driver, 10).until(EC.alert_is_present())
В Selenium вы можете использоватьWebDriverWaitчтобы проверить, существует ли окно с предупреждением, чтобы избежать ошибок, вызванных отсутствием окна с предупреждением.
из веб-драйвера импорта селена
из selenium.webdriver.common.alert Предупреждение об импорте
из selenium.webdriver.support.ui импортировать WebDriverWait
из selenium.webdriver.support импортируйте ожидаемые_условия как EC
драйвер = вебдрайвер.Chrome()
driver.get("URL")
попробуйте:
# Подождите 5 секунд, чтобы проверить, есть ли окно с предупреждением
WebDriverWait(драйвер, 5).до(EC.alert_is_present())
alert = Оповещение (водитель)
print("Содержимое окна оповещения:", alert.text)
alert.accept() # Нажмите ОК
кроме:
print("Предупреждение не найдено")
драйвер.выйти()
WebDriverWaitПеред переключением убедитесь, что окно с предупреждением появляется, чтобы избежатьNoAlertPresentException。try-exceptЧтобы предотвратить сбой теста из-за отсутствия окна с предупреждением.использоватьWebDriverWait(driver, 5).until(EC.alert_is_present())Он может обнаруживать только окна предупреждений, созданные с помощью JavaScript, но не может обнаруживать окна предупреждений на уровне системы Chrome, такие как «Сохранить пароли», «Уведомления веб-сайта» и т. д.
ChromeOptionsОтключите окна предупреждений на уровне системы.pyautoguiилиWin32 APIдля имитации операций с клавиатурой или мышью.Вы можете запустить Chrome,ChromeOptionsзакрывать уведомления и другие общесистемные всплывающие окна.
из веб-драйвера импорта селена
параметры = веб-драйвер.ChromeOptions()
options.add_argument("--disable-notifications") # Отключить уведомления
options.add_argument("--disable-save-password-bubble") # Отключить сохранение запросов на ввод пароля
драйвер = webdriver.Chrome(опции=опции)
driver.get("URL")
Если появилось окно с предупреждением, вы можете использоватьpyautoguiдля имитации ключевых операций, таких как нажатиеEnterилиEscзакрыть.
импортпиавтогуи
время импорта
time.sleep(3) # Дождитесь появления окна с предупреждением
pyautogui.press("enter") # Имитируем нажатие клавиши Enter
Если вы находитесь в среде Windows, вы можете использоватьpygetwindowиpywinautoдля обнаружения и закрытия всплывающих окон на системном уровне.
импортировать pygetwindow как gw
импортпивинавто
windows = gw.getWindowsWithTitle("Google Chrome") # Получаем окно Chrome
для победы в windows:
if «системное предупреждение» в win.title.lower(): # Проверьте, содержит ли заголовок «системное предупреждение»
win.close() # Закрываем окно
ChromeOptionsдля предотвращения появления предупреждений.pyautoguiилиWin32 APIдля имитации операций с клавиатурой или окном.Shadow DOM является частью веб-компонентов и используется для инкапсуляции HTML, CSS и JavaScript, чтобы детали внутренней реализации компонентов не мешали внешнему миру.
Проще говоря, это структура DOM, которая «изолирует область действия».
---<пользовательский-элемент>
#shadow-root (открыть)
<button>Нажмите на меня</button>
</custom-element>
buttonНа самом деле он существует в теневой DOM и не может использоваться с традиционнымиdocument.querySelector("button")оказаться.
element.shadowRootelement.shadowRootВозвращает ноль, недоступенconst shadowHost = document.querySelector('#host');
const shadowRoot = shadowHost.attachShadow({ mode: 'open' });
shadowRoot.innerHTML = '<p>Hello from Shadow DOM</p>';
---
// внутри теневого DOM
<div><slot name="title">Заголовок по умолчанию</slot></div>
// внешнее использование
<пользовательский-элемент>
<span slot="title">Пользовательский заголовок</span>
</custom-element>
---
js = """
const host = document.querySelector('custom-element');
const shadow = host.shadowRoot;
return shadow.querySelector('button');
"""
button = driver.execute_script(js)
button.click()
---
shadowRootИскать позжеБраузер Tor по сути представляет собой Firefox ESR плюс настройки сети Tor и расширенные настройки конфиденциальности. Selenium не может «управлять графическим интерфейсом браузера Tor» напрямую, но можетFirefox + Tor SOCKS Proxyспособ добиться того же эффекта анонимности, что и в Tor Browser.
Сначала убедитесь, что Tor запущен на локальном компьютере. Прокси-сервер SOCKS по умолчанию:
127.0.0.1:9050
Если вы используете Tor Browser, после запуска обычно происходит следующее:
127.0.0.1:9150
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.firefox.service import Service
options = Options()
options.set_preference("network.proxy.type", 1)
options.set_preference("network.proxy.socks", "127.0.0.1")
options.set_preference("network.proxy.socks_port", 9150)
options.set_preference("network.proxy.socks_remote_dns", True)
service = Service("geckodriver.exe")
driver = webdriver.Firefox(service=service, options=options)
driver.get("https://check.torproject.org")
Введите следующий URL-адрес, и на странице будет показано, что использование Tor означает успех:
https://check.torproject.org
Если вы хотите использовать Firefox, встроенный в браузер Tor:
options.binary_location = r"C:\Tor Browser\Browser\firefox.exe"
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.firefox.service import Service
options = Options()
options.binary_location = r"C:\Tor Browser\Browser\firefox.exe"
options.set_preference("network.proxy.type", 1)
options.set_preference("network.proxy.socks", "127.0.0.1")
options.set_preference("network.proxy.socks_port", 9150)
options.set_preference("network.proxy.socks_remote_dns", True)
service = Service("geckodriver.exe")
driver = webdriver.Firefox(service=service, options=options)
driver.get("https://check.torproject.org")
Чтобы извлечь электронные письма из Thunderbird, вы можете использовать библиотеку протокола Python IMAP, например.imaplibили сторонняя библиотекаimapclient. Во-первых, убедитесь,
В Thunderbird включен протокол IMAP, и он позволяет внешним приложениям подключаться.
Используйте pip для установки связанных библиотек:
pip install imapclient pyzmail36
Используйте следующий код для подключения к почтовому серверу и извлечения важных писем:
импортировать imapclient
из pyzmail импортировать PyzMessage
# Настройте почтовый сервер и данные для входа.
IMAP_SERVER = 'imap.example.com' # Замените адресом вашего IMAP-сервера.
EMAIL = 'ваш_адрес@example.com'
ПАРОЛЬ = 'ваш_пароль'
# Подключаемся к IMAP-серверу
с imapclient.IMAPClient(IMAP_SERVER) в качестве клиента:
client.login(EMAIL, ПАРОЛЬ)
client.select_folder('ВХОДЯЩИЕ')
# Поиск сообщений, отмеченных как важные
messages = client.search(['FLAGGED'])
для uid в сообщениях:
raw_message = client.fetch([uid], ['BODY[]'])[uid][b'BODY[]']
сообщение = PyzMessage.factory(raw_message)
# Отображение информации об электронной почте
print(f"Тема: {message.get_subject()}")
print(f"От: {message.get_address('from')}")
print(f"Дата: {message.get_decoded_header('date')}")
Выполните приведенный выше код, чтобы проверить, сможете ли вы успешно извлечь электронные письма, помеченные как важные. Если у вас возникли проблемы с подключением, вы можете проверить настройки сервера или выполнить более детальную отладку на уровне протокола IMAP.
Таким образом, вы можете успешно извлекать важные электронные письма из Thunderbird с помощью Python.
Установите PyAutoGUI, используя следующие инструкции:
pip install pyautogui
PyAutoGUI — это инструмент автоматизации, который позволяет моделировать операции с мышью и клавиатурой, подходящий для автоматического тестирования графического интерфейса или повторяющейся работы.
Управляйте положением мыши и действиями:
импортпиавтогуи
# Получить разрешение экрана
screen_width, screen_height = pyautogui.size()
print(f"Разрешение экрана: {screen_width}x{screen_height}")
# Перемещаем курсор мыши по указанным координатам
pyautogui.moveTo(100, 100, продолжительность = 1)
# Перемещаем мышь из текущей позиции
pyautogui.move(50, 50, длительность=1)
# Имитируем щелчок мышью
pyautogui.click(200, 200)
# Имитируем щелчок правой кнопкой мыши
pyautogui.rightClick()
# Имитировать операцию перетаскивания
pyautogui.dragTo(400, 400, длительность=1)
Имитировать ввод клавиш клавиатуры:
импортпиавтогуи
# Введите текст
pyautogui.write("Привет, PyAutoGUI!", интервал=0,1)
# Имитируем нажатие определенной клавиши
pyautogui.press("введите")
# Нажмите несколько клавиш одновременно
pyautogui.hotkey("ctrl", "c") # Копировать текст
Сделайте скриншот или найдите конкретное изображение:
импортпиавтогуи
# Захват всего экрана
скриншот = pyautogui.screenshot()
скриншот.сохранить("скриншот.png")
# Найдите изображение на экране
location = pyautogui.locateOnScreen("image.png")
если местоположение:
print(f"Местоположение изображения: {location}")
еще:
print("Изображение не найдено")
Чтобы предотвратить бесконечное выполнение программы, вы можете использоватьpyautogui.FAILSAFE:
pyautogui.FAILSAFE = True # Значение по умолчанию — True
# Подведите указатель мыши к верхнему левому углу экрана (0, 0), чтобы немедленно остановить программу
Если Surfshark VPN не предоставляет инструменты командной строки, такие какsurfshark-cli), вам необходимо использовать инструменты автоматизации графического интерфейса (например,pyautogui) имитирует ручное управление.
pyautoguiмодуль (доступен черезpip install pyautoguiУстановить).черезpyautoguiАвтоматизируйте нажатие кнопки в графическом интерфейсе Surfshark для подключения или отключения от VPN.
В следующем примере предполагается, что Surfshark VPN имеет фиксированное положение кнопки и используетpyautoguiЧтобы сделать:
импортпиавтогуи
время импорта
защита Connect_VPN():
# Убедитесь, что Surfshark включен
print("Попробуйте подключиться к VPN...")
# Имитируем нажатие кнопки «Подключиться» и корректируем координаты в соответствии с фактическим местоположением
pyautogui.click(x=500, y=300) # Заменить позицией кнопки «Подключиться»
time.sleep(5) # Дождитесь завершения соединения
print("VPN подключен")
защита отключение_vpn():
# Убедитесь, что Surfshark включен
print("Попробуйте отключиться от VPN...")
# Имитируем нажатие кнопки «Отключить» и корректируем координаты в соответствии с фактическим положением
pyautogui.click(x=500, y=350) # Заменить позицией кнопки «Отключить»
time.sleep(5) # Дождитесь завершения отключения
print("VPN отключен")
# тест
Connect_VPN()
отключить_vpn()
xиyкоординаты.subprocessОткройте приложение, например.subprocess.run("start surfshark.exe", shell=True)。Если метод координат нестабилен, вы можете использовать распознавание изображений (например,pyautogui.locateOnScreen()), чтобы найти положение кнопки и повысить гибкость.
Kivy — это платформа Python с открытым исходным кодом для быстрой разработки мультисенсорных приложений. Он разработан с учетом кроссплатформенной поддержки, что позволяет разработчикам работать на Windows, macOS, Linux, iOS и Android. Подождите, пока один и тот же код запустится на нескольких платформах. Kivy особенно подходит для создания приложений с графическим интерфейсом для мобильных телефонов, планшетов и настольных устройств и имеет хорошую поддержку мультитач.
Приложения Kivy состоят из нескольких виджетов, которые можно разместить с помощью кода или KV-файлов собственного языка Kivy. Ниже приведен простой пример приложения, в котором отображается кнопка, меняющая цвет при нажатии.
из приложения импорта kivy.app
из kivy.uix.button Кнопка импорта
класс MyApp(Приложение):
защита сборки (сам):
return Button(text='Привет, Киви!',
background_color=(0, 1, 0, 1)) # Зеленая кнопка
если __name__ == '__main__':
МоеПриложение().run()
Kivy можно установить через pip:
pip install kivy
Kivy подходит для различных сценариев применения, включая, помимо прочего:
Kivy — это среда Python для создания кроссплатформенных приложений, но обычно она работает на локальном устройстве. Чтобы удаленно отобразить приложение Kivy, вы можете рассмотреть следующие варианты:
Вы можете использовать VNC (виртуальные сетевые вычисления) или другие инструменты удаленного рабочего стола (такие как RDP, TeamViewer и т. д.) для удаленного управления и отображения приложений Kivy.
Те, кто использует Linux, могут использовать пересылку X11 для удаленного отображения графического интерфейса:
ssh -X username@remote_host
Вы можете использовать Flask или другие веб-фреймворки, чтобы предоставлять доступ к частям вашего приложения Kivy удаленным пользователям и отображать их с помощью веб-браузера:
Если вы хотите запустить приложение Kivy в контейнерной среде, вы можете настроить его с помощью Docker и VNC:
This error indicates that the tickmarker module from Kivy's Garden is not installed. To fix this issue, follow the steps below:
pip install kivy-garden
garden install tickmarker
Once you've done these steps, try running your Kivy application again.
Rio UI — это инфраструктура пользовательского интерфейса, в основе которой лежит Python, предназначенная для того, чтобы позволить разработчикам писать интерактивные приложения простым и интуитивно понятным способом. Он основан на логике программирования Python и представляет пользовательский интерфейс с помощью современных интерфейсных технологий.
pip install rio-ui
import rio
app = rio.App()
@app.page("/")
def index():
return rio.Text("Hello, Rio UI with Python!")
if __name__ == "__main__":
app.run()
email: [email protected]