Python教程--基本技能

】@TOC

5.1 解析命令行参数

在Python中,解析命令行参数是一项常见的任务,尤其是在开发命令行工具或脚本时。Python标准库提供了argparse模块,它可以帮助你轻松地编写用户友好的命令行接口。下面是使用argparse模块解析命令行参数的基本步骤:

引入argparse模块

首先,你需要引入argparse模块。

python 复制代码
import argparse

创建ArgumentParser对象

接下来,创建一个ArgumentParser对象。这个对象将帮助你定义和解析命令行参数。

python 复制代码
parser = argparse.ArgumentParser(description='这是一个示例脚本。')

定义参数

使用add_argument()方法来定义命令行参数。你可以指定参数名、参数类型、帮助信息等。

python 复制代码
parser.add_argument('input', type=str, help='输入文件的路径。')
parser.add_argument('--output', '-o', type=str, default='output.txt', help='输出文件的路径。')
parser.add_argument('--verbose', '-v', action='store_true', help='启用详细输出。')

解析参数

定义好所有参数后,调用parse_args()方法来解析命令行参数。

python 复制代码
args = parser.parse_args()

使用参数

解析后的参数将被存储在args对象中,你可以像使用普通变量一样使用它们。

python 复制代码
if args.verbose:
    print(f'输入文件:{args.input}')
    print(f'输出文件:{args.output}')
# 你的代码逻辑

完整示例

下面是一个完整的示例,展示了如何定义、解析和使用命令行参数:

python 复制代码
import argparse
def main():
    parser = argparse.ArgumentParser(description='这是一个示例脚本。')
    parser.add_argument('input', type=str, help='输入文件的路径。')
    parser.add_argument('--output', '-o', type=str, default='output.txt', help='输出文件的路径。')
    parser.add_argument('--verbose', '-v', action='store_true', help='启用详细输出。')
    
    args = parser.parse_args()
    
    if args.verbose:
        print(f'输入文件:{args.input}')
        print(f'输出文件:{args.output}')
    
    # 你的代码逻辑
if __name__ == '__main__':
    main()

你可以通过命令行运行这个脚本,并传递相应的参数。例如:

bash 复制代码
python script.py input.txt --output result.txt -v

在这个例子中,script.py是脚本的名字,input.txt是必需的输入文件参数,--output result.txt-v是可选的输出文件和详细输出参数。


5.2 时间日期处理

在Python中,处理时间日期是编程中的常见需求。Python标准库提供了datetime模块,它提供了多种时间日期相关的类和函数,用于处理日期、时间、时间差等。下面是使用datetime模块进行时间日期处理的基本步骤:

引入datetime模块

首先,你需要引入datetime模块。

python 复制代码
from datetime import datetime, timedelta

获取当前时间

你可以使用datetime.now()方法来获取当前时间。

python 复制代码
current_time = datetime.now()
print(current_time)

日期和时间格式化

你可以使用strftime()方法来格式化日期和时间,使其更容易阅读。

python 复制代码
formatted_time = current_time.strftime('%Y-%m-%d %H:%M:%S')
print(formatted_time)

日期和时间加减

你可以使用timedelta对象来增加或减少日期和时间。

python 复制代码
# 增加3天
three_days_later = current_time + timedelta(days=3)
print(three_days_later)
# 减少1小时
one_hour_ago = current_time - timedelta(hours=1)
print(one_hour_ago)

日期和时间比较

你可以使用timedelta对象来比较日期和时间。

python 复制代码
# 比较两个时间
time_diff = three_days_later - current_time
print(time_diff)

示例

下面是一个完整的示例,展示了如何使用datetime模块进行时间日期处理:

python 复制代码
from datetime import datetime, timedelta
def main():
    current_time = datetime.now()
    print(f'当前时间:{current_time}')
    formatted_time = current_time.strftime('%Y-%m-%d %H:%M:%S')
    print(f'格式化时间:{formatted_time}')
    three_days_later = current_time + timedelta(days=3)
    print(f'三天后的时间:{three_days_later}')
    one_hour_ago = current_time - timedelta(hours=1)
    print(f'一个小时前的時間:{one_hour_ago}')
    # 比较两个时间
    time_diff = three_days_later - current_time
    print(f'时间差:{time_diff}')
if __name__ == '__main__':
    main()

你可以通过命令行运行这个脚本,并查看输出结果。这个示例展示了如何获取当前时间、格式化日期和时间、进行日期和时间的加减以及比较日期和时间。


