2011年06月20日

[Python] フォルダーとファイルをHTMLに出力するプログラム Ver1

仕事で仕様書に書くために、ファイルをリストアップするプログラムをちゃちゃっと書いたが、ちょっと機能不足だったので、家で書いてみた。
jsonモジュール使ってみたい!とか、家で使う際の機能を入れてみたりとか、欲望にまみれて書いたので、コードとは完全に別物になっちゃったけど。

コード

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# 指定された拡張子のみ、HTML形式(Table/List)で出力する
# fileNameDictに定義されているものは、置換する
from __future__ import print_function
import sys,os
import codecs
import json
from string import Template
from optparse import OptionParser

#リストアップ対象拡張子
ext_dic = [u'jpg']
#ファイル対比表のファイル名
dictFileName= u'filelistup_dict.json'

def isTarget(ext):
	return True if ext.lower() in ext_dic else False

def load_json(fname, encoding = 'utf-8'):
	with open(fname) as f:
		return json.load(f, encoding)

def writeHTML(sourcePath,table,outputHTMLTemplate):
	o=codecs.open( os.path.join(os.path.dirname(unicode(sys.argv[0],"mbcs")),outputFileName) ,'w','utf-8')
	o.write(outputHTMLTemplate.substitute({'dir': sourcePath.replace('\\', '/').split('/')[-1], 'files': table}))
	o.close()

def listupTable(sourcePath,fileNameDict,options):
	tableDirectoryTemplate = Template(u'\n\n${dir}\n\n\n')
	
	table=''
	uniqid=1
	for root, dirs, files in os.walk(sourcePath):
		(rootPath,fileName) = os.path.split(root)
		if options.isRelPath == True:
			table += tableDirectoryTemplate.substitute({'dir': os.path.relpath(root,os.path.split(sourcePath)[0])})
		else:
			table += tableDirectoryTemplate.substitute({'dir': root.replace(rootPath + u'\\',u'')})
		for file in files:
			if isTarget(file.split(".")[-1]) == True:
				line = u'{0}{1}
