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='[email protected]',
    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='[email protected]',
    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='[email protected]',
    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='[email protected]',
    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 = '[email protected]'
# 邮件接收者
receiver = '[email protected]'
# 邮件主题
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来连接服务器。

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

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

相关推荐
腾讯TNTWeb前端团队5 小时前
helux v5 发布了,像pinia一样优雅地管理你的react状态吧
前端·javascript·react.js
范文杰9 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪9 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪9 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy10 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom10 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom10 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom10 小时前
React与Next.js:基础知识及应用场景
前端·面试·github
uhakadotcom11 小时前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom11 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试