Python NFC数据采集与Excel自动化存储实战教程

📅 2026/7/28 9:19:15
Python NFC数据采集与Excel自动化存储实战教程
1. 项目概述当NFC遇见Excel用Python和Mind打造一个信息管理小工具最近在整理一些实体卡片信息比如门禁卡、会员卡每次手动录入到电脑里都挺麻烦的。正好手头有个支持NFC的安卓手机和一堆Python库就琢磨着能不能自己搞个小工具用手机“嘀”一下卡片信息就自动存到电脑的Excel表格里。这个想法听起来简单但真做起来从硬件交互到数据存储中间有不少门道。这个项目我把它叫做“NFC信息录入与Excel存储系统”核心就是用Python作为桥梁连接前端的NFC读取这里我用Mind图形化编程做了个简易的手机端界面和后端的数据存储。对于想入门物联网数据采集或者自动化办公的朋友来说这是个非常不错的练手项目能一次性接触到硬件交互、数据解析、文件操作和简单的GUI设计。2. 核心思路与技术选型解析2.1 为什么选择“Mind Python”的组合这个项目的核心是解决“移动端采集”与“桌面端存储”的联动问题。我选择Mind和Python的组合主要是基于快速原型开发和功能解耦的考虑。Mind的角色它是一个对初学者非常友好的图形化编程软件支持Python模式。我主要用它来快速构建运行在安卓手机上的NFC读取客户端。它的优势在于通过拖拽积木块可以免去直接编写复杂安卓原生代码的麻烦快速实现调用手机NFC硬件、读取卡片IDUID或NDEF文本信息的功能。Mind生成的实际上是一个用Kivy等框架打包的Python应用可以在安卓上运行。这相当于我们用Python写了一个具有简单图形界面的手机App专门负责“读卡”。Python的角色这是整个项目的大脑和数据处理中心。它负责两件事一是与Mind客户端进行通信比如通过Socket网络通信或HTTP接口接收从手机端发来的NFC数据二是将接收到的数据按照预设的格式如卡号、读取时间、备注信息写入到本地的Excel文件中。Python生态里处理Excel的库非常成熟比如xlwt写xls、openpyxl读写xlsx、pandas数据分析选择很多。这样拆解的好处将采集端手机和数据处理端电脑分离。手机只负责读卡和发送数据电脑上的Python脚本负责接收和存储。这种架构清晰也便于后期扩展比如可以更换其他采集设备如USB NFC读卡器或者将数据存储改为数据库而不用大改采集端的代码。2.2 NFC数据读取的层次与选择NFC卡片类型很多常见的有Mifare Classic、Mifare Ultralight、NTAG等。不同卡片存储的数据结构和安全级别不同。对于这个入门项目我们的目标不是进行复杂的卡片数据读写或破解而是实现一个通用的信息录入。因此读取策略上我建议分两个层次读取卡片唯一标识符UID这是每张NFC卡片的“身份证号”是全球唯一的。读取UID不需要密钥验证兼容性最好几乎所有类型的NFC卡片都能读到。我们可以用UID来区分不同的卡片。在Mind中这通常对应“读取NFC标签ID”之类的积木块。尝试读取NDEF格式的文本信息NDEF是NFC数据交换格式标准。很多门禁卡只存UID但一些智能海报、名片卡会写入NDEF格式的网址或文本。如果我们的应用场景包括读取这类信息那么可以在Mind中增加“读取NFC文本记录”的逻辑。但要注意读取NDEF信息可能需要卡片本身支持且已格式化。实际操作中的策略我会在Mind程序中先尝试读取NDEF文本如果读不到比如卡片不是NDEF格式或为空则降级为读取UID。这样既能处理信息丰富的卡片也能兼容最普通的门禁卡。2.3 Excel库选型为何是xlwt网络热词里提到了xlwt这是一个专门用于写入旧版Excel.xls格式文件的库。对于这个项目选择它有几个现实的考虑简单直接xlwt的API非常直观创建 workbook - 添加 sheet - 在指定单元格row, col写入数据 - 保存文件。几行代码就能完成核心功能学习成本低。轻量级项目目标只是存储录入的信息卡号、时间、备注不涉及复杂的公式、图表、样式。xlwt完全够用无需引入更庞大的pandas或功能全面的openpyxl。兼容性生成的.xls文件可以被几乎所有版本的Microsoft Excel、WPS Office以及在线表格工具打开确保数据的可访问性。当然xlwt的局限是只能写.xls不能写.xlsx且单个sheet最多支持65536行。对于这个信息录入工具这个容量上限在绝大多数情况下都是绰绰有余的。如果未来数据量激增可以平滑迁移到openpyxl库。3. 环境准备与依赖安装3.1 电脑端Python数据处理中心环境搭建电脑端需要安装Python和必要的库。我强烈建议使用Python 3.6及以上版本。安装Python从Python官网下载安装包。安装时务必勾选“Add Python to PATH”这样可以在命令行中直接使用python和pip命令。安装完成后打开命令行CMD或PowerShell输入python --version能显示版本号即表示成功。安装xlwt库在命令行中执行以下命令即可。pip install xlwt如果下载速度慢可以使用国内镜像源例如pip install xlwt -i https://pypi.tuna.tsinghua.edu.cn/simple代码编辑器选择任何文本编辑器都可以但使用VS Code或PyCharm这类集成开发环境IDE体验会更好。它们提供代码高亮、智能提示和调试功能。网络热词中也提到了相关配置其实很简单安装Python扩展如VS Code的Python扩展后编辑器通常能自动识别Python解释器。3.2 手机端Mind NFC读取端环境准备安装Mind访问Mind官网下载对应操作系统的版本Windows/macOS并安装。切换为Python模式打开Mind在左上角将编程模式从“图形化”切换为“Python”。这个模式下我们既可以使用积木块也可以直接查看和编辑生成的Python代码。准备安卓手机确保手机支持NFC功能现在中高端机型基本都支持。在手机设置中打开NFC开关。连接手机调试Mind支持通过Wi-Fi或USB连接手机进行实时调试。这需要先在手机上安装一个叫“Mind”的助手AppMind官网提供下载。连接成功后就可以将写好的程序“上传”到手机运行。注意Mind的Python模式本质是将Python代码与Kivy等GUI框架打包成APK。在开发阶段我们通过连接手机进行实时调试和运行这比反复打包APK要高效得多。4. Mind手机端程序开发详解4.1 界面设计与积木逻辑我们的手机端程序需要一个非常简单的界面一个显示读取结果的文本框Label或许再加一个“开始读取”的按钮。但在NFC读取场景下更常见的交互是“靠近即读”所以我们完全可以不用按钮程序启动后自动监听NFC事件。在Mind的“Python模式”下我们从左侧的“扩展”模块中添加“NFC”支持。然后主要使用以下两个积木“当NFC标签被发现时”这是一个事件触发器积木。当手机检测到附近有NFC卡片时自动执行其内部的代码块。“读取NFC标签的ID” / “读取NFC文本记录”放在上述事件触发器内部的积木用于执行具体的读取操作。我的程序逻辑流程图如下文字描述程序启动 - 初始化NFC监听 - 用户将卡片贴近手机 - 触发“标签被发现”事件 - 尝试读取NDEF文本 - 如果成功则将文本内容作为“卡信息”如果失败则读取标签UID作为“卡信息” - 将“卡信息”显示在手机屏幕上同时通过网络发送给电脑端的Python服务。4.2 关键代码与网络通信实现Mind积木背后会生成Python代码。理解这部分代码对调试和进阶学习很有帮助。核心是处理NFC事件和建立网络通信。NFC读取部分伪代码思路# 这是一个基于Mind生成代码的逻辑示意非直接可运行代码 def on_nfc_tag_discovered(tag): # tag是发现的标签对象 try: # 尝试作为NDEF标签读取文本信息 ndef_record tag.get_ndef_message().get_records()[0] card_info ndef_record.text # 获取文本内容 info_type NDEF_TEXT except: # 如果读取NDEF失败则读取UID card_info tag.get_uid().hex() # 获取16进制字符串格式的UID info_type UID current_time time.strftime(%Y-%m-%d %H:%M:%S) # 在手机界面显示 display_label.text f类型{info_type}\n信息{card_info}\n时间{current_time} # 调用函数将数据发送到电脑 send_data_to_pc(card_info, info_type, current_time)网络通信实现为了让手机和电脑上的Python程序对话我们需要选择一个通信协议。对于这种小工具使用TCP Socket是最简单直接的方式。电脑端运行一个TCP服务器Server绑定一个IP如本机127.0.0.1和端口如12345并持续监听。手机端作为客户端Client在读取到NFC信息后连接到电脑的IP和端口将数据拼接成一条字符串例如用逗号分隔卡信息,类型,时间发送过去。在Mind中可以使用“网络”类别下的“连接TCP服务器”和“发送数据”积木来实现客户端功能。这里有个关键点电脑和手机需要在同一个局域网Wi-Fi下。你需要知道电脑在局域网内的IP地址在命令行输入ipconfig查看并在Mind程序中填写这个IP和约定的端口号。实操心得在调试网络通信时务必先关闭电脑的防火墙或者为你的Python程序在防火墙中创建允许规则否则连接会被阻断。可以先在电脑上写一个简单的测试客户端和服务端脚本确保通路正常再集成到Mind项目中。5. 电脑端Python服务与Excel写入核心实现5.1 构建TCP服务器接收数据电脑端的Python脚本首要任务是作为一个稳定的服务器等待手机连接并接收数据。这里使用Python标准库socket和threading来处理多客户端连接虽然通常只有一个手机连接但好的架构要考虑扩展性。import socket import threading import time from datetime import datetime def start_tcp_server(host0.0.0.0, port12345): 启动TCP服务器 server_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 设置端口复用避免重启时“Address already in use”错误 server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server_socket.bind((host, port)) server_socket.listen(5) # 允许最多5个等待连接 print(f[*] NFC数据接收服务器已启动监听 {host}:{port}) while True: client_socket, client_addr server_socket.accept() print(f[] 接收到来自 {client_addr} 的连接) # 为每个客户端连接创建一个新线程处理避免阻塞 client_thread threading.Thread(targethandle_client, args(client_socket, client_addr)) client_thread.start() def handle_client(client_socket, client_addr): 处理单个客户端连接 try: data client_socket.recv(1024).decode(utf-8) # 接收数据假设是UTF-8编码 if data: print(f[*] 来自 {client_addr} 的原始数据: {data}) # 解析数据假设格式为“卡信息,类型,时间” parts data.strip().split(,) if len(parts) 3: card_info, info_type, read_time parts[0], parts[1], parts[2] # 调用Excel写入函数 save_to_excel(card_info, info_type, read_time) else: print(f[-] 数据格式错误: {data}) except Exception as e: print(f[-] 处理客户端 {client_addr} 时出错: {e}) finally: client_socket.close()5.2 使用xlwt库写入Excel文件接下来是核心的数据存储部分。我们需要创建一个Excel文件并在其中按行追加每次读取到的NFC信息。import xlwt import os # 全局定义文件名和表头 EXCEL_FILE nfc_records.xls SHEET_NAME NFC记录 def init_excel_file(): 初始化Excel文件如果文件不存在则创建并写入表头 if not os.path.exists(EXCEL_FILE): workbook xlwt.Workbook(encodingutf-8) sheet workbook.add_sheet(SHEET_NAME) # 定义表头样式可选加粗 header_style xlwt.easyxf(font: bold on) headers [序号, 卡信息, 信息类型, 读取时间, 录入时间, 备注] for col, header in enumerate(headers): sheet.write(0, col, header, header_style) # 设置列宽可选 sheet.col(0).width 256 * 8 # 序号列 sheet.col(1).width 256 * 30 # 卡信息列 sheet.col(2).width 256 * 15 # 类型列 sheet.col(3).width 256 * 20 # 读取时间列 sheet.col(4).width 256 * 20 # 录入时间列 sheet.col(5).width 256 * 30 # 备注列 workbook.save(EXCEL_FILE) print(f[*] 已创建新的Excel文件: {EXCEL_FILE}) def save_to_excel(card_info, info_type, read_time): 将一条NFC记录追加到Excel文件中 init_excel_file() # 确保文件存在 # 1. 打开现有工作簿xlwt不能直接修改需要先读取再写入这里用xlrd读xlwt写 # 为了简化我们采用“读取-追加-保存”的方式。对于轻量级操作可以接受。 # 注意xlwt不能直接打开现有文件修改以下是一个通用处理模式 import xlrd from xlutils.copy import copy # 需要安装 xlutils: pip install xlutils # 打开现有文件读取 rb xlrd.open_workbook(EXCEL_FILE, formatting_infoTrue) # 获取行数 r_sheet rb.sheet_by_index(0) last_row_num r_sheet.nrows # 复制一份用于写入 wb copy(rb) sheet wb.get_sheet(0) # 2. 准备写入的数据 entry_time datetime.now().strftime(%Y-%m-%d %H:%M:%S) row_data [ last_row_num, # 序号接续上一行 card_info, info_type, read_time, # 手机端发送的读取时间 entry_time, # 电脑端接收到数据的时间 # 备注初始为空 ] # 3. 写入新行 for col, value in enumerate(row_data): sheet.write(last_row_num, col, value) # 4. 保存文件 wb.save(EXCEL_FILE) print(f[] 记录已保存: {card_info} ({info_type}))关键点解析这里遇到了xlwt的一个主要限制它不能像openpyxl那样直接加载并修改现有工作簿。我们采用了变通方案使用xlrd读取原文件用xlutils.copy复制出一个可写的副本然后追加数据并保存。虽然多了一步但对于这个场景是稳定可靠的。确保安装了xlrd和xlutils库pip install xlrd xlutils。5.3 主程序整合与运行将服务器和Excel写入功能整合起来并让程序能持续运行。if __name__ __main__: # 初始化Excel文件如果不存在 init_excel_file() print([*] NFC信息录入系统准备就绪...) print([*] 请确保手机与电脑在同一Wi-Fi网络下并启动手机端Mind应用。) # 启动TCP服务器默认监听所有网卡端口12345 start_tcp_server(host0.0.0.0, port12345)运行这个脚本你的电脑就开始监听12345端口了。接下来只要手机端程序成功连接并发送数据信息就会自动记录到nfc_records.xls文件中。6. 系统联调与优化实践6.1 首次连接调试步骤获取电脑IP在电脑命令行输入ipconfigWindows或ifconfigmacOS/Linux找到无线局域网适配器的IPv4地址例如192.168.1.100。配置手机端在Mind程序中将TCP客户端连接的目标地址修改为上一步获取的电脑IP端口设为12345。启动顺序先运行电脑端的Python服务器脚本看到“监听中”的提示后再在手机上运行Mind程序。测试用一张NFC卡片贴近手机。观察手机屏幕是否显示读取到的信息同时观察电脑命令行窗口是否有接收到数据的打印信息并检查nfc_records.xls文件是否新增了一行。6.2 数据格式与错误处理增强在实际使用中网络传输可能不稳定数据格式也可能出错。我们需要增强程序的健壮性。定义通信协议为了更可靠地解析数据可以定义一个简单的协议。例如每条数据以换行符\n结束字段间用特定分隔符如竖线|。手机端发送卡信息|类型|时间\n电脑端按\n分割每条消息再按|分割字段。添加数据校验在handle_client函数中增加更严格的数据格式校验和异常捕获。心跳机制可以让手机端定期发送一个心跳包如HEARTBEAT电脑端收到后回复ACK。这有助于检测连接是否断开并在手机端实现断线重连逻辑。6.3 功能扩展思路基础功能实现后可以考虑以下扩展方向让这个小工具更实用图形化界面GUI使用tkinter、PyQt或DearPyGui为电脑端的服务器程序做一个简单的界面显示连接状态、最新记录甚至提供手动添加备注、导出数据等功能。数据库集成当记录成千上万条后Excel的查询和管理会变慢。可以集成轻量级数据库如SQLite。Python内置sqlite3模块将数据存入数据库后查询、统计都非常方便。数据去重基于卡片的UID在写入前检查是否已存在相同记录避免重复录入。声音/提示音在手机端读取成功或发送成功时播放一个简短的提示音提升用户体验。批量录入模式在手机端增加一个“批量模式”开关开启后连续读卡直到手动关闭期间所有记录自动发送。7. 常见问题与排查实录在实际搭建和运行过程中你几乎一定会遇到下面这些问题。这里我把踩过的坑和解决方法记录下来。7.1 手机无法连接电脑服务器现象Mind程序提示连接失败或超时。排查步骤检查IP和端口确认电脑端脚本中绑定的IP是0.0.0.0监听所有网卡或正确的本机局域网IP端口是否一致。手机端填写的IP必须是电脑的局域网IP不是127.0.0.1。检查防火墙这是最常见的原因。临时关闭电脑的防火墙公共、专用网络都关掉再试。如果连接成功说明是防火墙拦截。需要在防火墙设置中为Python或你使用的终端如python.exe添加入站规则允许TCP端口12345。检查网络确保手机和电脑连接的是同一个Wi-Fi网络。有时如果电脑同时连着网线和Wi-Fi可能导致IP路由混乱尝试禁用其中一个网络适配器。使用网络测试工具在电脑上先用一个简单的Python Socket服务器测试同时用手机上的网络调试助手App如“TCP/UDP调试工具”尝试连接排除Mind程序本身的问题。7.2 NFC卡片读取失败或信息为空现象手机贴近卡片没反应或读取到的UID是空。排查步骤确认手机NFC已开启并确认NFC感应区域通常在手机背部上方。确认卡片类型有些卡片如银行卡、部分门禁卡有安全保护无法被普通APP读取UID。尝试用另一部手机或一个明确的NFC读写工具App测试该卡片。检查Mind NFC扩展权限确保Mind生成的App已被授予NFC权限。可以在手机系统设置的应用权限管理中查看。调整读取距离和位置NFC感应距离很短通常4cm且对位置敏感。慢慢移动卡片找到最佳感应点。7.3 Excel文件被锁定或写入失败现象Python脚本报错提示文件被占用或权限不足。原因与解决文件被打开nfc_records.xls文件正被Excel或WPS打开。写入前必须关闭这些程序。可以在代码中增加一个检查如果文件被占用则等待或提示用户。权限问题确保运行Python脚本的用户对当前目录有读写权限。尽量不要把脚本和Excel文件放在系统保护目录如C:\Program Files下。xlutils兼容性问题如果使用xlutils.copy时出错可能是库版本问题。可以尝试降级xlrd到1.2.0版本因为新版xlrd不再支持xls格式使用命令pip install xlrd1.2.0。7.4 中文乱码问题现象接收到的数据或写入Excel的中文显示为乱码。解决统一编码确保整个数据流使用统一的编码推荐UTF-8。在Socket发送和接收时明确使用encode(utf-8)和decode(utf-8)。xlwt编码设置创建xlwt.Workbook时指定encodingutf-8。检查操作系统区域设置虽然较少见但可以检查一下。这个项目从构思到实现最耗时的部分往往不是编码而是环境调试和异常处理。特别是网络通信和软硬件交互部分需要耐心地一步步排查。当第一次成功听到手机“嘀”的一声看到电脑Excel里自动跳出一行新记录时那种成就感是非常实在的。它不仅仅是一个工具更是一个打通了移动硬件、网络通信和桌面应用的数据管道原型理解了这套流程很多类似的物联网或自动化采集需求你都能触类旁通。