5.3 数据文件读写

在Python中,处理数据文件读写是一项基础技能,用于读取或写入文本文件、CSV文件、JSON文件等。Python标准库提供了osos.pathopencsvjson等模块,用于操作文件和读写不同类型的数据。下面是使用这些模块进行数据文件读写的步骤:

引入相关模块

首先,你可能需要引入一些相关模块。

python 复制代码
import os
import csv
import json

读取文本文件

使用open()函数来读取文本文件。

python 复制代码
# 打开文件
with open('example.txt', 'r') as file:
    # 读取文件内容
    content = file.read()
    print(content)

写入文本文件

使用open()函数来写入文本文件。

python 复制代码
# 打开文件
with open('example.txt', 'w') as file:
    # 写入文件内容
    file.write('这是要写入的内容')

读取CSV文件

使用csv.reader()来读取CSV文件。

python 复制代码
# 打开文件
with open('example.csv', 'r') as file:
    # 创建CSV读取器
    reader = csv.reader(file)
    # 读取文件内容
    for row in reader:
        print(row)

写入CSV文件

使用csv.writer()来写入CSV文件。

python 复制代码
# 打开文件
with open('example.csv', 'w') as file:
    # 创建CSV写入器
    writer = csv.writer(file)
    # 写入文件内容
    writer.writerow(['列1', '列2', '列3'])
    writer.writerow(['值1', '值2', '值3'])

读取JSON文件

使用json.load()来读取JSON文件。

python 复制代码
# 打开文件
with open('example.json', 'r') as file:
    # 创建JSON解析器
    data = json.load(file)
    print(data)

写入JSON文件

使用json.dump()来写入JSON文件。

python 复制代码
# 打开文件
with open('example.json', 'w') as file:
    # 创建JSON解析器
    json.dump(data, file)

示例

下面是一个完整的示例,展示了如何使用Python进行数据文件读写:

python 复制代码
import os
import csv
import json
def main():
    # 读取文本文件
    with open('example.txt', 'r') as file:
        content = file.read()
        print(content)
    # 写入文本文件
    with open('example.txt', 'w') as file:
        file.write('这是要写入的内容')
    # 读取CSV文件
    with open('example.csv', 'r') as file:
        reader = csv.reader(file)
        for row in reader:
            print(row)
    # 写入CSV文件
    with open('example.csv', 'w') as file:
        writer = csv.writer(file)
        writer.writerow(['列1', '列2', '列3'])
        writer.writerow(['值1', '值2', '值3'])
    # 读取JSON文件
    with open('example.json', 'r') as file:
        data = json.load(file)
        print(data)
    # 写入JSON文件
    with open('example.json', 'w') as file:
        json.dump(data, file)
if __name__ == '__main__':
    main()

在这个例子中,我们展示了如何使用Python进行文本文件、CSV文件和JSON文件的读写。这些技能在处理数据和配置文件时非常有用。


5.4 数据库操作

在Python中,数据库操作通常涉及与关系型数据库(如MySQL、PostgreSQL)或NoSQL数据库(如MongoDB、Redis)的交互。Python的标准库和第三方库提供了多种数据库接口,如sqlite3MySQLdbpsycopg2pymongo等。以下是一些基本步骤,用于在Python中进行数据库操作:

引入相关模块

首先,你可能需要引入一些数据库接口模块。

python 复制代码
import sqlite3
import pymysql
import pymongo

连接数据库

使用适当的连接函数来建立与数据库的连接。

python 复制代码
# 连接SQLite数据库
conn = sqlite3.connect('example.db')
# 连接MySQL数据库
conn = pymysql.connect(host='localhost', user='root', password='password', database='test_db')
# 连接MongoDB数据库
client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client['test_db']

创建数据库表或集合

在连接数据库后,你可以使用SQL语句或MongoDB的集合操作来创建新的表或集合。

python 复制代码
# 创建SQLite表
cursor = conn.cursor()
cursor.execute('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)')
conn.commit()
# 创建MongoDB集合
db.create_collection('users')

插入数据

你可以使用SQL语句或MongoDB的文档操作来插入数据。

python 复制代码
# 插入SQLite数据
cursor.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('Alice', 30))
conn.commit()
# 插入MongoDB数据
db.users.insert_one({'name': 'Bob', 'age': 25})

查询数据

你可以使用SQL语句或MongoDB的查询操作来检索数据。

