如何用Python复制处于「占用中」状态的网络驱动器文件?
解决网络共享文件被只读占用时的Python访问问题
我太懂这种困扰了——明明其他用户只是只读打开文件,自己的脚本却因为权限/占用错误跑不起来,搜了半天也找不到直接的解决办法。下面针对你的两种需求(读取为DataFrame、复制文件)分别给出可行的方案:
一、读取Excel到DataFrame:以只读引擎打开
默认情况下,pandas的read_excel可能会尝试获取文件的写入权限(尤其是用某些引擎时),导致被其他只读打开的文件拒绝。我们可以指定引擎并开启只读模式:
方案1:使用openpyxl引擎(适合.xlsx文件)
import pandas as pd import glob import os src = r'//network/drive_b/*.xlsx' list_of_files = glob.glob(src) new_file = max(list_of_files, key=os.path.getctime) # 关键:设置engine='openpyxl'并开启read_only=True df = pd.read_excel(new_file, engine='openpyxl', read_only=True) df.loc[:,'status'] = 'Exception' df = df.reset_index(drop=True)
read_only=True会让openpyxl以纯只读方式加载文件,不会请求排他锁,即使文件被其他用户只读打开也能正常读取。
方案2:使用pyxlsb引擎(适合大文件或兼容性问题)
如果openpyxl还是有问题,可以试试pyxlsb引擎,它本身就是以二进制只读方式处理Excel文件:
# 先安装依赖:pip install pyxlsb df = pd.read_excel(new_file, engine='pyxlsb')
二、复制被占用的文件:手动以只读二进制模式读写
shutil.copy2在遇到被其他程序打开的文件时,可能会因为系统级的锁而失败。我们可以手动用二进制只读模式读取源文件,再写入目标文件,绕开这个问题:
import glob import os dst = '//network/drive_a/destination/' src = r'//network/drive_b/*.xlsx' list_of_files = glob.glob(src) new_file = max(list_of_files, key=os.path.getctime) dst_file = os.path.join(dst, os.path.basename(new_file)) # 手动以只读二进制模式复制,分块处理避免大文件内存溢出 with open(new_file, 'rb') as f_src: with open(dst_file, 'wb') as f_dst: while chunk := f_src.read(1024*1024): f_dst.write(chunk)
这种方式直接读取文件的原始字节流,只要源文件允许只读访问(其他用户只是只读打开的话,通常是允许的),就能完成复制。
额外小贴士
- 确保你的网络账户对源文件有只读权限(虽然你说99.9%是只读打开,但权限本身还是要到位);
- 如果是Windows系统,有时候文件被锁定是因为其他用户的Excel开启了“自动保存”,可以提醒同事关闭自动保存(不过这个属于协作问题,不一定可控);
- 对于你开头提到的CSV文件,直接用
pd.read_csv(new_file)通常不会有问题——因为CSV是纯文本文件,默认就是只读读取,除非其他用户以排他模式打开。
内容的提问来源于stack exchange,提问作者Shalzar
相关产品推荐
相关产品推荐

