2019年9月6日金曜日

開発環境

Python のコードで少し気になったことを修正してみた。

変更してみた箇所。

  1. 正規表現を前もって compile 関数で準備。(ファイルサイズが大きい場合に速くなる効果があるかも。ただ、少し読みにくくなるから、よほどファイルサイズが大きいか、手元のPCのスペックが物足りない場合以外は必要なさそう。)
  2. nprev 変数が初期化前に elif文 に登場してるから for ループの前に0を代入。
  3. re.sub 関数について、あえて正規表現を使わなくても文字列の replace メソッドで十分かと変更。
  4. range 関数を使った for ループについて、リスト内包表記に変更して文字列の join メソッドを利用。print の呼び出し回数が3回から1回になってコードの行数を削減出来るから。
  5. その他、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 コメント:

コメントを投稿

関連コンテンツ