关闭打开的 docx 文件
Closing a docx file if it's open
我正在使用 docx 文件 并且为了防止 PermissionError: [Errno 13] Permission denied
错误,我尝试在我的代码中添加 os.close()
但正如我所见,它不接受文件路径,它接受文件描述符作为 parameter.So 我试过了:
file_path = 'my file path'
mydoc = docx.Document()
mydoc.add_paragraph('text')
try:
mydoc.save(file_path)
return
except PermissionError:
fd = os.open(file_path, os.O_WRONLY)
os.close(fd)
mydoc.save(file_path)
return
但是当我 运行 它时,由于错误处理,它通过了第一个 PermissionError
错误,但是当它尝试执行 fd = os.open(file_path, os.O_WRONLY)
时,我得到了同样的错误。那么有没有办法关闭 docx 文件 如果它是打开的?
编辑:
这是完整的回溯
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users326\PycharmProjects\newEksi\main2.py", line 194, in arat
mydoc.save(dosya_yolu)
File "C:\Users326\PycharmProjects\newEksi\venv\lib\site-packages\docx\document.py", line 167, in save
self._part.save(path_or_stream)
File "C:\Users326\PycharmProjects\newEksi\venv\lib\site-packages\docx\parts\document.py", line 111, in save
self.package.save(path_or_stream)
File "C:\Users326\PycharmProjects\newEksi\venv\lib\site-packages\docx\opc\package.py", line 172, in save
PackageWriter.write(pkg_file, self.rels, self.parts)
File "C:\Users326\PycharmProjects\newEksi\venv\lib\site-packages\docx\opc\pkgwriter.py", line 32, in write
phys_writer = PhysPkgWriter(pkg_file)
File "C:\Users326\PycharmProjects\newEksi\venv\lib\site-packages\docx\opc\phys_pkg.py", line 141, in __init__
self._zipf = ZipFile(pkg_file, 'w', compression=ZIP_DEFLATED)
File "C:\Users326\AppData\Local\Programs\Python\Python38-32\lib\zipfile.py", line 1251, in __init__
self.fp = io.open(file, filemode)
PermissionError: [Errno 13] Permission denied: 'C:/Users/17326/Desktop/entries.docx'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users326\AppData\Local\Programs\Python\Python38-32\lib\tkinter\__init__.py", line 1883, in __call__
return self.func(*args)
File "C:\Users326\PycharmProjects\newEksi\main2.py", line 197, in arat
fd = os.open(dosya_yolu, os.O_WRONLY)
PermissionError: [Errno 13] Permission denied: 'C:/Users/17326/Desktop/entries.docx'
python-docx
中没有“打开”文件这样的东西。当您读入文件以使用 document = Document("my-file.docx")
对其进行编辑时,python-docx
会读入文件,仅此而已。是的,它在读入时会打开一瞬间,但不会保持打开状态。 open/close 循环在 Document()
调用 returns 之前结束。
保存文件时相同。当你调用 document.save("my-output-file.docx")
时,文件被打开、写入和关闭,都在 .save()
方法之前 returns.
所以它不像 Word 本身那样,您打开一个文件,处理它一段时间,然后保存并关闭它。您只是将“起始”文件读入内存,对 in-memory 对象进行更改,然后写入 in-memory 表示(几乎总是写入不同的文件)。
评论是对的。查找不允许您在未连接到打开文件的位置写入文件的权限问题,除非您在程序运行时在 Word 或其他软件中打开了相关文件。
python-docx 可以从所谓的类文件对象打开文档。它还可以保存到类似文件的对象。当您想通过网络连接或从数据库获取源文档或目标文档并且不想(或不允许)与文件系统交互时,这会很方便。实际上,这意味着您可以传递打开的文件或 StringIO/BytesIO 流对象来打开或保存文档,如下所示:
f = open('foobar.docx', 'rb')
document = Document(f)
f.close()
# or
with open('foobar.docx', 'rb') as f:
source_stream = StringIO(f.read())
document = Document(source_stream)
source_stream.close()
...
target_stream = StringIO()
document.save(target_stream)
我试图通过显示一些代码来补充其他人的解释。
file_path = 'my file path'
mydoc = docx.Document()
mydoc.add_paragraph('text')
hasError = False
try:
fd = open(file_path)
fd.close()
mydoc.save(file_path)
except PermissionError:
raise Exception("oh no some other process is using the file or you don't have access to the file, try again when the other process has closed the file")
hasError = True
finally:
if not hasError:
mydoc.save(file_path)
return
我正在使用 docx 文件 并且为了防止 PermissionError: [Errno 13] Permission denied
错误,我尝试在我的代码中添加 os.close()
但正如我所见,它不接受文件路径,它接受文件描述符作为 parameter.So 我试过了:
file_path = 'my file path'
mydoc = docx.Document()
mydoc.add_paragraph('text')
try:
mydoc.save(file_path)
return
except PermissionError:
fd = os.open(file_path, os.O_WRONLY)
os.close(fd)
mydoc.save(file_path)
return
但是当我 运行 它时,由于错误处理,它通过了第一个 PermissionError
错误,但是当它尝试执行 fd = os.open(file_path, os.O_WRONLY)
时,我得到了同样的错误。那么有没有办法关闭 docx 文件 如果它是打开的?
编辑:
这是完整的回溯
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users326\PycharmProjects\newEksi\main2.py", line 194, in arat
mydoc.save(dosya_yolu)
File "C:\Users326\PycharmProjects\newEksi\venv\lib\site-packages\docx\document.py", line 167, in save
self._part.save(path_or_stream)
File "C:\Users326\PycharmProjects\newEksi\venv\lib\site-packages\docx\parts\document.py", line 111, in save
self.package.save(path_or_stream)
File "C:\Users326\PycharmProjects\newEksi\venv\lib\site-packages\docx\opc\package.py", line 172, in save
PackageWriter.write(pkg_file, self.rels, self.parts)
File "C:\Users326\PycharmProjects\newEksi\venv\lib\site-packages\docx\opc\pkgwriter.py", line 32, in write
phys_writer = PhysPkgWriter(pkg_file)
File "C:\Users326\PycharmProjects\newEksi\venv\lib\site-packages\docx\opc\phys_pkg.py", line 141, in __init__
self._zipf = ZipFile(pkg_file, 'w', compression=ZIP_DEFLATED)
File "C:\Users326\AppData\Local\Programs\Python\Python38-32\lib\zipfile.py", line 1251, in __init__
self.fp = io.open(file, filemode)
PermissionError: [Errno 13] Permission denied: 'C:/Users/17326/Desktop/entries.docx'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users326\AppData\Local\Programs\Python\Python38-32\lib\tkinter\__init__.py", line 1883, in __call__
return self.func(*args)
File "C:\Users326\PycharmProjects\newEksi\main2.py", line 197, in arat
fd = os.open(dosya_yolu, os.O_WRONLY)
PermissionError: [Errno 13] Permission denied: 'C:/Users/17326/Desktop/entries.docx'
python-docx
中没有“打开”文件这样的东西。当您读入文件以使用 document = Document("my-file.docx")
对其进行编辑时,python-docx
会读入文件,仅此而已。是的,它在读入时会打开一瞬间,但不会保持打开状态。 open/close 循环在 Document()
调用 returns 之前结束。
保存文件时相同。当你调用 document.save("my-output-file.docx")
时,文件被打开、写入和关闭,都在 .save()
方法之前 returns.
所以它不像 Word 本身那样,您打开一个文件,处理它一段时间,然后保存并关闭它。您只是将“起始”文件读入内存,对 in-memory 对象进行更改,然后写入 in-memory 表示(几乎总是写入不同的文件)。
评论是对的。查找不允许您在未连接到打开文件的位置写入文件的权限问题,除非您在程序运行时在 Word 或其他软件中打开了相关文件。
python-docx 可以从所谓的类文件对象打开文档。它还可以保存到类似文件的对象。当您想通过网络连接或从数据库获取源文档或目标文档并且不想(或不允许)与文件系统交互时,这会很方便。实际上,这意味着您可以传递打开的文件或 StringIO/BytesIO 流对象来打开或保存文档,如下所示:
f = open('foobar.docx', 'rb')
document = Document(f)
f.close()
# or
with open('foobar.docx', 'rb') as f:
source_stream = StringIO(f.read())
document = Document(source_stream)
source_stream.close()
...
target_stream = StringIO()
document.save(target_stream)
我试图通过显示一些代码来补充其他人的解释。
file_path = 'my file path'
mydoc = docx.Document()
mydoc.add_paragraph('text')
hasError = False
try:
fd = open(file_path)
fd.close()
mydoc.save(file_path)
except PermissionError:
raise Exception("oh no some other process is using the file or you don't have access to the file, try again when the other process has closed the file")
hasError = True
finally:
if not hasError:
mydoc.save(file_path)
return