-
\n'.format(uniqid,fileNameDict.get(file,file)) table += line uniqid+=1 return table def listupList(sourcePath,fileNameDict,options): listDirectoryTemplate = Template(u'
  • ${dir}\n') list='' for root, dirs, files in os.walk(sourcePath): (rootPath,fileName) = os.path.split(root) if options.isRelPath == True: list += listDirectoryTemplate.substitute({'dir': os.path.relpath(root,os.path.split(sourcePath)[0])}) else: list += listDirectoryTemplate.substitute({'dir': root.replace(rootPath + u'\\',u'')}) list += u'
      ' for file in files: if isTarget(file.split(".")[-1]) == True: list += u'
    • '+ fileNameDict.get(file,file) + u'' list += u'
    \n\n' return list def listupFile(sourcePath,dictPath,options): if os.path.isfile(dictPath): fileNameDict = load_json(dictPath,'utf-8') else: fileNameDict = {} outputHTMLTemplate = Template(u'aaa') if options.isList == True: outputHTMLTemplate = Template(u'<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n\n\n\n\n\n\n
      ${files}
    \n\n') contents = listupList(sourcePath,fileNameDict,options) else: outputHTMLTemplate = Template(u'<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n\n\n\n\n\n\n\n${files}
    IDファイル名備考
    \n\n') contents = listupTable(sourcePath,fileNameDict,options) writeHTML(sourcePath,contents,outputHTMLTemplate) if __name__=='__main__': parser = OptionParser(version="0.5") parser.add_option("-o", action="store",type="string",dest="filename",default=u'filelist.html', help=u"The output file name is specified.",metavar="FILENAME") parser.add_option("-l","--List", action="store_true",dest="isList",default=False, help=u"The output file type is List Format.") parser.add_option("-r","--Enable relative filepath", action="store_true",dest="isRelPath",default=False, help=u"output rrelative path.") (options, args) = parser.parse_args() outputFileName = options.filename #引数がおかしい場合 if len(sys.argv) < 2: print(u'Usage: # python',sys.argv[0],u'[sourcedirectorypath] -r -l -o "outputFile.html"') quit() dictPath = os.path.join(os.path.split(sys.argv[0])[0],dictFileName) sourcePath = os.path.dirname(unicode(sys.argv[1],"mbcs") + '\\') if os.path.isdir(sourcePath) == False: #存在しないPathを指定した場合 print(u'The directory does not exist.',sourcePath) quit() else: listupFile(sourcePath,dictPath,options)
  • filelistup_dict.json

    pythonと同じ階層にファイル置いておくと、ファイル名を置き換えてくれる。
    まぁ、普段使うことは無いと思うけど。

    {
    	"test1.jpg":"ああああ",
    	"test2.jpg":"いいいい"
    }
    
    続きを読む
    posted by MINE at 01:06 | Comment(0) | TrackBack(0) | Python | このブログの読者になる | 更新情報をチェックする | edit

    2011年06月19日

    ドキュメンテーションをどうするか

    このBlogの過去ログを読んだら、この話題に1年に1回は言及しているな(笑)

    仕様書絡みでWikiを使っているけど、断片化されちゃうのでイマイチだなぁとずっと思ってた。sphinxは試してみようと思ってたけど、Blockdiagというツールもあるみたい。

    コードからこれらのテキストデータを生成できれば、本当に人間が書くべきところだけに注力できるかなぁ。

    posted by MINE at 23:28 | Comment(0) | TrackBack(0) | ソフトウェア開発 | このブログの読者になる | 更新情報をチェックする | edit

    INFOBAR A01かなぁ

    auの携帯を機種変しようと目論見中。
    ネットを見てたら、価格が以下のように出てた。

    • AQUOS PHONE IS12SH(SHARP)
      • 本体総額:73,500円
      • 新規/毎月割適用後実質負担額:32,700円
      • MNP/毎月割適用後実質負担額:16,950円
      • 機種変更/毎月割適用後実質負担額:32,700円
    • INFOBAR A01(SHARP)
      • 本体総額:68,250円
      • 新規/毎月割適用後実質負担額:27,450円
      • MNP/毎月割適用後実質負担額:11,700円
      • 機種変更/毎月割適用後実質負担額:33,450円

    機能的にはIS12SHの方が上なんだけど、価格は殆ど変りないのね。
    とはいえ、Metro UIをパクった感じのINFOBARも気になるな。

    あと、秋口にはWindows Phone(Mango)も出るみたいだし、それも気になるんだよなぁ。

    posted by MINE at 21:59 | Comment(0) | TrackBack(0) | デジモノ | このブログの読者になる | 更新情報をチェックする | edit

    2011年06月17日

    ダイハツ クーザ

    行ってきました、シルク ド ソレイユのクーザ。

    今回は純粋な少年に対して繰り広げられる奇術師のショー。
    綱渡りとか輪の中に入って2人でやるのが凄かった。

    個人的には前のコルテオの方が派手だったので、爽快感があったんだけど。(ドラリオンよりは好き。)
    あと後ろのおばちゃんうるせー。ずっと喋るな。

    110617_kuza.jpg110617_kuza2.jpg
    posted by MINE at 12:02 | Comment(0) | TrackBack(0) | 趣味 | このブログの読者になる | 更新情報をチェックする | edit

    2011年06月11日

    初仙台

    仕事で初めて仙台へ。宮城県来たのは、実は初めて。

    スケジュールは結構詰め込んでたので大変だったけど、牛たん食えたので満足。

    110611_shinkansen.jpg110611_gyutan.jpg110611_eki.jpg
    posted by MINE at 20:02 | Comment(0) | TrackBack(0) | 諸行無常 | このブログの読者になる | 更新情報をチェックする | edit

    2011年06月09日

    横浜で

    中学時代の友人の結婚式。

    久々に会う友人もいたので、結構はしゃいでしまった。
    特に塾が一緒で学校が違う奴とか、なかなか会えないからな〜、貴重な再会だった。

    それにしても、これで結婚式ラッシュもそろそろ終わりかなぁ。後は来年に1件あるくらいだ。

    110609_kekkon.jpg
    posted by MINE at 09:07 | Comment(0) | TrackBack(0) | 諸行無常 | このブログの読者になる | 更新情報をチェックする | edit

    グルーポン駄目だ

    最近、色々と話題に出てるグルーポン。
    おせちやらメニューが違うとか、倍にして50%引きとかよくあるので、ちょっと買って行ってみました。

    結論は0点だった。

    渋谷の飲み屋なんだけど、ぐるなび見てると同じ位の値段で9品なんだけど、まず5品になってた。
    そしてデザートとかすげーショボい。

    やっぱ店次第でどうにでもなるようなものは、グルーポン使うのはリスキーなようで。

    110609_sake.jpg110609_desart.jpg
    posted by MINE at 08:58 | Comment(0) | TrackBack(1) | 諸行無常 | このブログの読者になる | 更新情報をチェックする | edit
    ×

    この広告は180日以上新しい記事の投稿がないブログに表示されております。