pythonでcsv
pythonでcsvファイルを作ったり、オープンしたり、主にMAYAでツールを作った時に調べたことです。
import os files = os.listdir('パス') for file in files: print file
os.listdir()指定したパス内の全てのファイルとディレクトリを要素とするリストを返す
import maya.cmds as cmds def test( *args ): print( args ) cmds.fileBrowserDialog( fc=test, an=test, ft='directory', m=4, ds=1 ) # Result:(u'H:/cohshiro/maya/projects', u'directory')
cmds.fileBrowserDialogより選択したディレクトリのパスを取得する方法。
cmds.fileBrowserDialogのみでディレクトリを選択するとパスが返ってこないので、ディレクトリを選択してOKを押したときに実行される、(フラグan:ファイルが認証されたときに呼び出されるスクリプト)でパスを返すようにしてあげるとパスが取得できるようです。
また、cmds.fileBrowserDialogで指定したパスをUIのコントロールなどで引用したい場合以下のようにするとできました。
def editTextFieldButtonGrp( *args ): aa = str( args ) b = '' for a in aa: b = u'%s%s'%( b, a ) c = b.split( "'" ) cmds.textFieldButtonGrp( u'%stFBG'%__name__, e=True, tx=c[1] ) def inheritanceFullPath(): cmds.fileBrowserDialog( m=4, fc=editTextFieldButtonGrp, ft='directory', an='Select Directory' )
cmds.fileBrowserDialogを実行しディレクトリを選択してOKを押すとeditTextFieldButtonGrpが実行されて、その中でtextFieldButtonGrpにパスをtextとしています。
import glob list = glob.glob( 'パス\*データタイプ*' ) # Result: ['パス\testA.データタイプ', 'パス\testB.データタイプ'] #
指定したディレクトリにある特定の拡張子のみを配列で返します。たとえばAのファイルの中にA.jpegとB.csvとC.pyのデータが存在する場合は、上のスクリプトだと結果はB.csvのみ返ってきます。また、拡張子を変えてあげれば別の拡張子で選別できます。
■コールバック関数
プログラム中で、呼び出し先の関数の実行中に実行されるように、あらかじめ指定しておく関数。
path = cmds.textScrollList( self.tSLB, q=True, ai=True ) cmds.textScrollList( self.tSLB, e=True, si=path )
似たようなコマンドでiconTextScrollListとありますがtextScrollListのほうがフラグが多く使いやすいかもしれません。また、iconTextScrollListで項目の全選択を行おうと思ってやって見たのですが、できなかったのでtextScrollListに切り替えました。
#! c:/Python26/python.exe # -*- coding: utf-8 -*- import csv import codecs file = codecs.open("ファイルパス","w","エンコード") csv.writer( file, delimiter='_', quoting=csv.QUOTE_MINIMAL ) csvFile.close()
pythonでcsvファイルを作成する方法です。
■Line 1
Pythonのインタープリタ(※説明1)へのパスを記述します。今回のような、単独でのモジュール起動では記述が無くても大丈夫ですが、別のモジュールから今回作成したモジュールをimport(取り込み)したいというような時には、モジュール内部にインタープリタへのパスを記述しておきます。
■Line 2
2行目ではモジュールのエンコード宣言を記述します。
エンコード宣言をしていない場合、日本語(マルチバイト文字)が含まれているとエラーになります。
保存する時の文字コードとブラウザが読みとる時に使う文字コードが違っていると文字化けが発生してしまいます。
これは一部の符号化方式を除き、そのファイルがどのような文字コードで保存されたものなのかをブラウザが判別できる確実な手段が無いために発生するみたいです。
■Line 4,5
4行目、5行目で必要なライブラリをインポートします。
■Line 7
csvFileにCSVファイルのパスとファイルのオープン方法を指定、エンコード指定を定義しています。
■Line 8
ユーザが与えたデータをデリミタ(※説明2)で区切られた文字列に変換し、与えられたファイルオブジェクトに書き込むための writer オブジェクトを返します。
csv.writer( ファイル名, delimiter='デミリタ', quoting=コーディング(※説明3) )
今回はCSVファイルを作成しますので、データタイプはcsvにします。
csv.QUOTE_MINIMAL(※説明4)
■Line 9
csvFileのCSVファイルを閉じます。
説明1 インタープリタ
インタープリタとは人間がプログラミング言語で記述したソフトウェアの設計図(ソースコード)を、コンピュータが実行できる形式(オブジェクトコード)に変換しながら、そのプログラムを実行するソフトウェア。インタプリタ型の言語はプログラムの実行時に変換を行うため、その分だけコンパイラ型言語よりも遅いらしいです。
説明2 デリミタ
デリミタとは区切り文字のことです。
複数の要素からなるデータを扱うときにその要素を区切るための文字です。
例えばCSVデータで
「tokyo,sinjyuku,03」
といったデータがあるとすると「,」の記号がデリミタになります。
説明3 コーディング
コーディングとは設計した仕様書を元に実際にソースコードに落とすことらしいです。
設計したプログラムを書き下ろす段階のことみたいです。
説明4 csv.QUOTE_MINIMAL
オブジェクトに対し、 delimiter 、 quotechar または lineterminator に含まれる任意の文字のような特別な文字を含むフィールドだけをクオートするように指示します。
if __name__ == "__main__":
このif文の部分は、直接スクリプトとして呼び出した時のみ実行されて、別のモジュールから呼び出された時には実行されない、という記述です。 変数「__name__」には、スクリプトとして起動した際に「__main__」という値が入ります。 別のモジュールから呼び出された時には、自身のモジュール名が入るので実行されない、という仕組みです。
間違っていたらすいません。
でわ、お休みなさい。