python 复制代码
# 查询SQLite数据
cursor.execute('SELECT * FROM users WHERE age > ?', (25,))
rows = cursor.fetchall()
for row in rows:
    print(row)
# 查询MongoDB数据
for user in db.users.find({'age': {'$gt': 25}}):
    print(user)

更新和删除数据

你可以使用SQL语句或MongoDB的更新和删除操作来修改或删除数据。

python 复制代码
# 更新SQLite数据
cursor.execute('UPDATE users SET age = ? WHERE name = ?', (31, 'Alice'))
conn.commit()
# 删除SQLite数据
cursor.execute('DELETE FROM users WHERE name = ?', ('Bob',))
conn.commit()
# 更新MongoDB数据
db.users.update_one({'name': 'Bob'}, {'$set': {'age': 26}})
# 删除MongoDB数据
db.users.delete_one({'name': 'Charlie'})

关闭数据库连接

完成数据库操作后,应该关闭数据库连接。

python 复制代码
cursor.close()
conn.close()

示例

下面是一个完整的示例,展示了如何使用Python进行SQLite数据库操作:

python 复制代码
import sqlite3
def main():
    # 连接SQLite数据库
    conn = sqlite3.connect('example.db')
    cursor = conn.cursor()
    # 创建表
    cursor.execute('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)')
    conn.commit()
    # 插入数据
    cursor.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('Alice', 30))
    cursor.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('Bob', 25))
    conn.commit()
    # 查询数据

    cursor.execute('SELECT * FROM users WHERE age > ?', (25,))
    rows = cursor.fetchall()
    for row in rows:
        print(row)
    # 更新数据
    cursor.execute('UPDATE users SET age = ? WHERE name = ?', (31, 'Alice'))
    conn.commit()
    # 删除数据
    cursor.execute('DELETE FROM users WHERE name = ?', ('Bob',))
    conn.commit()
    # 关闭数据库连接
    cursor.close()
    conn.close()
if __name__ == '__main__':
    main()

在这个例子中,我们展示了如何使用Python进行SQLite数据库的连接、表创建、数据插入、查询、更新和删除操作。这些技能对于与数据库交互的应用程序至关重要。


5.6 源码打包

源码打包是将Python项目打包成一个可分发和可安装的格式,以便于其他用户能够轻松地安装和使用你的项目。Python中常用的打包格式有wheelsdistwheel是一种更高效的打包格式,而sdist则是源码打包的通用格式。

使用setuptools进行源码打包

setuptools是一个Python库,它提供了一套命令行工具和Python代码,用于创建和分发Python包。你可以使用setuptools来创建wheelsdist格式的源码包。

安装setuptools

如果你还没有安装setuptools,可以使用pip进行安装。

bash 复制代码
pip install setuptools
创建setup.py文件

创建一个名为setup.py的文件,该文件将包含你的包的元数据和打包命令。

python 复制代码
from setuptools import setup, find_packages
setup(
    name='my_package',
    version='1.0',
    description='这是一个示例包',
    author='Your Name',
    author_email='your_email@example.com',
    url='https://example.com',
    packages=find_packages(),
    # 你可以添加其他需要的信息,如安装需求等
)
打包源码

setup.py文件所在的目录中,运行以下命令来创建sdistwheel格式的源码包。

bash 复制代码
python setup.py sdist bdist_wheel

这个命令会生成一个.tar.gz文件(sdist格式)和一个.whl文件(wheel格式)。

安装打包的包

你可以使用pip来安装这些打包好的包。

bash 复制代码
pip install my_package-1.0.tar.gz

或者

bash 复制代码
pip install my_package-1.0-py3-none-any.whl

使用wheel进行源码打包

wheel是一个用于创建、分发和安装Python包的命令行工具。你可以使用wheel来创建wheel格式的源码包。

安装wheel

如果你还没有安装wheel,可以使用pip进行安装。

bash 复制代码
pip install wheel
创建setup.py文件

创建一个名为setup.py的文件,该文件将包含你的包的元数据和打包命令。

python 复制代码
from setuptools import setup, find_packages
setup(
    name='my_package',
    version='1.0',
    description='这是一个示例包',
    author='Your Name',
    author_email='your_email@example.com',
    url='https://example.com',
    packages=find_packages(),
    # 你可以添加其他需要的信息,如安装需求等
)
打包源码

setup.py文件所在的目录中,运行以下命令来创建wheel格式的源码包。

