5
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Tips : [Python] 特定の文字列を含まない行だけを抽出する

Last updated at Posted at 2017-06-02

目的

 特定の文字列を含まない行だけを抽出します。

ポイント

 このような時はpythonのinが便利です。

 ある文字列Aに文字列Bが含まれているかどうかは以下の構文で判定できます。

[文字列B] in [文字列A]

 戻り値は論理値です。

実例

 inを使って特定の文字列を含まない行だけを抽出します。

 例えば、以下の文章から特定のワードを含まない行のみを取得したいとします。

example.txt
机の上にりんごがあります。
机の上にリンゴがあります。
There is an apple on the table.
机の上にばなながあります。
机の上にバナナがあります。
There is a banana on the table.

 除外したいワードのリストは以下のものとします。

filter.txt
りんご
apple
バナナ

 そのような場合のスクリプトは以下のようになります。

fitrHavingLine.py
#!/usr/local/bin/python3
# -*- coding: utf-8 -*-

"""
参照ファイル上のデータを含まない行を出力する。
"""
__author__  = "Kazuki Nakamae <kazukinakamae@gmail.com>"
__version__ = "0.00"
__date__    = "2 Jun 2017"

import sys

def fitrHavingLine(infn,reffn,outfn):
    """
    @function   fitrHavingLine();
    参照ファイル上のデータを含まない行を出力する。
    @param  {string} infn :   入力ファイル
    @param  {string} refdir :   参照ファイル
    @param  {string} outfn :   出力ファイル
    """

    inf = open(infn, 'r')
    for infline in inf:
        isNothing = True
        ref = open(reffn, 'r')
        # 参照ファイル上の文字列が存在すれば判定をFalseにする
        for refline in ref:
            if refline.strip() in infline:
                isNothing=False
                break
        ref.close()
        if isNothing:
            outf    =   open(outfn, 'a')
            outf.write(infline)
            outf.close()
    inf.close()


if __name__ == '__main__':
    argvs = sys.argv
    argc = len(argvs)

    if (argc != 4):   # 引数チェック
        print("USAGE : python3 fitrHavingLine.py <INPUT FILE> <REFERENCE FILE> <OUTPUT FILE>")
        quit()

    fitrHavingLine(argvs[1],argvs[2],argvs[3])
quit()

 bash に以下を入力します。

python3 fitrHavingLine.py example.txt filter.txt out.txt

 出力は以下の通りになります。

out.txt
机の上にリンゴがあります
机の上にばなながあります
There is a banana on the table.

 
おわりに

if refline.strip() in infline:
                isNothing=False
                break

 の部分をいじれば逆に特定の文字を含む行や、あるいは特定の行のみを加工することが可能でしょう。

 csv ファイルなどで多様な項目が存在するデータを捌く際に便利かもしれません。

 以上です。ありがとうございました。

5
8
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?