2024-08-19



import requests
from bs4 import BeautifulSoup
import re
 
def get_page(url):
    try:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            return response.text
        return None
    except requests.RequestException:
        return None
 
def parse_page(html):
    soup = BeautifulSoup(html, 'html.parser')
    title = soup.select('.product_name')[0].text
    price = soup.select('.price_sale')[0].text
    return {
        'title': title,
        'price': price
    }
 
def main(url):
    html = get_page(url)
    if html:
        data = parse_page(html)
        print(f"商品名称: {data['title']}")
        print(f"商品价格: {data['price']}")
 
if __name__ == '__main__':
    url = 'https://www.example.com/product/12345'
    main(url)

这段代码首先定义了一个get_page函数,用于发送HTTP GET请求并获取页面内容。其中使用了请求头来伪装浏览器访问以绕过一些网站的反爬机制。如果请求成功,它会返回页面的HTML内容;如果请求失败,则返回None。

parse_page函数使用BeautifulSoup来解析HTML内容,并提取商品名称和价格信息。

main函数首先调用get_page获取页面内容,然后调用parse_page解析页面,并打印出商品名称和价格。

最后,如果这段代码被直接运行,它将会爬取示例URL指定页面的商品信息。

2024-08-19

subprocess模块提供了一种在Python脚本中调用外部程序的方法。Popensubprocess模块中的一个类,可以用来启动子进程,并与之交互。runsubprocess模块中的一个函数,它封装了Popen,提供了一种简单的方式来运行命令,并等待命令完成后,返回一个包含执行结果的CompletedProcess对象。

解决方案1:使用subprocess.run()




import subprocess
 
# 使用subprocess.run()来运行命令
completed_process = subprocess.run(['ls', '-l'], capture_output=True, text=True)
 
# 打印输出结果
print("stdout:", completed_process.stdout)
 
# 打印错误信息
print("stderr:", completed_process.stderr)

解决方案2:使用subprocess.Popen()




import subprocess
 
# 使用subprocess.Popen()来运行命令
p = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
out, err = p.communicate()
 
# 打印输出结果
print("stdout:", out)
 
# 打印错误信息
print("stderr:", err)

subprocess.run()相对于Popen的优势在于它是一个更简单的接口,可以更直接地运行命令并获取命令的输出,而无需处理管道和communicate()。不过,如果你需要更复杂的交互,比如要发送信号或者调整子进程的环境,你可能需要使用Popen

注意:run()函数在Python 3.5中被引入。如果你使用的是更早的Python版本,只能使用Popen

2024-08-19

在Python中,您可以使用osshutil模块来删除文件夹及其下所有文件。以下是一个简单的示例代码:




import os
import shutil
 
def delete_folder_contents(folder):
    for filename in os.listdir(folder):
        file_path = os.path.join(folder, filename)
        try:
            if os.path.isfile(file_path) or os.path.islink(file_path):
                os.unlink(file_path)
            elif os.path.isdir(file_path):
                shutil.rmtree(file_path)
        except Exception as e:
            print(f'Failed to delete {file_path}. Reason: {e}')
 
# 使用示例
folder_to_delete = '/path/to/your/folder'
delete_folder_contents(folder_to_delete)

确保替换/path/to/your/folder为您想要删除的文件夹的路径。此代码将删除指定文件夹下的所有文件和子文件夹。请注意,在删除文件和文件夹之前,这些操作是不可逆的,请谨慎使用。

2024-08-19

在Python中,读取.nc(Network Common Data Form)文件通常使用netCDF4xarray库。以下是使用这两种库读取.nc文件的示例代码:

使用netCDF4库:




import netCDF4
 
# 打开.nc文件
nc_file = netCDF4.Dataset('example.nc', mode='r')
 
# 读取变量
var = nc_file.variables['variable_name']
data = var[:]
 
# 关闭文件
nc_file.close()

