Ошибка отказа в разрешении при сохранении Excel во время циклов - PullRequest
0 голосов
/ 24 сентября 2019

Я работаю над созданием небольшого приложения Google Geocode API для проекта.Я читаю в файле excel комбинаций long / lat, затем зацикливаюсь, вызывая 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'

1 Ответ

0 голосов
/ 24 сентября 2019

Попробуйте сначала выполнить минимальный пример, чтобы выяснить, в чем проблема.Попробуйте запустить это:

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)
...