python-3.x - 循环期间保存 Excel 时权限被拒绝错误
问题描述
我正在为一个项目构建一个小型 Google Geocode API 应用程序。我读入一个长/纬度组合的 excel 文件,然后循环调用 geocode api 以从返回的 json 中获取特定值,然后将其保存到 excel 文件中。为了解决导致我的工作丢失的潜在故障,我在循环期间多次调用 .save()(来自 openpyxl)。
这个过程工作了一段时间,大约 20-200+ 个循环,然后我会在我试图保存到的文件上得到一个权限被拒绝的错误。
这似乎与我看到的其他权限被拒绝问题不匹配,因为我知道我有权限,因为一些保存工作。在出现权限被拒绝错误后,我可以在 Excel 上验证失败前的每次保存是否成功。
我的怀疑是我不完全理解 .save() (也许它在调用频率上有一些限制?)是如何运作的(但没有从帮助我的文档中看到任何东西),并且可能有更好的处理这个过程的方法。感谢您的任何建议!
下面的代码:
import urllib
import requests
import json
import openpyxl
from openpyxl import Workbook
from openpyxl import load_workbook
import time
main_api = 'https://maps.googleapis.com/maps/api/geocode/json?'
api_key = 'plz no steal'
#Load workbook for long/lat
workbook_in = load_workbook("crimexlonglat.xlsx")
rowNum = 625
loopCnt = 1
# #Declare workbook
wb = load_workbook("testxl.xlsx")
#wb = Workbook()
#grab active worksheet. Not sure why this is necessary
ws = wb.active
while (rowNum < 1000):
print('Loop ' + str(loopCnt))
#check for invalid lat/long and skip
if workbook_in['Sheet1']['A'+str(rowNum)].value == '0.00000000,0.00000000' or workbook_in['Sheet1']['A'+str(rowNum)].value == '-1.00000000,-1.00000000':
ws['A'+str(rowNum)] = ''
rowNum = rowNum + 1
loopCnt = loopCnt + 1
wb.save("testxl.xlsx")
else:
address = workbook_in['Sheet1']['A'+str(rowNum)].value
url = main_api + urllib.parse.urlencode({'address': address, 'key': api_key})
json_data = requests.get(url).json()
#Dump and load seems unncessary. Need to understand this better.
outputJson = json.dumps(json_data)
parsedJson = json.loads(outputJson)
ws['A'+str(rowNum)] = parsedJson['results'][0]['address_components'][2]['long_name']
rowNum = rowNum + 1
loopCnt = loopCnt + 1
wb.save("testxl.xlsx")
time.sleep(1)
wb.save("testxl.xlsx")
错误文字:
Traceback (most recent call last):
File "c:\Users\johnsonm\.vscode\extensions\ms-python.python-2019.9.34911\pythonFiles\ptvsd_launcher.py", line 43, in <module>
main(ptvsdArgs)
File "c:\Users\johnsonm\.vscode\extensions\ms-python.python-2019.9.34911\pythonFiles\lib\python\ptvsd\__main__.py", line 432, in main
run()
File "c:\Users\johnsonm\.vscode\extensions\ms-python.python-2019.9.34911\pythonFiles\lib\python\ptvsd\__main__.py", line 316, in run_file
runpy.run_path(target, run_name='__main__')
File "C:\Users\johnsonm\AppData\Local\Programs\Python\Python37-32\lib\runpy.py", line 263, in run_path
pkg_name=pkg_name, script_name=fname)
File "C:\Users\johnsonm\AppData\Local\Programs\Python\Python37-32\lib\runpy.py", line 96, in _run_module_code
mod_name, mod_spec, pkg_name, script_name)
File "C:\Users\johnsonm\AppData\Local\Programs\Python\Python37-32\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "c:\Users\johnsonm\OneDrive - XXX\Documents\Python Learning\API Projects\Test.py", line 44, in <module>
wb.save("testxl.xlsx")
File "C:\Users\johnsonm\AppData\Local\Programs\Python\Python37-32\lib\site-packages\openpyxl\workbook\workbook.py", line 409, in save
save_workbook(self, filename)
File "C:\Users\johnsonm\AppData\Local\Programs\Python\Python37-32\lib\site-packages\openpyxl\writer\excel.py", line 292, in save_workbook
archive = ZipFile(filename, 'w', ZIP_DEFLATED, allowZip64=True)
File "C:\Users\johnsonm\AppData\Local\Programs\Python\Python37-32\lib\zipfile.py", line 1204, in __init__
self.fp = io.open(file, filemode)
PermissionError: [Errno 13] Permission denied: 'testxl.xlsx'
解决方案
首先尝试运行一个最小的示例来解决问题所在。尝试运行这个:
import openpyxl
from openpyxl import Workbook
from openpyxl import load_workbook
import time
# #Declare workbook
wb = Workbook()
# grab active worksheet. Not sure why this is necessary
ws = wb.active
for rowNum in range(1000):
print('Loop ' + str(rowNum))
ws.append(['Some text', 42])
wb.save("testxl2.xlsx")
# time.sleep(1)
推荐阅读
- java - 视图可见性的空对象引用
- javascript - Bootstrap 轮播显示项目滑出但不滑入
- javascript - HTML - 锚链接平滑滚动不滚动到正确的部分
- android - 使回收视图在任一方向水平滚动
- java - 在嵌套对象 Firestore Android 中添加新字段
- java - Spring Boot 测试 - 没有可用的“com.example.MyService”类型的合格 bean
- git - 在自己的服务器上推送到 git 时出错
- charts - 如何向我的 Google 表格堆叠条形图添加第二个条形标签?
- scala - 在 DataFrame 中选择 Array 的最后一个元素
- java - JavaCV FFmpegFrameRecorder 将图像保存到视频