使用xarray库:




import xarray as xr
 
# 读取.nc文件
ds = xr.open_dataset('example.nc')
 
# 读取变量
var = ds['variable_name']
data = var.values
 
# 查看数据
print(data)

xarray提供的接口更简洁,并且它能够更自动化地处理多维数据。通常,xarray在数据处理和分析方面提供了更好的支持,尤其是在处理地理空间数据时。

2024-08-19

pynput 库提供了控制和监听键盘与鼠标的功能。以下是使用 pynput 库的基本示例。

监听键盘事件:




from pynput import keyboard
 
def on_press(key):
    try:
        print(f"按下键: {key.char}")
    except AttributeError:
        print(f"按下键: {key}")
 
def on_release(key):
    print(f"释放键: {key}")
    if key == keyboard.Key.esc:
        return False
 
with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()

监听鼠标事件:




from pynput import mouse
 
def on_click(x, y, button, pressed):
    if pressed:
        print(f"点击位置: ({x}, {y}) 按钮: {button}")
    else:
        print(f"释放位置: ({x}, {y}) 按钮: {button}")
 
def on_scroll(x, y, dx, dy):
    print(f"滚动位置: ({x}, {y}) 偏移: ({dx}, {dy})")
 
with mouse.Listener(on_click=on_click, on_scroll=on_scroll) as listener:
    listener.join()

控制鼠标移动和点击:




from pynput.mouse import Button, Controller
 
mouse = Controller()
 
# 移动鼠标到屏幕中心
mouse.position = (100, 100)
 
# 点击左键
mouse.press(Button.left)
mouse.release(Button.left)
 
# 点击右键
mouse.press(Button.right)
mouse.release(Button.right)
 
# 移动鼠标
mouse.move(100, 0)

控制键盘输入:




from pynput.keyboard import Key, Controller
 
keyboard = Controller()
 
# 按下并释放 'a' 键
keyboard.press('a')
keyboard.release('a')
 
# 输入 'Hello World!'
keyboard.type('Hello World!')

以上代码提供了使用 pynput 进行键盘和鼠标监听以及模拟输入的基本示例。

2024-08-19

在Python中实现与STM32的串口通信,你可以使用pyserial库。以下是一个简单的例子,展示如何使用Python发送和接收数据。

首先,确保你已经安装了pyserial库,如果没有安装,可以使用pip安装:




pip install pyserial

然后,在Python代码中,你可以这样实现与STM32的串口通信:




import serial
import time
 
# 配置串口参数
# 请根据你的实际情况配置串口号、波特率等
# 例如 Windows 上的串口可能是 'COM3'
# Linux 或 macOS 上可能是 '/dev/ttyUSB0'
port = 'COM3'
baudrate = 115200
 
# 打开串口
ser = serial.Serial(port, baudrate, timeout=0.5)
 
# 发送数据到STM32
ser.write(b'Hello STM32\n')  # 注意需要发送bytes类型数据
 
# 从STM32接收数据
# 假设STM32会回复'Hello Python\n'
response = ser.readline()  # 读取一行数据,直到遇到换行符
print(response)
 
# 关闭串口
ser.close()

确保STM32的串口初始化配置与Python端匹配。在STM32上,你需要配置串口,使能中断(如果使用中断接收),并实现发送和接收功能。

以上代码是一个基本的例子,展示了如何打开串口、发送数据、接收数据和关闭串口。根据你的具体需求,你可能需要添加错误处理、数据解析和协议处理等。

2024-08-19

Python有非常丰富的库,这些库可以帮助开发者更快地完成工作,避免重复造轮子。以下是一些Python开发者常用的库:

  1. Requests:一个非常简洁而且简单的Python HTTP客户端库,用于发送所有类型的HTTP请求。



import requests
response = requests.get('https://www.google.com/')
print(response.text)
  1. BeautifulSoup:用于解析HTML和XML文件,提取所需数据。



