如何通过SMBConnection读取NAS中xlsx文件并导入Pandas DataFrame?
解决SMB读取xlsx文件到Pandas DataFrame的问题
问题原因
你用tempfile.NamedTemporaryFile失败的常见原因:
- 文件写入后指针停在末尾,Pandas读取时无法获取内容
- 临时文件默认模式可能不兼容二进制写入操作
方案一:用BytesIO直接读取(推荐,无需磁盘临时文件)
直接用内存缓冲区接收SMB文件内容,跳过磁盘写入步骤,效率更高:
from smb.SMBConnection import SMBConnection import pandas as pd from io import BytesIO # 建立SMB连接(参数保持你原有的正确配置) conn = SMBConnection('username', 'password', 'client_name', 'server_name') conn.connect('10.111.111.111') # 用BytesIO存储文件内容 file_buffer = BytesIO() # 第一个参数是共享文件夹名,第二个是文件在共享内的路径 conn.retrieveFile('shared_folder_name', 'path/data.xlsx', file_buffer) # 重置缓冲区指针到文件开头,否则Pandas读不到内容 file_buffer.seek(0) # 读取为DataFrame df = pd.read_excel(file_buffer) # 关闭连接 conn.close()
方案二:修复临时文件的使用方式
如果必须使用磁盘临时文件,需调整文件模式并重置指针:
from smb.SMBConnection import SMBConnection import tempfile import pandas as pd import os conn = SMBConnection('username', 'password', 'client_name', 'server_name') conn.connect('10.111.111.111') # 创建可读写的二进制临时文件,设置delete=False避免自动删除 with tempfile.NamedTemporaryFile(mode='w+b', delete=False) as temp_file: # 写入SMB文件内容 conn.retrieveFile('shared_folder_name', 'path/data.xlsx', temp_file) # 重置指针到文件开头 temp_file.seek(0) # 读取为DataFrame df = pd.read_excel(temp_file) # 手动删除临时文件 os.unlink(temp_file.name) conn.close()
注意事项
- 确认
shared_folder_name和文件路径与你listPath时使用的一致 - 检查账号对目标xlsx文件有读取权限
- 大文件建议用临时文件方案,避免内存占用过高
内容的提问来源于stack exchange,提问作者mathilde
相关产品推荐
相关产品推荐

