Как исправить ошибку «Максимальная глубина рекурсии достигнута» в приведенном ниже коде? - PullRequest
0 голосов
/ 08 февраля 2019

Я написал скрипт на python, который выполняет следующие операции:

  1. Принимает путь к папке в качестве входного файла, который может содержать множество дочерних каталогов с файлами .json в них
  2. Нагрузкифайлы .json из всех папок одну за другой и построчно читайте каждый файл, разбирайте их по ключам, списку значений и записывает в файл Excel.

Этот сценарий отлично работает, когда я запускаю его из командынезамедлительный.Но я хочу поделиться этим с моей командой в виде исполняемого файла, я использовал pyinstaller, чтобы преобразовать его в исполняемый файл.Именно тогда я получаю сообщение об ошибке

RecursionError: превышена максимальная глубина рекурсии

Я обнаружил, что ошибка вызвана хвостовой рекурсией.Я новичок в Python, поэтому мне трудно переписать эту функцию.Пожалуйста, предложите способы переписать эту хвостовую рекурсивную функцию.

import json
import codecs
import itertools
import os
import sys
from time import sleep
from datetime import datetime
import dateutil.parser
from openpyxl import Workbook

def load_json_from_directories(root_path, cur_path, asset_code):
    for filename in os.listdir(cur_path):
        if os.path.isfile(os.path.join(cur_path, filename)):
            if os.path.splitext(filename)[1] == '.json':
                print('Processing...'+filename)
                load_json_line(os.path.join(cur_path, filename), asset_code)
            else:
                print('Not a json file! Skipping...'+filename)
        elif os.path.isdir(os.path.join(cur_path, filename)):
            load_json_from_directories(root_path, os.path.join(cur_path, filename), asset_code)
        else:
            sys.exit("Should never reach here.")

1 Ответ

0 голосов
/ 08 февраля 2019

Вместо того, чтобы делать это вручную, вы можете использовать существующую функциональность:

from pathlib import Path

for json_path in Path('.').glob('**/*.json'):
    # code to handle jsons here
    print(json_path)
...