bash 复制代码
python setup.py bdist_wheel

这个命令会生成一个.whl文件(wheel格式)。

安装打包的包

你可以使用pip来安装这个打包好的包。

bash 复制代码
pip install my_package-1.0-py3-none-any.whl

示例

下面是一个完整的示例,展示了如何使用setuptoolswheel进行源码打包:

bash 复制代码
# 创建一个名为 setup.py 的文件
from setuptools import setup, find_packages
setup(
    name='my_package',
    version='1.0',
    description='这是一个示例包',
    author='Your Name',
    author_email='your_email@example.com',
    url='https://example.com',
    packages=find_packages(),
    # 你可以添加其他需要的信息,如安装需求等
)
bash 复制代码
# 在 setup.py 文件所在的目录中,使用 setuptools 创建 sdist 和wheel 格式的源码包。
python setup.py sdist bdist_wheel

这个命令会生成一个.tar.gz文件(sdist格式)和一个.whl文件(wheel格式)。

安装打包的包

你可以使用pip来安装这些打包好的包。

bash 复制代码
pip install my_package-1.0.tar.gz

或者

bash 复制代码
pip install my_package-1.0-py3-none-any.whl

使用twine进行源码打包

twine是一个专门用于上传Python包到PyPI(Python包索引)的命令行工具。它依赖于setuptoolswheel,因此你需要在安装twine之前确保已经安装了这两个工具。

安装twine

如果你还没有安装twine,可以使用pip进行安装。

bash 复制代码
pip install twine
打包源码

setup.py文件所在的目录中,运行以下命令来创建wheel格式的源码包。

bash 复制代码
python setup.py bdist_wheel

这个命令会生成一个.whl文件(wheel格式)。

上传到PyPI

使用twine来上传打包好的包到PyPI。

