如何在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
相关产品推荐
相关产品推荐

