数日前にEpic Games Storeから無料配布されたプログラミングゲーム『Human Resource Machine』にハマって、2日でクリアしてしまったのですが、プレイしながら「ていうか、ゲームじゃなくって実用的なプラグラムが書きてぇ」と思いまして。
で、いつもですとPerlで書くのですが、「時代はPythonだろっ!」っと思い立って、思い立ったが元日(それを言うなら吉日)ということで、初めてPythonでプログラミングしました。
import glob import shutil filepath = 'e:/data/python/data/raw/*.zip' flist = glob.glob(filepath) for file in flist: shutil.unpack_archive(file, 'e:/data/python/data/raw/')
pathの指定方法からお察しの通り、Windowsです。指定したフォルダのzipファイルを全部解凍するだけのスクリプトです。
最初ですから、こんなもんでしょう。
import glob import shutil import os flist = glob.glob('e:/data/*.txt') for datefile in flist: make_zip = shutil.make_archive(datefile[0:-4],format="zip",base_dir=datefile) shutil.move(make_zip, 'e:/data/zip/') os.remove(datefile)
ディレクトリ内の全てのテキストファイルを個別にzip化して、別のフォルダへ移動して、元のテキストファイルを消します。
で、2日めはもっと高度なスクリプトを書いていたのですが、解析結果の自分向けのレポートが、標準出力だけでは、なんか物足りないのでhtmlファイルで出力しようと、変なところに力を注ぎだしまして。
from bs4 import BeautifulSoup test1 = BeautifulSoup('','html.parser') dl_tag = test1.new_tag('dl') dt_tag = test1.new_tag('dt') dt_tag.string = 'Title' dd_tag = test1.new_tag('dd') dd_tag.string = 'contents' dl_tag.append(dt_tag) dl_tag.append(dd_tag) test1.append(dl_tag) print(test1)
↓ 出力結果
<dl><dt>Title</dt><dd>contents</dd></dl>
↓ の方が早い
print(<dl><dt>Title</dt><dd>contents</dd></dl>)
(身も蓋もない事を言うな…)
でですね、今回、最初に陥ったのが、stringの追記。
まず、ダメな例。
from bs4 import BeautifulSoup test2 = BeautifulSoup('','html.parser') div_tag = test2.new_tag('div',style="margin-left:2em;") div_tag.string = 'contents1' div_tag.string = 'contents2' test2.append(div_tag) print(test2)
↓ 出力結果
<div style="margin-left:2em;">contents2</div>
追記じゃなくって、上書きされて出てきます。
ところが、下記の方法だと追記できました。
from bs4 import BeautifulSoup test2 = BeautifulSoup('','html.parser') div_tag = test2.new_tag('div',style="margin-left:2em;") div_tag.append('contents1') div_tag.append('contents2') test2.append(div_tag) print(test2)
↓ 出力結果
<div style="margin-left:2em;">contents1contents2</div>
stringなんて要らんかったんや。
でも、これじゃあ出力結果が見づらいから改行を入れたいですよね。
そう思ったら、次の罠にかかりました。
from bs4 import BeautifulSoup test2 = BeautifulSoup('','html.parser') div_tag = test2.new_tag('div',style="margin-left:2em;") div_tag.append('contents1') div_tag.append('<br>' + 'contents2') test2.append(div_tag) print(test2)
↓ 出力結果
<div style="margin-left:2em;">contents1<br>contents2</div>
「<br>」が、エスケープ処理されてタグとして機能しない!!
要らんことしないでいいのに…。
これの正しい対処方法は、
from bs4 import BeautifulSoup test2 = BeautifulSoup('','html.parser') div_tag = test2.new_tag('div',style="margin-left:2em;") div_tag.append('contents1') div_tag.append(test2.new_tag('br')) div_tag.append('contents2') test2.append(div_tag) print(test2)
↓ 出力結果
<div style="margin-left:2em;">contents1<br/>contents2</div>
ということで、思った以上に手間がかかるので、htmlタグを手打ちしたほうが早いですよね(ぉぃ