bash 复制代码
twine upload dist/*

这将使用dist目录中的所有文件上传到PyPI。确保在执行此命令之前,你已经设置了PyPI的凭据,并且你的包满足PyPI的命名规范和上传要求。

示例

下面是一个完整的示例,展示了如何使用twine进行源码打包并上传到PyPI:

bash 复制代码
# 创建一个名为 setup.py 的文件
from setuptools import setup, find_packages
setup(
    name='my_package',
    version='1.0',
    description='这是一个示例包',
    author='Your Name',
    author_email='your_email@example.com',
    url='https://example.com',
    packages=find_packages(),
    # 你可以添加其他需要的信息,如安装需求等
)
bash 复制代码
# 在 setup.py 文件所在的目录中,使用 setuptools 创建 wheel 格式的源码包。
python setup.py bdist_wheel
bash 复制代码
# 使用 twine 上传到 PyPI
twine upload dist/*

请注意,上传到PyPI之前,你需要有一个有效的PyPI账户,并设置好你的账户凭据。你可以在命令行中使用twine upload命令来上传包,或者在命令行中使用twine upload --repository-url <repository-url>命令来上传包到其他包索引。


在Python中,网络编程是一项重要的技能,它允许你的程序通过网络与其他程序进行通信。Python的标准库中提供了多个模块来支持网络编程,包括sockethttp.clienturllib等。以下是一些基本的网络编程概念和示例。

5.7 网络编程

1. socket 编程基础

socket 模块提供了标准的BSD Sockets API。一个socket是网络通信的一个端点,可以看作是不同计算机进程之间的数据通道。

  • TCP客户端
python 复制代码
import socket
# 创建一个socket对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接到服务器
s.connect(('www.example.com', 80))
# 发送数据
s.sendall(b'GET / HTTP/1.1\r\nHost: www.example.com\r\n\r\n')
# 接收数据
data = s.recv(1024)
print(data)
# 关闭连接
s.close()
  • TCP服务器
python 复制代码
import socket
# 创建一个socket对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址和端口
s.bind(('0.0.0.0', 8080))
# 监听连接
s.listen(1)
# 接受连接
conn, addr = s.accept()
print('Connected by', addr)
# 接收数据
while True:
    data = conn.recv(1024)
    if not data:
        break
    print(data)
# 关闭连接
conn.close()
2. HTTP 客户端请求

http.client 模块提供了HTTP协议的客户端实现。

python 复制代码
import http.client
# 创建一个连接
conn = http.client.HTTPSConnection("www.example.com")
# 发送GET请求
conn.request("GET", "/")
# 获取响应
r1 = conn.getresponse()
# 打印响应状态和响应体
print(r1.status, r1.reason)
print(r1.read().decode('utf-8'))
# 关闭连接
conn.close()
3. 使用 requests 模块

requests 是一个更高级、更友好的HTTP客户端库,它简化了发送HTTP请求的过程。

python 复制代码
import requests
# 发送GET请求
response = requests.get('https://www.example.com')
# 检查响应状态码
if response.status_code == 200:
    print(response.text)
else:
    print('Failed to retrieve data:', response.status_code)
4. urllib 使用

urllib 是一个用于读取来自Web的数据的模块。

python 复制代码
from urllib.request import urlopen
# 打开一个URL
with urlopen('https://www.example.com') as response:
    # 读取网页内容
    html = response.read()
print(html.decode('utf-8'))

网络编程是Python应用中非常广泛的一部分,可以用于开发各种网络应用,包括网站、网络服务、分布式系统等。在实际开发中,理解网络协议、网络模型以及如何使用Python进行网络通信是非常重要的。


在Python中,发送邮件是一个常见的任务,通常用于自动化报告、提醒通知或作为服务的一部分。Python的smtp库可以用来发送邮件。以下是一个使用smtp库发送邮件的基本示例。

5.8 发送邮件

使用SMTP发送邮件
python 复制代码
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
# 邮件发送者
sender = 'from@example.com'
# 邮件接收者
receiver = 'to@example.com'
# 邮件主题
subject = 'Python SMTP 邮件测试'
# 邮件正文
body = '这是一封来自Python脚本的测试邮件。'
# 创建一个带附件的实例
message = MIMEMultipart()
message['From'] = Header("发件人", 'utf-8')
message['To'] = Header("收件人", 'utf-8')
message['Subject'] = Header(subject, 'utf-8')
# 邮件正文内容
message.attach(MIMEText(body, 'plain', 'utf-8'))
# 添加附件(可选)
with open('附件.txt', 'r', encoding='utf-8') as f:
    att = MIMEText(f.read(), 'base64', 'utf-8')
    att["Content-Type"] = 'application/octet-stream'
    # 这里的filename可以任意写,写什么名字,邮件中显示什么名字
    att["Content-Disposition"] = 'attachment; filename="附件.txt"'
    message.attach(att)
# SMTP服务器地址
smtp_server = 'smtp.example.com'
# 发送者邮箱用户名和密码
username = 'your_username'
password = 'your_password'
# 连接SMTP服务器
server = smtplib.SMTP(smtp_server, 25)
server.starttls()
server.login(username, password)
# 发送邮件
server.sendmail(sender, receiver, message.as_string())
# 关闭服务器连接
server.quit()

在上面的代码中,你需要将senderreceiversmtp_serverusernamepassword替换为实际的发送者邮箱、接收者邮箱、SMTP服务器地址以及发送者邮箱的用户名和密码。如果SMTP服务器使用的是SSL加密(例如Gmail的SMTP服务器),则端口通常是465,并且需要使用smtplib.SMTP_SSL来连接服务器。

请注意,出于安全考虑,不要在代码中硬编码密码。可以使用环境变量或其他安全的方式来管理敏感信息。

发送邮件是一个涉及网络通信的过程,因此需要确保网络连接畅通,并且邮箱服务器配置正确。在实际应用中,可能还需要处理各种异常情况,例如网络错误、认证失败等。

相关推荐
IT古董1 分钟前
【机器学习】机器学习的基本分类-强化学习-模型预测控制(MPC:Model Predictive Control)
人工智能·机器学习·分类
bohu833 分钟前
sentinel学习笔记7-熔断降级
笔记·sentinel·熔断降级·degradeslot·circuitbreaker
地中海~6 分钟前
Certifying LLM Safety against Adversarial Prompting
人工智能·笔记·language model·攻防
喝醉酒的小白10 分钟前
PostgreSQL: 事务年龄
数据库·postgresql
yzcxymz10 分钟前
关于python中的类属性和实例属性
python
码到成龚13 分钟前
SQL server学习10-数据库编程(中)
数据库·学习
wlyang66613 分钟前
1. SQL常见笔试题目
数据库·sql
smilejingwei17 分钟前
SQL,生成指定时间间隔内的事件次序号
数据库·sql·spl·esprocspl
╰つ゛木槿24 分钟前
深入了解 React:从入门到高级应用
前端·react.js·前端框架