'20/09/12更新:雛形コードの汎用性を高めました。
文字列を検出するには、正規表現reモジュールを使用します。
・先頭文字列をマッチさせたい場合は re.match()
・文字列の一部を部分マッチさせたい場合は re.search()
本コードの実施例を示します。下図は抽出対象のテキストファイルです。

下図は、本コードを実行して生成したテキストファイルです。検出したい文字列をリストで['NAME ID', 'D']と指定するだけで、その開始文字列と終了文字列の行を抽出して、その行区間のデータを新たなテキストファイルへ書き出します。

その他の指定方法による結果例が次の3つです。一番左図は、「matrix」を最初に見つけた段階で抽出して空白行までの複数行を抽出します。中央図は、「matrix」とその次の行に「ID」がある場合に抽出しています。一番右図は、直接行番号「19」と「21」を指定することで抽出しています。これらはクラスを用いて、メソッドを呼び出すことで実現しています。

▼本プログラム
import sys
import re
import pandas as pd
class Extract_data_from_file():
def __init__(self, input_file):
self.input_file = input_file
print('reading file -> ', self.input_file)
def extract_targetrows_method_A(self, target_list):
with open(self.input_file, "r") as f:
row_start = ""
row_end = ""
if len(target_list) == 2:
for i, row in enumerate(f, start=1):
print(row)
if re.match(target_list[0], row):
row_start = i
if row_start != '' and re.match(target_list[1], row):
row_end = i
break
if row_start != "" and row=="\n":
row_end = i
break
else:
print("target_list must be max 2 :" + str(target_list))
sys.exit()
if row_end == "":
print("target sentence " + str(target_list) + " does not exist")
sys.exit()
print(row_start, row_end)
return (row_start, row_end)
def extract_targetrows_method_B(self, target_list):
with open(self.input_file, "r") as f:
row_start = ""
row_end = ""
if len(target_list) == 2:
for i, row in enumerate(f, start=1):
if re.match(target_list[0], row):
buf_row = i
if re.search(target_list[1], row) and (i == buf_row + 1):
row_start = buf_row
if row_start != "" and row=="\n":
row_end = i
break
elif len(target_list) == 1:
for i, row in enumerate(f, start=1):
if re.match(target_list[0], row):
row_start = i
if row_start != "" and row=="\n":
row_end = i
break
else:
print("num of target_list is max 2 :" + str(target_list))
sys.exit()
if row_end == "":
print("target sentence " + str(target_list) + " does not exist")
sys.exit()
print(row_start, row_end)
return (row_start, row_end)
def write_data(self, extract_row_list, output_file):
with open(self.input_file, "r") as f:
buf = []
for i, row in enumerate(f):
if ( i >= int(extract_row_list[0])) and (i < int(extract_row_list[1])):
buf.append(row)
with open(output_file, "w") as f:
f.writelines(buf)
def main():
myobject = Extract_data_from_file(input_file)
row_list_A1 = myobject.extract_targetrows_method_A(target_list_1)
start_row, end_row = row_list_A1
myobject.write_data((start_row - 1, end_row + 1), 'extract_data_A_1.txt')
row_list_B1 = myobject.extract_targetrows_method_B(target_list_2)
myobject.write_data(row_list_B1, 'extract_data_B_2.txt')
row_list_B2 = myobject.extract_targetrows_method_B(target_list_3)
myobject.write_data(row_list_B2, 'extract_data_B_3.txt')
myobject.write_data([19, 21], 'extract_data_4.txt')
if __name__ == '__main__':
input_file = "raw_data.txt"
target_list_1 = ['NAME ID', 'D']
target_list_2 = ['matrix']
target_list_3 = ['matrix', 'ID']
main()
print('finished')
以上
<広告>
リンク