2015年9月29日火曜日

Google Apps Script : ファイルとフォルダ

基本となるファイルとフォルダの列挙や操作について触れてみます
ファイル、フォルダまわりを扱うにはDriveAppを利用します

■列挙
 ・ファイルの単純な列挙
  DriveApp.getFiles() : FileIteratorという形で受け取ります

  基本的な列挙のコード
  var objFiles = DriveApp.getFiles();
  var objFile;
  while (objFiles.hasNext()){
    objFile = objFiles.next();
    Logger.log(objFile.getName());
  }
  →Googleドライブ内にある全てのファイルが列挙されます

 ・フォルダの単純な列挙
  DriveApp.getFolders() : FolderIteratorという形で受け取ります

  基本的な列挙のコード
  var objFolders = DriveApp.getFolders();
  var objFolder;
  while (objFolders.hasNext()){
    objFolder = objFolders.next();
    Logger.log(objFolder.getName());
  }
  →Googleドライブ内にある全てのフォルダが列挙されます

 ・指定のフォルダについての列挙
  ファイル、フォルダ共に指定のフォルダに属した物のみを対象に列挙できます
  objFolder.getFiles()
  objFolder.getFolders()
  →対象のフォルダ(objFolder)に、getFiles/getFoldersをする事で列挙ができます

 ・ファイルのタイプを限定して列挙
  DriveApp.getFilesByType(mime type) : タイプを引数に指定

  例えば、Spreadsheetのファイルを列挙する場合は以下のようにします
  DriveApp.getFilesByType(MimeType.GOOGLE_SHEETS);
   画像のようにMimeType.まで入力すると候補が表示されるので、
   この中から選択する形で覚えれば良いと思います


■取得
 列挙の中では、next()によって1つのファイル/フォルダを取得していましたが、IDや名前を使って取得ができます

 ・ファイルの取得
  DriveApp.getFileById(id) : IDから特定の1つのファイル受け取ります
  DriveApp.getFileByName(name) : 名前からFileIteratorという形で受け取ります

 ・フォルダの取得
  DriveApp.getFolderById(id) : IDから特定の1つのフォルダを受け取ります
  DriveApp.getFolderByName(name) : 名前からFolderIteratorという形で受け取ります

  →名前の場合は、同じ名前の物が存在しうるので列挙と同じ形の受け取りとなります

 ・フォルダの取得(マイドライブ)
  DriveApp.getRootFolder() : マイドライブ(ルート)を受け取ります


■名前の変更
 ・ファイル名の変更
  objFile.setName(name) : 引数に指定した名前に変更します

 ・フォルダ名の変更
  objFolder.setName(name) : 引数に指定した名前に変更します


■新規作成
 ・フォルダの作成
  DriveApp.createFolder(name) : 引数に指定した名前でマイドライブにフォルダを作成します
  objFolder.createFolder(name) : 引数に指定した名前でobjFolderにフォルダを作成します


■複製(コピー)
 ・ファイルの複製
  objFile.makeCopy() : 引数の有無によって名前や複製先を指定できます

  targetFolderへ"複製されたファイル"という名前で複製する例
  objFile.makeCopy("複製されたファイル", targetFolder);


■削除(ゴミ箱へ送る)
 ・ファイルの削除
  objFile.setTrashed(true) : objFileを削除します

 ・フォルダの削除
  objFolder.setTrashed(true) : objFolderを削除します

-----
以上でファイルとフォルダの列挙、基本的な操作ができると思います。

2015年9月26日土曜日

Google Apps Script : 準備から記述、実行まで

少しPythonから離れて、Google Apps Scriptにも触れてみます。

■準備
 ・Googleアカウント
 ・Googleドライブに「Google Apps Script」を追加
  →初期状態では、[新規ファイル]メニューに[Google Apps Script]が含まれていないので追加する作業が必要です。

  (1)Googleドライブにアクセスして、右クリックでメニューを表示

  (2)メニューから赤枠の[アプリを追加]を選択

  (3)検索ボックスに「Google Apps Script」を入力して、リストに表示された[Google Apps Script]の[接続]をクリック

  (4)右クリックのメニューの[新規ファイル]に[Google Apps Script]が表示されるようになる


■スクリプトの記述と実行
 エディタでスクリプトを記述して実行するところまでの一連の流れです

 (1)新規ファイルで「Google Apps Script」を選択

  (2)エディタが表示され、「myFunction()」が定義されているのが確認できる
   myFunction内に以下を記述します   
   Logger.log("Hello world!");

 (3)赤枠にある[保存]のボタンをクリックし、プロジェクト名(ファイル名)を入力します


 (4)赤枠にある[実行]のボタンをクリックします






  エディタのメニュー[表示]→[ログ]を選択すると、以下のような表示が確認できます

 
 このような流れで、スクリプトの記述から実行までを行います

2015年9月22日火曜日

Python 再帰関数

