Google 드라이브에서 어두운 데이터 가져오기 — Google API 없음

Jan 04 2023
구글 드라이브 | 단어 및 PDF 문서 | NO GOOGLE API 우리는 파일, SQL localhost 및 SQL Server에서 데이터를 가져오는 방법을 배웠습니다. 그리고 대부분의 경우 테이블 형태로 제공됩니다.

구글 드라이브 | 단어 및 PDF 문서 | Google API 없음

파일, SQL localhost 및 SQL Server에서 데이터를 가져오는 방법을 배웠습니다. 그리고 대부분의 경우 테이블 형태로 제공됩니다. 하지만 Google 드라이브에 저장된 문서(워드 및 PDF)에서 데이터를 가져와야 한다면 어떻게 해야 할까요? 그렇다면 특히 Google API 설정이 필요하지 않은 경우 이 문서가 적합할 수 있습니다!

Unsplash에 Firmbee.com의 사진

다음과 같은 작업이 주어졌다고 가정합니다.

"Google 드라이브에 저장한 문서가 많이 있는데 거기에 있는 모든 단어 및 PDF 파일을 읽고 표로 요약할 수 있나요?"

훌륭한 데이터 분석가로서 "물론"이라고 대답할 것입니다.

그럼 시작하겠습니다. 먼저 Google 드라이브 특정 폴더 내의 파일 목록을 가져올 수 있는 스크립트가 필요합니다. 이렇게 하려면 새 Google 스프레드시트를 만들고 확장 프로그램으로 이동한 다음 Apps 스크립트를 선택해야 합니다.

새 Google 스프레드시트를 만들고 Apps Script를 선택합니다.

이렇게 하면 Apps 스크립트 탭으로 이동합니다.

Apps 스크립트 탭

code.gs에서 다음 코드를 작성합니다. var folderID를 원하는 폴더 ID로 바꿉니다. 나는 당신이 방법을 알고 있다고 확신합니다. 예, 주소 표시줄에 있는 임의의 문자열입니다.

// TODO: Set folder ID
var folderId = 'your folder id here';
var array=[];
var judul=['location','name','url','create date','update date'];
// Main function 2: List all files & folders, & write into the current sheet.
function listAll(){
  getFolderTree(folderId, true);   
};

// Get Folder Tree
function getFolderTree(folderId, listAll) {
  try {
    // Get folder by id
    var parentFolder = DriveApp.getFolderById(folderId);
    //go to 1st sheet
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    SpreadsheetApp.setActiveSheet(spreadsheet.getSheets()[0]);
    // Initialise the sheet
    var file, data, sheet = SpreadsheetApp.getActiveSheet();
    sheet.clear();
    // Get files and folders
    getChildFolders(parentFolder.getName(), parentFolder, data, sheet, listAll);
  } 
  catch (e) {
    Logger.log(e.toString());
  }
};

// Get the list of files and folders and their metadata in recursive mode
function getChildFolders(parentName, parent, data, sheet, listAll) {
  var childFolders = parent.getFolders();
  // List folders inside the folder
    while (childFolders.hasNext()) {
    var childFolder = childFolders.next();
    
    // List files inside the folder
    var files = childFolder.getFiles();
    while (listAll & files.hasNext()) {
      var childFile = files.next();
      //Logger.log("File Name: " + childFile.getName());
      data = [ 
        parentName + "/" + childFolder.getName() + "/" + childFile.getName(),
        childFile.getName(),
        childFile.getId(),
        childFile.getUrl(),
        childFile.getDateCreated(),
        childFile.getLastUpdated(),
      ];
      // Write
      array.push(data);
    }
    // Recursive call of the subfolder
    //Logger.log(array);
    getChildFolders(parentName + "/" + childFolder.getName(), childFolder, data, sheet, listAll);  
        SpreadsheetApp.getActiveSheet().getRange(1, 1, 1, 1).setValue('location');
        SpreadsheetApp.getActiveSheet().getRange(1, 2, 1, 1).setValue('name');
        SpreadsheetApp.getActiveSheet().getRange(1, 3, 1, 1).setValue('id');
        SpreadsheetApp.getActiveSheet().getRange(1, 4, 1, 1).setValue('url');
        SpreadsheetApp.getActiveSheet().getRange(1, 5, 1, 1).setValue('DateCreated');
        SpreadsheetApp.getActiveSheet().getRange(1, 6, 1, 1).setValue('LastUpdated');
        SpreadsheetApp.getActiveSheet().getRange(2, 1, array.length, 6).setValues(array);
  };
 
};

이것은 모든 문서가 있는 위치를 찾아야 하는 첫 번째 테이블입니다. 이를 위해 파이썬을 사용하여 수행할 것입니다. 그렇게 하려면 다음 코드를 작성해야 합니다.

import pandas as pd
import textract
import re

#get sheet id
sheet_id='your sheed id here'
#convert google sheet to csv for easy handling
csv_url=(f"https://docs.google.com/spreadsheets/d/{sheet_id}/export?format=csv")
#create dataframe from csv
df=pd.read_csv(csv_url)
#filter by filetype
desiredfiletype=[".pdf",".doc",".docx"]
df=df[df['name'].str.contains('|'.join(desiredfiletype))]

#drop na
df=df.dropna()
#create new column "text"
df["text"]=""
#create new column url
df["url_final"]=""

for index, row in df.iterrows():
    if str(row['name'])[-4:] == ".pdf":
        df['url_final']=df['url']
    else: 
        df['url_final']="http://docs.google.com/document/d/"+df['id']+"/export?format=pdf"

#remove url column
del df['url']

df

그리고 단어 문서(.doc 및 .docx)의 경우 먼저 pdf로 다운로드하는 것을 선호합니다. 이렇게 하면 파이썬이 내용을 더 쉽게 읽을 수 있습니다. 하지만 먼저 이 코드를 사용하여 폴더에 다운로드해야 합니다. 이를 위해서는 gdown과 requests라는 두 개의 라이브러리가 필요합니다.

import gdown
import requests

for index, value in df['url_final'].items():
    try:
        url = value
        r = requests.get(url)
        if r.status_code == 200:
            output=r"D:/Documents/ISA/"+ df["name"][index]+".pdf"
            gdown.download(url,output,fuzzy=True)    
    except:
        pass

import gdown
import PyPDF2
import requests

for index, value in df['url'].items():
    try:
        #read pdf
        output=r"D:/Documents/"+ df["name"][index]+".pdf"
        pdfFileObject = open(output, 'rb')
        pdfReader = PyPDF2.PdfFileReader(pdfFileObject)
        count = pdfReader.numPages
        text=""
        for i in range(count):
            page = pdfReader.getPage(i)
            text += page.extractText() +"\n"
        df["text"][index]=text
    except:
        pass


Google API가 훌륭하다고 확신하지만 저와 같은 일부에게는 프로젝트, 자격 증명, JSON 등을 설정하는 것이 때때로 너무 많습니다. 특히 동일한 결과를 제공할 대안이 있는 경우.