from bs4 import BeautifulSoup
import requests
 
r = requests.get('https://www.google.com/')
soup = BeautifulSoup(r.text, 'html.parser')
print(soup.prettify())
  1. Pandas:用于数据分析和操作的强大库,能够处理来自不同源的数据,例如SQL,CSV,Excel文件等。



import pandas as pd
data = pd.read_csv('file.csv')
print(data)
  1. NumPy:用于处理大型多维数组和矩阵,提供了大量的数学函数库。



import numpy as np
print(np.arange(5))
  1. SciPy:是一个专门为科学和工程设计的库。



import scipy
print(scipy.__version__)
  1. Matplotlib:用于绘制数据的图形库。



import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4])
plt.ylabel('一些数字')
plt.show()
  1. Selenium:用于Web自动化测试,但也可以用来抓取需要JavaScript渲染的网页。



from selenium import webdriver
driver = webdriver.Firefox()
driver.get('https://www.google.com/')
print(driver.title)
driver.close()
  1. Scrapy:一个用于网络爬虫的开源和高级的Python框架,用于抓取网站并从其页面中提取结构化数据。



import scrapy
 
class MySpider(scrapy.Spider):
    name = 'myspider'
    start_urls = ['http://www.example.com/']
 
    def parse(self, response):
        # 分析响应并提取项目
        pass
  1. TensorFlow 或 PyTorch:用于机器学习和深度学习的库。



# TensorFlow示例
import tensorflow as tf
 
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))
  1. Django 或 Flask:用于Web开发的框架。



# Django示例
import django
print(django.VERSION)

这些库和框架可以帮助开发者快速完成从数据分析,数据挖掘,机器学习,Web开发,到自动化测试的任何任务。在使用时,需要安装对应的库,可以使用pip命令进行安装。例如,安装requests库的命令为:




pip install requests

以上就是Python必备库的一些示例,每个库都有其特定的用途,开发者可以根据自己的需求选择合适的库。

2024-08-19



import numpy as np
from keras.models import Sequential
from keras.layers import LSTM, Dense
from matplotlib import pyplot as plt
 
# 假设的数据集
data = np.linspace(0, 100, 100)
data = np.sin(data)
 
# 将数据集划分为训练集和测试集
train_size = int(len(data) * 0.7)
test_size = len(data) - train_size
train, test = data[0:train_size], data[train_size:]
 
# 对数据进行归一化处理
scaler = MinMaxScaler(feature_range=(0, 1))
train_scaled = scaler.fit_transform(train.reshape(-1, 1))
test_scaled = scaler.transform(test.reshape(-1, 1))
 