プログラム言語に触れるようになって、最初に衝撃を受けたのがタイトルにある再帰関数でした。
正しい表現とは言えないですが、その時感じたそのままの表現を使うなら「自分で自分自身を呼ぶ関数」
その衝撃というものは、今でも記憶にしっかりと刻み込まれているくらいのものです。

その名の通り、再帰的に処理を行うのにはとてもきれいに書ける仕組みだと思います。
ディレクトリなど、ツリー構造を走査するにはもってこい。
きちんと引き返す条件を設定してあげないと無限ループにはまりますが・・・

練習問題的に出されるのが1からNまでの和を求める。
これをPythonで書いてみます。

>>> def sample(val):
...    if val > 1:
...        return = val + sample(val-1)
...    else:
...        return val
...

たったのこれだけ、
王道の1から10までの和を求めるには
>>> sample(10)
55

2015年9月8日火曜日

Python リストとタプル

少し戻っているような気もしますが、正直混乱の元になっていたので・・・
あらためてリストとタプルについて確認をしておきます。

■環境
 Python 2.7


■確認
 先ずは単純に
 >>> x = [1, 2, 3]
 >>> print type(x)
 <type 'list'>
 >>>
 >>> x = (1, 2, 3)
 >>> print type(x)
 <type 'tuple'>
 →[]で囲ったのがリストで、()で囲ったのがタプル

 複数の値を返す関数は?
 >>> def func1(x):
 ...     return x+1, x*2
 ...
 >>> x = func1(5)
 >>> print type(x)
 <type 'tuple'>
 →戻り値が複数ある関数の結果はタプル

-----
初歩的な事だと思いますが、少し触らない期間があったら簡単に忘れてしまいそう・・・

2015年9月7日月曜日

Python 単純なグラフの表示

「これだ!」というテーマ(やりたい事)を持っていないままPythonの勉強継続中です。
モチベーション維持の観点からも、そろそろ壮大過ぎない程度のテーマが欲しいところですが・・・

1つの方法としてグラフの表示を取り上げてみました。「視覚化」と言ってしまえば非常に聞こえの良いテーマだと思います。そんなに立派なものにはなりませんが、やはり目に見える(分かり易い)形で表現する事は大切な事だと考えています。


前置きが長かったですが、matplotlibを使用してグラフを表示します。
他、numpyも利用

■環境
 Windows 7(64bit)
   + Python 2.7.9(32bit)
      + matplotlib 1.4.3
      + numpy 1.9.2

■インタラクティブで実行
 >>> import numpy as np
 >>> import matplotlib as plt
 >>>
 >>> x = np.arange(0, 361, 1) # 0から360まで1刻み
 >>> y1 = np.sin(x * np.pi / 180)
 >>> y2 = np.cos(x * np.pi / 180)
 >>>
 >>> plt.plot(x, y1)
 [<matplotlib.lines.Line2D object at 0x.....>]
 >>> plt.plot(x, y2)
 [<matplotlib.lines.Line2D object at 0x.....>]
 >>> plt.xlim(0, 360)
 (0, 360)
 >>> plt.show()






















なんて事のない正弦波と余弦波ですが、これだけの記述で表示できてしまうのだから便利です。

2015年9月3日木曜日

Python 構造体みたいなもの

サードパーティのライブラリを追加したりしながらPythonに触れていて
ふと、構造体のようなものはないかとインターネットで検索していたら
名前付きタプル」がヒットした。

とりあえず、座標値を表すPositionを考えて試してみると
>>> from collections import namedtuple
>>>
>>> pos = namedtuple('Position', 'x y z')
>>>
>>> p1 = pos(x=100, y=200, z=300)
>>>
>>> print p1.x, p1.y, p1.z
100 200 300
>>>

print部分で書いているように、ピリオドに続けてxやy,zを書くことで値にアクセスする事ができる
あくまでタプルなので、以下のように値を変更する事はできない
>>> p1.x += 10
AttributeError: can't set attribute

元の「構造体」という点から考えれば、100点満点とは言えないかもしれないけれど
「名前付きタプル」そのものは便利な仕組みだと思えました。

-----
typeを確認してみると
>>> print type(p1)
<class '__main__.Position'>

2015年9月2日水曜日

CPython 上場銘柄の一覧を取得する

jsmというモジュールを使って、銘柄の一覧取得をしてみました
該当のモジュールは、Yahooファイナンスから情報を取得しているみたいです。
過去にさかのぼっての株価取得も可能でしたが、ここでは銘柄一覧の取得のみにとどめておきます。

■環境
 Windows 7 Ultimate Service Pack1 (64bit)
 + Python 2.7.9 (32bit)


■準備(jsmモジュールの追加)
 なんて事はありません。以下を実行するだけ。。。
 >python -m pip install jsm


■スクリプト
 getStockInfo.py
 #coding:shift-jis

 import jsm

 q = jsm.Quotes()
 list = q.get_brand()

 # 列挙
 for key in list.keys():
     for item in list[key]:
         print item


■実行(コマンドプロンプト)
 以下でテキストファイル「getStockInfo_result.txt」に結果が出力されます
 >python getStockInfo.py >> getStockInfo_result.txt