#そもそも...
例えば、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)
##ほんとは...
もっと他にもやり方はあると思う。これはメモ程度ということでご勘弁を。