# 创建LSTM模型
model = Sequential()
model.add(LSTM(50, input_shape=(None, 1)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
 
# 对模型进行训练
history = model.fit(train_scaled, train, epochs=100, batch_size=1, verbose=2, validation_split=0.05)
 
# 对模型进行预测
train_predict = model.predict(train_scaled)
test_predict = model.predict(test_scaled)
train_predict = scaler.inverse_transform(train_predict)
test_predict = scaler.inverse_transform(test_predict)
 
# 画出结果图
plt.plot(test, color='blue', label='Real')
plt.plot(train_predict, color='red', label='Train Predict')
plt.plot(test_predict, color='green', label='Test Predict')
plt.legend()
plt.show()

这段代码展示了如何使用Keras库在Python中创建和训练一个LSTM模型,并对数据进行预测和可视化。代码中包含数据归一化和模型训练的步骤,并使用matplotlib库来展示预测结果。

2024-08-19

由于提出的查询涉及的内容较多,下面提供一个简化的模型预测控制(MPC)算法的核心函数示例,这里使用的是伪代码,因为具体的实现会依赖于所使用的编程语言和系统环境。




#include <vector>
// 假设有一个状态空间模型和相应的系统方程
// x_k+1 = Ax_k + Bu_k + w_k
// y_k = Cx_k + v_k
 
// 初始化系统参数
const int N = 10; // 轨迹点数
const int nx = 4; // 状态变量数量
const int nu = 2; // 控制输入数量
const int ny = 2; // 测量数量
 
// 初始化系统矩阵
Eigen::Matrix<double, nx, nx> A;
Eigen::Matrix<double, nx, nu> B;
Eigen::Matrix<double, ny, nx> C;
 
// 模型预测控制算法实现
void MPC(Eigen::Matrix<double, ny, 1> &u_mpc, Eigen::Matrix<double, nx, 1> x_current, Eigen::Matrix<double, ny, 1> y_desired) {
    // 初始化Q, R矩阵,表示误差的重要性
    Eigen::Matrix<double, nx, nx> Q = Eigen::Matrix<double, nx, nx>::Identity();
    Eigen::Matrix<double, nu, nu> R = Eigen::Matrix<double, nu, nu>::Identity();
 
    // 初始化x和u的历史轨迹
    std::vector<Eigen::Matrix<double, nx, 1>> x_history;
    std::vector<Eigen::Matrix<double, nu, 1>> u_history;
 
    // 当前状态
    x_history.push_back(x_current);
 
    // 轨迹规划
    for (int k = 0; k < N; ++k) {
        // 初始化Q, R矩阵,表示误差的重要性
        Eigen::Matrix<double, nx, nx> Q = ...;
        Eigen::Matrix<double, nu, nu> R = ...;
 
        // 使用线性规划器求解最优控制输入
        // 假设已经有了一个线性规划器实现
        Eigen::Matrix<double, nu, 1> u_opt = linear_programmer(Q, R, ...);
 
        // 存储最优控制输入
        u_history.push_back(u_opt);
 
        // 预测下一个状态
        Eigen::Matrix<double, nx, 1> x_pred = A * x_history.back() + B * u_opt;
 
        // 更新历史状态
        x_history.push_back(x_pred);
    }
 
    // 选择最优的控制输入作为当前输出
    u_mpc = u_history.back();
}

这个伪代码示例提供了一个简化的MPC算法框架,其中包括了轨迹规划和求解最优控制输入的过程。在实际应用中,需要实现线性规划器来求解最优控制输入,并且需要根据实际系统参数初始化状态空间模型的矩阵。这个示例假设已经有一个线性规划器可以使用,实际应用中需要集成一个适合的线性规划器或使用现有的库函数。

2024-08-19

CopyOnWrite集合,是一种写时复制的容器。通俗的理解是当我们往一个集合容器添加元素的时候,不直接往当前集合添加,而是先将当前集合进行复制,出一个新的集合,然后新的集合里添加元素,添加完元素之后,再将原集合的引用指向新的集合。这样做的好处是我们可以对CopyOnWrite集合进行并发的读,而不需要加锁,因为当前集合不会添加任何元素,所以不会有任何的数据安全问题。

CopyOnWrite集合主要应用于读多写少的并发场景,例如缓存。

以下是一个简单的使用CopyOnWriteArrayList的例子:




import java.util.concurrent.CopyOnWriteArrayList;
 
public class CopyOnWriteExample {
    public static void main(String[] args) {
        CopyOnWriteArrayList<String> copyOnWriteArrayList = new CopyOnWriteArrayList<>();
 
        copyOnWriteArrayList.add("a");
        copyOnWriteArrayList.add("b");
 
        // 并发读取
        System.out.println(copyOnWriteArrayList);
 
        // 迭代器的并发读取
        for (String s : copyOnWriteArrayList) {
            System.out.println(s);
        }
    }
}

注意,即使是并发读取,也应避免在迭代过程中进行写入操作,因为这可能会导致ConcurrentModificationException异常。如果需要在迭代时进行修改,可以考虑使用其他的同步机制,如ReentrantReadWriteLock