0
0

【Python】GoogleDriveからダウンロードしたファイルの操作時のエラー対策

Last updated at Posted at 2022-12-25

どんなエラー?

GoogleDriveAPIを使用し、何らかのファイルのダウンロード後にosライブラリ等でファイルを移動・削除など行うと…

PermissionError: [WinError 32] プロセスはファイルにアクセスできません。別のプロセスが使用中です

はい、怒られました。
こんな感じでファイルがどこかで開かれたままになっています。

ちなみにコードは下記の通りです。

example.py
# ↑省略
# ########  Googleの認証 ##############
scope = ['https://www.googleapis.com/auth/drive.file']
        
# ↓ここにはサービスアカウントの鍵のJSONファイルの中身をコピペしてください
credential = {
      "type": "",
      "project_id": "",
      "private_key_id": "",
      "private_key": "-----BEGIN PRIVATE KEY-----",
      "client_email": "",
      "client_id": "",
      "auth_uri": "",
      "token_uri": "",
      "auth_provider_x509_cert_url": "",
      "client_x509_cert_url": ""
}
credentials = ServiceAccountCredentials.from_json_keyfile_dict(credential, scopes=scope)
service = build("drive", "v3", credentials=credentials, cache_discovery=False)

# フォルダ内の全てのファイルを取得
results = service.files().list().execute()  
files = results.get('files', [])

for i, file in enumerate(files):
    # ファイルIDから取得ファイルの指定
    request = service.files().get_media(fileId=file['id'])  
    # ファイル名の取得
    fh = io.FileIO(file['name'], mode='wb')  
    # ダウンロード処理
    downloader = MediaIoBaseDownload(fh, request)
    done = False
    while not done:
        _, done = downloader.next_chunk()

    # ↓の様にファイルに対して何らかの操作をするとエラーが発生する
    os.remove(file['name'])
    

# ↓省略 

原因・解決策

ダウンロードに使用した「io.FileIO」がファイルを開いたままになっているようです。
「.close()」を使って閉じてあげましょう。

example.py
    #↑省略

    request = service.files().get_media(fileId=file['id'])  
    # ファイル名の取得
    fh = io.FileIO(file['name'], mode='wb')  
    # ダウンロード処理
    downloader = MediaIoBaseDownload(fh, request)
    done = False
    while not done:
        _, done = downloader.next_chunk()
   
    # ########################
    #   ここで閉じる!!! 
    fh.close()
    # ########################


    os.remove(file['name'])
    #↓省略

これでダウンロード後のエラーが無くなります。

初心者なので、間違えている点や冗長な点がある場合があります。
その時は優しくご指導いただけると嬉しいです(‘ ; A ;`)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0