開発環境
- macOS Mojave - Apple (OS)
- Emacs (Text Editor)
- Windows 10 Pro (OS)
- Visual Studio Code (Text Editor)
- Python 3.7 (プログラミング言語)
Python のコードで少し気になったことを修正してみた。あらら,でも私の https://t.co/sg0wFKcEmh のスクリプトなら一瞬で対応。CSVファイルも差し替えました(今度はExcelで化けないようにBOM付きUTF-8にしました) https://t.co/xpaYjAEgs8
— Haruhiko Okumura (@h_okumura) September 6, 2019
変更してみた箇所。
- 正規表現を前もって compile 関数で準備。(ファイルサイズが大きい場合に速くなる効果があるかも。ただ、少し読みにくくなるから、よほどファイルサイズが大きいか、手元のPCのスペックが物足りない場合以外は必要なさそう。)
- nprev 変数が初期化前に elif文 に登場してるから for ループの前に0を代入。
- re.sub 関数について、あえて正規表現を使わなくても文字列の replace メソッドで十分かと変更。
- range 関数を使った for ループについて、リスト内包表記に変更して文字列の join メソッドを利用。print の呼び出し回数が3回から1回になってコードの行数を削減出来るから。
- その他、print 関数での文字列について、+ 演算子による結合ではなく f-string を利用して変数を埋め込んだ。そのほうが読みやすいと感じるだけで好みの問題かも。
コード
Python 3
#! /usr/bin/env python3 import sys import re category = 0 regexp = re.compile(r'([\d,]+) ([^ ]+) ([^ ]+) (.+) ([^ ]+) ([^ ]+) (\d+%)$') reg1 = re.compile(r'([\d,]+) ') reg2 = re.compile(r'([\d,]+) (.+) (\d+%)$') reg3 = re.compile(r'%$') rangelim = 8 nprev = 0 for line in sys.stdin: line = line.rstrip() m = reg1.search(line) if not m: continue n = int(m.group(1).replace(',', '')) if n == 1: category += 1 if category == 2: regexp = reg2 rangelim = 4 elif n != nprev + 1: continue nprev = n while not reg3.search(line): line += ' ' + sys.stdin.readline().strip() m = regexp.search(line) if m: s = ','.join([m.group(i).strip() for i in range(2, rangelim)]) print(f'{n} {s}') else: print(f'### {line}') # error
入出力結果(Bash、cmd.exe(コマンドプロンプト)、Terminal、Jupyter(IPython))
$ xpdf-pdftotext -raw kameiten_touroku_list.pdf Config Error: No paper information available - using defaults Syntax Error: Unknown character collection 'Adobe-Japan1' Syntax Error: Couldn't find 'UniJIS-UTF16-H' CMap file for 'Adobe-Japan1' collection Syntax Error: Unknown CMap 'UniJIS-UTF16-H' for character collection 'Adobe-Japan1' Syntax Error: Failed to parse font object for 'YuGothic' Syntax Error: Unknown font tag 'YuGothic' Syntax Error: No font in show ... $ head kameiten_touroku_list.txt EC 2 EC ECYahoo! ECEC 9 9 $ tail kameiten_touroku_list.txt 2,929 5% 2,930 5% 2,931 5% 2,932 5% 2,933 ? 5% 2,934 5% 2,935 5% 2,936 5% 2,937 5% 2,938 $ $ ./my_test.py < kameiten_touroku_list.txt > kameiten_touroku_list.csv $ head kameiten_touroku_list.csv ### 1 2% ### 2 2% ### 3 5% ### 4 5% ### 5 5% ### 6 5% ### 7 5% ### 8 2% ### 9 2% ### 10 2% $ tail kameiten_touroku_list.csv ### 798 5% ### 799 5% ### 800 5% ### 801 5% ### 802 5% ### 803 5% ### 804 5% ### 805 5% ### 806 5% ### 807 ' 5% $
MacPorts で Xpdf をインストールしたからコマンドは pdftotxt ではなく xpdf-pdftotext。上記の出力結果から分かるように、Xpdf の pdftotxt コマンドによる PDF からテキストファイルへの変換が失敗してるから、変更したコードを実行しても望んだ結果を得られず。。
Acrobat Reader DC をインストールしてないからテキストへの変換が上手くいかなかったのか、Python のコードに問題があるのか、どちらもか。今のところ今回以外のことで Acrobat Reader DC を必要としてないから、インストールせずに未確認なまま終了。
0 コメント:
コメントを投稿