どんなエラー?
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 ;`)