Header
2019-10-11
2019-11-09

ラズパイ(Raspberry Pi) 3+Python3でS3のバケットへファイルを一括アップロードする

2019 10 11 iot2

前回ラズパイ(Raspberry Pi) 3 Model b+で写真を撮影しました。

今回は取得したファイルをS3へ一括アップロードします。

ラズパイ(Raspberry Pi) 3 Model b+でカメラを操作する

ラズパイ(Raspberry Pi) 3 Model b+で人感センサーで監視カメラを作成する

ラズパイへOpenCVをインストールして画像解析する

プログラミング言語はPython3.6を利用します。

なお、事前にAWSでIAMユーザーの作成とS3のバケットは作成されている前提で行います。

ラズパイの利用モデル

Raspberry Pi 3 Model b+ ラズベリーパイ 3 b

ライブラリをダウンロード

AWSのS3にファイルをアップロードするには事前に awscliをダウンロードし、ラズパイにAWS Access Keyやシークレットキーを設定する必要があります。

まずはawscliをpipでダウンロード

 pip install awscli

その後aws configureを設定

aws configure

AWS Access Key ID :
AWS Secret Access Key : 
Default region name [None]: ap-northeast-1
Default output format [None]: text

各種ライブラリをpipでダウンロード

pip install boto3
pip install subprocess
pip install os

Python3でS3のバケットへファイルを一括アップロードするサンプルコード

以下でラズパイ(Raspberry Pi) 3 Model b+からS3のバケットにファイルをアップロードできました。

#!/usr/local/bin/python3
# -*- coding: utf-8 -*-

import subprocess
import boto3
import os

s3 = boto3.resource('s3')
bucket = s3.Bucket('バケット名')

# linuxコマンドでjpgファイルを取得
cmd = 'find /home/pi/pic -type f -name "*.jpg"'

file_names = (subprocess.Popen(cmd, stdout=subprocess.PIPE,
                               shell=True).communicate()[0]).decode('utf-8')

# 配列化
array_files = file_names.split()

#ファイルをアップロード
for item in array_files:
    s3_filename = item.split('/home/pi/pic/')[1]
    bucket.upload_file(item, s3_filename)

サンプルコードの解説

画像を取得

findのコマンドはlinuxのコマンドで、指定のファイル名を全て取得します。

subprocessモジュールは各システムプロセスのシステムコールを呼び出せるモジュールです。

findで取得したファイル名をutf-8化しないと文字化けする可能性があるので、このメソッドを利用しLinuxコマンドを起動します。

戻り値は文字列で出力されます。

# linuxコマンドでjpgファイルを取得
cmd = 'find /home/pi/pic -name \*.jpg'

file_names = (subprocess.Popen(cmd, stdout=subprocess.PIPE,
                               shell=True).communicate()[0]).decode('utf-8')

画像をアップロード

取得したファイル名一覧を.split()を利用して、配列化します。

その後配列化したファイル情報を繰り返し処理で、指定のフォルダにアップロードします。

bucket.upload_fileはbotoを利用したメソッドになります。

# 配列化
array_files = file_names.split()

#ファイルをアップロード
for item in array_files:
    s3_filename = item.split('/home/pi/pic/')[1]
    bucket.upload_file(item, s3_filename)

以上になります

なおラズパイのカメラで動画を撮影する場合は

h264というファイル拡張子になりますが、こちらはAWSのS3にはアップできません。

以下のようなシェルスクリプトで、mp4形式の変更が必要になりますのでご注意ください。

file_name=`sudo find /home/pi/pic -name \*.h264`

for i in ${file_name}; do
  echo $(MP4Box -fps 30 -add ${i} /home/pi/pic/`date +%Y%m%d_%H-%M-%S`.mp4)
done

上記でクーロンなどで定期的に実行してみてください

その他関連記事

ラズパイで撮影した動画をグーグルドライブにアップロードする

Python3でDjangoをインストールし、HellowWoldを表示する

BeautifulSoupとpython3を利用し、画像をスクレイピングしてローカルに保存する

Djangoでページを追加し表示する|初心者・独学者向け入門コンテンツ

Python3.7をインスールすると No module named '_ctypes' というエラーになる

【初心者・独学者向け】プログラミングに困ったらテラテイルで質問してみよう

未経験からエンジニアに転職した人間が解説|独学プログラミングで挫折しないよう心がける事

前の記事
次の記事
人気記事
カテゴリーから記事を探す