Имена файлов добавляются при каждом поиске и сохранении их в списке с помощью Google Drive API? - PullRequest
0 голосов
/ 03 февраля 2020

Я использую Google Drive API для поиска внутри папки с именем «Пользователи», а затем сохраняю имена файлов, которые находятся в этой папке в списке. В Django каждый раз, когда я обновляю sh страницу, которая запускает эту функцию Google API, добавляется список имен файлов. Ex. 1-е исполнение

files_in_users = ['1','2','3','4','5']

та же страница обновляется снова

files_in_users = ['1','2','3','4','5','1','2','3','4','5']

И это происходит каждый раз, когда я обновляю sh страницу. Я даже пытался перезагрузить сервер, но в списке всегда есть избыточные данные. Я также использовал функцию list.clear() в конце выполнения. Почему это происходит? Есть ли какой-то кэш, который мне нужно удалять после каждого выполнения?

Код:

#GET ID OF USER FOLDER FROM DRIVE
drive_users_id = get_user_file_id(service)

# GET THE FILES IN USER FOLDER FROM DRIVE
flow_of_users_file = service.files().list(q=" '{0}' in parents ".format(drive_users_id),spaces ='drive').execute()
for i in flow_of_users_file['files']:
    files_in_user_folder.append(i['name'])
    print('files in drive are :', files_in_user_folder)

После печати flow_of_users_file, который имеет тип словаря, я мог видеть, что есть избыточные данные в некоторые файлы добавляются каждый раз, когда я выполняю эту строку

VIEWS.PY

def datapage(request):
    #all_data = Userdata.objects.all()
    files_in_user_folder = []
    #DRIVE API SETTINGS
    creds = None
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)
    service = build('drive', 'v3', credentials=creds)

    #GET ID OF USER FOLDER FROM DRIVE
    drive_users_id = get_user_file_id(service)

    # GET THE FILES IN USER FOLDER FROM 
    flow_of_users_file = service.files().list(q=" '{0}' in parents ".format(drive_users_id),spaces ='drive').execute()
    print(type(flow_of_users_file))
    for i in flow_of_users_file['files']:
        files_in_user_folder.append(i['name'])
    # FILES IN LOCAL FOLDER CALLED 'user_output_files'
    files_in_local_folder = os.listdir(settings.BASE_DIR+'/users_output_files/')
    print('files in drive are :', files_in_user_folder)
    print('files in local folder are :',files_in_local_folder)

    #CHECK IF ANY FILE UPDATES EXIST
    z = list(set(files_in_user_folder)-set(files_in_local_folder))

    #Checking if the local files have been generated
    if len(files_in_local_folder) == 0:
        print("No local files exist creating everything")
        for folder in flow_of_users_file['files']:
            name_of_folder = folder['name']
            if not os.path.exists(settings.BASE_DIR+'/users_output_files/'+str(name_of_folder)):
                print('No file does not exist')
                os.mkdir(settings.BASE_DIR+'/users_output_files/'+str(name_of_folder))
            folder_mime_type = folder['mimeType']
            if folder_mime_type == 'application/vnd.google-apps.folder':
                flow_of_file = service.files().list(q=" '{0}' in parents ".format(folder['id']),spaces ='drive').execute()
                for file in flow_of_file['files']:
                    print('The contents of folder {0} are {1}'.format(name_of_folder, file['name'] ))
                    response = service.files().get_media(fileId = file['id']).execute()
                    print(type(response))
                    data = json.loads(response)
                    converter_xls(name_of_folder, file['name'],data )

Ответы [ 3 ]

0 голосов
/ 04 февраля 2020

Причиной возникновения этой избыточности были похожие данные на моем диске Tra sh. Таким образом, при сканировании папок добавлялись данные tra sh и данные моего диска.

0 голосов
/ 04 февраля 2020

Это, вероятно, потому что вы удалили файлы на вашем диске, и теперь они находятся в пути sh. Это означает, что у них все еще есть атрибут родительской папки, указывающий на папку Users; НО теперь атрибут с именем trashed установлен на true.

Так что, если вы хотите избежать повторяющихся имен файлов , постарайтесь передать trashed = false в строке запроса.

Дополнительная информация:

0 голосов
/ 03 февраля 2020

Мне кажется, что вы не очищаете files_in_user_folder, а затем вы добавляете к нему вещи.

Вы должны попробовать

# GET THE FILES IN USER FOLDER FROM DRIVE
flow_of_users_file = service.files().list(q=" '{0}' in parents ".format(drive_users_id),spaces ='drive').execute()
files_in_user_folder.clear()
for i in flow_of_users_file['files']:
    files_in_user_folder.append(i['name'])
print('files in drive are :', files_in_user_folder)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...