You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中不依赖第三方包为CSV文件设置密码保护?

无第三方模块实现CSV密码保护及原理说明

一、用Python标准库实现加密保护(无需第三方模块)

CSV文件本身没有原生加密机制,要在不依赖第三方模块的前提下实现密码保护,最直接的方式是用Python标准库的zipfile将CSV文件加密压缩。以下是修改后的完整脚本:

修改后的脚本

import csv
import os
import psycopg2
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from os.path import basename
import zipfile

# File path and name.
def create_send():
    filePath = '/my/documents/'
    fileName = 'data.csv'
    zipFileName = 'data_encrypted.zip'
    password = b'your_secure_password'  # zipfile仅支持字节类型密码
    
    try:
        # Connect to database.
        connect = psycopg2.connect(host='localhost', database='postgres',
                                   user='postgres', password='postgres', port='5432')
    except psycopg2.DatabaseError as e:
        print("Database connection unsuccessful.")
        quit()

    cursor = connect.cursor()
    sqlSelect = "SELECT * FROM employees"

    try:
        cursor.execute(sqlSelect)
        results = cursor.fetchall()
        headers = [i[0] for i in cursor.description]
        
        csvFilePath = os.path.join(filePath, fileName)
        with open(csvFilePath, 'w', newline='') as f:
            csvFile = csv.writer(f, delimiter=',', lineterminator='\r\n',
                                 quoting=csv.QUOTE_ALL, escapechar='\\')
            csvFile.writerow(headers)
            csvFile.writerows(results)
        
        print("Data export successful.")
        
        # 加密压缩CSV为ZIP
        zipFilePath = os.path.join(filePath, zipFileName)
        with zipfile.ZipFile(zipFilePath, 'w', zipfile.ZIP_DEFLATED) as zipf:
            zipf.setpassword(password)
            zipf.write(csvFilePath, basename(csvFilePath))
        
        # 可选:删除原明文CSV
        os.remove(csvFilePath)
        print("CSV已加密压缩为ZIP文件")

    except psycopg2.DatabaseError as e:
        print("Data export unsuccessful.")
        quit()
    finally:
        connect.close()
    
    try:
        server = smtplib.SMTP('10.21.130.28', 25)
        
        msg = MIMEMultipart()
        msg['Subject'] = "Test "
        msg['From'] = 'sender@example.com'  # 替换为实际发件人
        msg['To'] = 'recipient@example.com'  # 替换为实际收件人
        
        # 附加加密后的ZIP文件
        with open(zipFilePath, 'rb') as f:
            part = MIMEApplication(f.read(), Name=basename(zipFilePath))
        part['Content-Disposition'] = f'attachment; filename="{basename(zipFilePath)}"'
        msg.attach(part)
        
        html = "Hi, PFA."
        email_body = MIMEText(html, 'html')
        msg.attach(email_body)
        
        server.sendmail(msg['From'], msg['To'], msg.as_string())
        server.quit()
        print("邮件发送成功")
    except Exception as e:
        print("Error : ", str(e))

create_send()

关键修改点

  • 引入标准库zipfile,将生成的CSV加密压缩为ZIP格式
  • 设置ZIP密码时需传入字节类型的密码(用b''包裹)
  • 邮件附件改为发送加密后的ZIP文件,而非原CSV
  • 可选:压缩完成后删除原CSV,避免明文泄露

二、密码保护文件的工作原理

1. 密码存储位置

以ZIP加密为例,密码不会直接存储在文件元数据中。传统ZIP使用PKZIP 2.0加密算法,实际存储的是密码经过哈希运算后的验证值,而非明文密码。当用户输入密码时,程序会用相同的哈希算法计算输入值,与文件中存储的验证值比对,匹配则解密文件。

2. 打开时的密码提示触发逻辑

当系统或软件(如Windows资源管理器、7-Zip等)识别到文件是加密ZIP时,会读取文件头中的加密标识位,自动弹出密码输入框。用户输入密码后,软件执行以下步骤:

  • 用输入的密码生成解密密钥
  • 尝试解密文件头中的验证数据
  • 验证通过则解密并读取文件内容;验证失败则提示密码错误,拒绝访问

内容的提问来源于stack exchange,提问作者Abhi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 13:43:29