ごはんと飲み物は紙一重

あんまり更新できてないです

pythonで外部サーバからデータを読み込んで変数に格納する【python・pandas・paramiko】

研究室の少ないリソースを活用していきたい気持ち

いつもJetsonのお供として使用している3TBの外部ストレージを他の研究生も使いたいとのことだったので貸し出すことに。そんでせっかくなら別のJetsonにつないでいる外部ストレージをネットワーク経由で読み出しできないかと思って試してみました。3TB一人で使うにはもったいねぇ(貧乏性)

んでやっていきたいことは、Jetsonで立ち上げたJupyterからもう一つの研究生Jetsonにアクセスし、そこからストレージの中のデータを引っ張ってくるというものです。内容的にはpandasでaws s3にアクセスしてread_csvする内容に近い感じですかね。

f:id:ST_ha1cyon:20180814200838p:plain

コード例

from paramiko import SSHClient, RSAKey, AutoAddPolicy

client = SSHClient() 
client.set_missing_host_key_policy(AutoAddPolicy())
k = RSAKey.from_private_key_file("鍵の場所")
client.connect(hostname = "address", username='hoge', pkey=k)

paramikoをimportしてそこからsshclientを呼び出しています。そこでアクセスしたいアドレスに鍵を使ってアクセスするという形。ちなみに鍵を使ってなくても、 client.connect のオプションにはpasswordもあるので一応どうにかなる。

そこから、今回の場合のように読み出す場合は、

sftp = client.open_sftp()

with sftp.open(df_path, "r") as f:
    df = pd.read_csv(f, encoding="utf-8")

な感じでsftpを使用してアクセスしてデータを引っ張ってきます。上記のコードは別にpandasでなくてもやりたいことに合わせてやれば基本的には問題ないかと。

Jupyter上で毎度叩くのが面倒ならば

モジュール化してしまってimportすることで予め変数に必要なファイルを入れてしまうというのも手かと。そうすると、Jupyter上ではモジュールをimportするだけでよいので手間が省けるかなと。

まとめ

paramiko使っていけば自作PCをサーバにしてあんなことこんなことできちゃうよ。

(素直にAWSGCP使えっていうのはあるけど)

追記(2018/08/14)

簡単にモジュール化してみました。これでデータフレームを複数読み込みたい場合もばっちし。最小限しかできてないけど。