2
2

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 3 years have passed since last update.

pythonで"grep -f"的な文字列の抽出。のメモ

Last updated at Posted at 2021-08-28

#そもそも...
例えば、list_1.txtの中からlist_2.txtにある文字列を含む行を抽出したいとき。

list_1.txt
0001, aaa, AAA
0002, bbb, BBB
0003, ccc, CCC
0004, ddd, DDD
0005, eee, EEE
list_2.txt
0002
0004

シェルスクリプトなら**『grep -f 文字列 検索対象"』**と簡単に書けるので次のようになるわけです。

$ grep -f list_2.txt list_1.txt

0002, bbb, BBB
0004, ddd, DDD

#あえてpythonで書く
大人しくシェルスクリプトでやればいいのですが、敢えてpythonで書いていく。ここではlist.csvに結果を出力する。

内包表記でのforの二重ループは**[** 外側のforループ 内側のループ **]**で書くので、、、

# それぞれのlist_.txtをリストに格納
list1 = [line1.strip() for line1 in open('list_1.txt').readlines()]
list2 = [line2.strip() for line2 in open('list_2.txt').readlines()]

# 抽出
r_list = [line1 for line2 in list2 for line1 in list1 if line2 in line1]

# list.csvに出力
with open('list.csv', 'w') as exp_file:
    for line in r_list:
        print(line, file=exp_file)

結果

list.csv
0002, bbb, BBB
0004, ddd, DDD

#あえてpythonで書く その2
シェルスクリプトを使えば楽なことはわかっているがもう少し無駄な抵抗。subprocessを使ってみる。こちらの方が楽だし、わかりやすい。
上と同様に抽出結果をlist.csvに結果を出力する。

import subprocess
# それぞれのファイルへのpathを記載
file1 = 'list_1.txt'
file2 = 'list_2.txt'

# 抽出と出力
with open('list.csv', 'w') as f:
    r_list = subprocess.run(['grep', '-f', file2, file1], stdout=f)

##ほんとは...
もっと他にもやり方はあると思う。これはメモ程度ということでご勘弁を。

2
2
0

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
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?