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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 03:39:10