Yamamoto's Laboratory
 
 
データ整理
 
 
WEB
  ページ作成
 
ゲーム
 
 

Pythonプログラム: WEB 用

私が WEB サイトメンテナンス用に作成したプログラムを示します.Python のプログラム作成の参考になるでしょう.

目次


はじめに

Python にはたくさんのモジュールが用意されており,短いソースコードで高度なことができます.便利な言語ですが使わなくては意味がありません.ここでは,私が作成し,実際に使った Python のソースコードを示します.私自身はプログラムのプロ (職業的な意味での) ではありませんので,汚いソースコードもあります.それでも,何かの参考になればとの思いから,公開します.それから,このページは,私自身の備忘録としての役割もあります.

プログラム例

講義ノートの上部に Google adsense を追加

講義ノートの上部に Google adsense を追加

001   #!/usr/bin/python3
002   
003   import os
004   import os.path
005   import sys
006   import codecs
007   import re
008   import shutil
009   
010   # x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07
011   # x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07
012   #  class FILES
013   #        arguments:  directory
014   #
015   # x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07
016   # x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07
017   class FILES:
018       def __init__(self, root):
019           self.file_path = []
020           self.root_dir  = root
021           self.extention = [".html", ".HTML", ".htm", ".PHP", ".php"]
022           self.LaTeX2HTML = r'<META NAME="Generator" CONTENT="jLaTeX2HTML'
023   
024   
025       # ========================================================================
026       # find files
027       # ========================================================================
028       def find_all_files(self):
029   
030           pttrn_LaTeX2HTML = re.compile(self.LaTeX2HTML)
031   
032           def ext_check(file_path):
033               name, ext = os.path.splitext(file)
034               if ext in self.extention:
035                   return True
036               else:
037                   return False
038   
039           def contents_check(file_path):
040               read_max_lines = 100
041               nl = 0
042               fin  = codecs.open(file_path, 'r', 'euc_jp')
043               line = fin.readline()
044               while line:
045                   if pttrn_LaTeX2HTML.search(line) !=None:
046                       fin.close
047                       return True
048                   line = fin.readline()
049                   if nl > read_max_lines:
050                       braek
051               fin.close
052               return False
053   
054           for dirpath, dirname, filename in os.walk(self.root_dir):
055               for file in filename:
056                   dir_file = os.path.join(dirpath, file)
057                   if ext_check(dir_file) and contents_check(dir_file):
058                       self.file_path.append(os.path.join(dirpath, file))
059   
060       # ========================================================================
061       # print files
062       # ========================================================================
063       def print_files(self):
064           for file in self.file_path:
065               print(file)
066   
067       # ========================================================================
068       # get files
069       # ========================================================================
070       def get_files(self):
071           return self.file_path
072   
073   
074   
075   
076   # x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07
077   # x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07
078   #  class REPLACE_TXT
079   #        arguments:  directory
080   #
081   # x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07
082   # x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07
083   class REPLACE_TXT:
084       def __init__(self, files):
085           self.file_result = 'result.txt'
086           self.ch_files    = files
087   
088   
089   
090       # ========================================================================
091       # replace_txt
092       # ========================================================================
093       def replace_top(self):
094   
095           pttrn_doct = re.compile(r'<!DOCTYPE\s+HTML', re.IGNORECASE)
096           pttrn_sty  = re.compile(r'<LINK\s+RE\s*L=\s*"STYLESHEET"\s+HREF\s*=', re.IGNORECASE)
097           pttrn_body = re.compile(r'<body', re.IGNORECASE)
098           pttrn_navi = re.compile(r'<DIV\s+CLASS\s*=\s*"navigation">', re.IGNORECASE)
099           pttrn_prev = re.compile(r'ALT\s*=\s*"previous"', re.IGNORECASE)
100           pttrn_up   = re.compile(r'ALT\s*=\s*"up"', re.IGNORECASE)
101           pttrn_next = re.compile(r'ALT\s*=\s*"next"', re.IGNORECASE)
102           pttrn_BR   = re.compile(r'<BR>\s*<HR>\s*<P>', re.IGNORECASE)
103           pttrn_div  = re.compile(r'</DIV>', re.IGNORECASE)
104           pttrn_last = re.compile(r'</HTML>', re.IGNORECASE)
105           pttrn_path = re.compile(r'(../)+')
106   
107           tmp_file = 'tmp.html'
108           fres  = codecs.open(self.file_result, 'w')
109   
110           for ch_file in self.ch_files:   # ----- ファイル毎の処理 -----
111               if os.path.isfile(tmp_file):
112                   os.remove(tmp_file)
113               fin  = codecs.open(ch_file, 'r', 'euc_jp')      # 読み込み html ファイル
114               fout = codecs.open('tmp.html', 'w', 'euc_jp')   # 書き込み一次ファイル
115               print("file name:", ch_file, end="\t")
116   
117               is_doct = False
118               is_sty  = False
119               is_body = False
120               is_navi = False
121               is_prev = False
122               is_up   = False
123               is_next = False
124               is_BR   = False
125               is_div  = False
126               is_last = False
127   
128               for line in fin:        # ----- <!DOCTYPE HTML ----
129                   if pttrn_doct.search(line) !=None:
130                       is_doct = True
131                       fout.write(line)
132                       fout.write('<!-- 2017.06.04:  先頭に,google adsense の広告追加. -->')
133                       break
134                   fout.write(line)
135   
136               for line in fin:        # ----- ルートの相対パス ----
137                   if pttrn_sty.search(line) != None:
138                       fout.write(line)
139                       if pttrn_path.search(line) != None:
140                           is_sty  = True
141                           root_path = pttrn_path.search(line).group()
142                       break
143                   fout.write(line)
144               
145               for line in fin:        # ----- <body> を探し,直後に PHP ----
146                   if pttrn_body.search(line) != None:
147                       is_body  = True
148                       remain = line.replace('<body>', '')
149                       fout.write('<body>\n\n')
150                       fout.write('<?PHP\n')
151                       fout.write('mb_http_output("EUC_JP");\n')
152                       fout.write('mb_internal_encoding("EUC_JP");\n')
153                       fout.write('ob_start("mb_output_handler");\n')
154                       fout.write('include "' + root_path + 'www_func/mk_html.php";\n')
155                       fout.write('ob_end_flush();\n')
156                       fout.write('?>\n\n')
157                       fout.write(remain + '\n')
158                       break
159                   fout.write(line)
160   
161               for line in fin:        # ----- <DIV CLASS="navigation"> frexbox の開始 ----
162                   if pttrn_navi.search(line) != None:
163                       is_navi = True
164                       fout.write(line)
165                       fout.write('<ul class="frex_lrrrr">\n')
166                       fout.write('<li><div>')
167                       break
168                   fout.write(line)
169   
170               for line in fin:        # ---- ALT="previous"    ----
171                   if pttrn_prev.search(line) != None:
172                       is_prev = True
173                       fout.write(line)
174                       break
175                   fout.write(line)
176   
177               for line in fin:        # ----- ALT="up" ----
178                   if pttrn_up.search(line) != None:
179                       is_up = True
180                       fout.write(line)
181                       break
182                   fout.write(line)
183   
184               for line in fin:        # ----- ALT="next" ----
185                   if pttrn_next.search(line) != None:
186                       is_next = True
187                       line = line.rstrip("\n")
188                       fout.write(line+'</div></li>\n')
189                       fout.write('<li><div>\n')
190                       fout.write('<?php mk_lecture_top($is_google_adsense=TRUE); ?>\n')
191                       fout.write('</div></li>\n')
192                       fout.write('</ul>\n\n')
193                       break
194                   fout.write(line)
195   
196               for line in fin:        # ----- <BR> <HR> <P>  削除 ----
197                   if pttrn_BR.search(line) != None:
198                       is_BR = True
199                       break
200                   fout.write(line)
201   
202               for line in fin:        # ----- </DIV>  直後に <HR> ---
203                   if pttrn_div.search(line) != None:
204                       is_div = True
205                       fout.write(line)
206                       fout.write('<HR>\n\n')
207                       break
208                   fout.write(line)
209   
210               for line in fin:        # ----- </HTML> をチェック ---
211                   if pttrn_last.search(line) != None:
212                       is_last = True
213                       fout.write(line)
214                       break
215                   fout.write(line)
216   
217               for line in fin:        # ---- 残りの行の書き出し ----
218                   fout.write(line)
219   
220               fout.flush()            # ---- バッファーのデータをファイルに
221   
222   
223               if is_doct and is_sty and is_body and is_navi and is_prev and is_up and is_next and is_BR and is_div and is_last:
224                   fres.write('1' + '\t' + ch_file + '\n')
225                   print('1')
226                   os.remove(ch_file)
227                   shutil.copy2(tmp_file, ch_file)
228                   os.chmod(ch_file, 0o644)
229               else:
230                   fres.write('0' + '\t' + ch_file + '\t')
231                   fres.write(str(is_doct+0))
232                   fres.write(str(is_sty+0))
233                   fres.write(str(is_body+0))
234                   fres.write(str(is_navi+0))
235                   fres.write(str(is_prev+0))
236                   fres.write(str(is_up+0))
237                   fres.write(str(is_next+0))
238                   fres.write(str(is_BR+0))
239                   fres.write(str(is_div+0))
240                   fres.write(str(is_last+0))
241                   fres.write('\n')
242   
243                   print(str(is_doct+0), end="")
244                   print(str(is_sty+0),  end="")
245                   print(str(is_body+0), end="")
246                   print(str(is_navi+0), end="")
247                   print(str(is_prev+0), end="")
248                   print(str(is_up+0),   end="")
249                   print(str(is_next+0), end="")
250                   print(str(is_BR+0),   end="")
251                   print(str(is_div+0),  end="")
252                   print(str(is_last+0), end="\n")
253   
254               fout.close()
255               fin.close()
256   
257           fres.close()
258           
259   
260   
261   
262   # x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07
263   # x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07
264   #  main routine
265   #
266   #
267   # x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07
268   # x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07x07
269   if __name__ == "__main__":
270   
271       html_files = FILES('/home/yamamoto/tmp/lecture')
272       html_files.find_all_files()
273       html_files.print_files()
274       files = html_files.get_files()
275   
276       replace = REPLACE_TXT(files)
277       replace.replace_top()

ページ作成情報

参考資料

更新履歴

2017年06月07日 ページの新規作成


no counter