PermissionError: [Errno 13] Permission denied: {filename}
最糟的方法,每次 excel 存盘关文件。python 读完,再打开 excel。
直接在资源管理器复制粘贴该文件,生成副本。python 访问副本,可以。但是这个方法很麻烦。
尝试用 python 做创建副本的操作,失败,同样提示文件被占用。
远程访问该文件,未提示权限问题,但需要远程电脑开个 api 做创建副本的操作,也有点繁琐。
这个可能涉及 windows 的基础知识,刚好是我的盲区。想知道为什么资源管理器可以复制,但 python 复制就会提示被占用?
有没有办法更方便地在 excel 不关闭文件的情况下,让 python 读取到该文件的内容。比如 pandas 有没有只读参数啥的?
同理,如果是只读操作,那 python 在复制该文件时,也会被提示占用?复制文件我用的 shutil.copy,是不是它同时还会复制某些属性,导致了问题?
file = 'D:\\test.xlsx'
out = 'D:\\test_copy.xlsx'
with open(file, 'rb') as f:
data = f.read()
with open(out, 'wb') as f:
f.write(data)
os.system(f'copy "{file}" "{out}"')
搜到一篇文章(不让我贴链接,标题如下。)
~$ versions of files appearing in onedrive folder (viewed - Microsoft Community
受到启发之后,直接修改了Onedrive的设置。(这里不要勾选。我之前勾了。)
然后excel编辑文件时,所谓的 ~$ Owner File 出现了。于是各种读写也都通过了。
感谢各位给出建议,和帮助我一步步找到答案的朋友们。
1
aec4d 2020-03-16 16:54:35 +08:00
|
2
ysc3839 2020-03-16 16:57:51 +08:00
1. 你复制的代码是怎样的?
2. 也许用文件映射是可以读到的?试试用记事本打开这个文件,看看能不能读出里面的内容? |
3
ysc3839 2020-03-16 17:03:20 +08:00
刚刚在本地测试了一下,是可以正常读取的。
测试代码: with open("Book1.xls", 'rb') as f: print(f.read(2)) |
4
superrichman 2020-03-16 17:05:32 +08:00
如果只是表格的话,可以改成 markdown 格式的表格,python 读写都方便,要编辑随便找个 markdown 编辑器就能改。
数据多的话,存到数据库里,找个数据库 gui 工具操作。 |
5
augustheart 2020-03-16 17:05:59 +08:00
FILE_SHARE_READ ,FILE_SHARE_WRITE
正常情况是不会允许 FILE_SHARE_WRITE 的,这和线程安全同理。 |
6
minami 2020-03-16 17:22:06 +08:00
用 copyfile,或者调 console 命令行
|
7
JCZ2MkKb5S8ZX9pq OP @ysc3839 你倒提醒我了 直接 rb 然后再写个新文件也许可以
|
8
krixaar 2020-03-16 17:51:14 +08:00
是否可以考虑用 Access,或者 Excel 连接 Access,然后 Python 从 Access 获得数据?
|
9
JCZ2MkKb5S8ZX9pq OP |
10
JCZ2MkKb5S8ZX9pq OP |
11
ysc3839 2020-03-16 19:08:00 +08:00
@JCZ2MkKb5S8ZX9pq 是打开状态。
|
12
ysc3839 2020-03-16 19:09:17 +08:00
@JCZ2MkKb5S8ZX9pq Excel 版本是 2002 (Build 12527.20278)
|
13
binsys 2020-03-16 19:14:52 +08:00
告诉你方案吧,不要对文件动脑筋了,那个没用。Office 系列都有自动化 API,直接用 COM 相关 API 可以操纵 Office 套装内的软件包括 Excel。Python 支持 Windows 的 COM 操作,直接调用就完了。
https://adndevblog.typepad.com/autocad/2013/12/accessing-com-applications-from-the-running-object-table.html https://stackoverflow.com/questions/22842023/accessing-excel-application-objects-of-other-excel-instances-in-running-object-t COM 可以跨语言,找个 Python 的 COM 库吧 |
14
LokiSharp 2020-03-16 19:22:48 +08:00
用 C# 绑定个 API 处理一下,或者直接 COM 操作
|
15
JCZ2MkKb5S8ZX9pq OP @ysc3839
我测了下,发现可能和 Onedrive 有关。 我在 D 盘根目录测试,rb 或者调系统 copy 都可以。 但是如果放到 Onedrive 下的任一目录,就会发生 permission error。 |
16
JCZ2MkKb5S8ZX9pq OP |