6
11

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でファイルから文字列を抽出する

Last updated at Posted at 2020-02-02

はじめに

この記事で説明すること
以下の機能のサンプルコード。

  • 指定したディレクトリ配下のファイルの一覧を作成する
  • ファイル内のテキストに特定の文字列が含まれるかどうかを調べる
  • ファイル内のテキストから特定の文字列で囲まれた範囲のテキストを抽出する

開発環境

  • python 2.7以上

指定したディレクトリ配下のファイルの一覧を作成する

コード

def generate_file_list(dirpath_to_search):
    file_list = []
    for dirpath, dirnames, filenames in os.walk(dirpath_to_search):
        for filename in filenames:
             file_list.append(os.path.join(dirpath,filename))

    return file_list

使用方法

以下のようなディレクトリ構成となっていて、sample1配下のファイル名を再帰的に取得したい場合のサンプル。

サンプルのディレクトリ構成
sample1/
├── dir01
│   ├── dir11
│   │   └── file21.txt
│   └── file11.txt
├── file01.txt
└── file02.txt
使用方法
file_list = generate_file_list('sample1')
for file in file_list:
    print(file)

# 出力
# sample1/file01.txt
# sample1/file02.txt
# sample1/dir01/file11.txt
# sample1/dir01/dir11/file21.txt

使用したAPI

os.walk(top, topdown=True, onerror=None, followlinks=False)

ディレクトリツリー以下のファイル名を、ツリーをトップダウンもしくはボトムアップに走査することで作成します。ディレクトリ top を根に持つディレクトリツリーに含まれる、各ディレクトリ (top 自身を含む ) ごとに、タプル (dirpath, dirnames, filenames) を yield します。

ファイル内のテキストに特定の文字列が含まれるかどうかを調べる

コード

def contain_text_in_file(filepath, text):
    with open(filepath) as f:
        return any(text in line for line in f)

使用方法

以下のようにcontain.txtnot_contain.txtというファイルがあって、「2020/02/02」をファイル内に含むファイルを知りたい場合のサンプル。

contain.txt
更新日: 2020/02/02
この記事はpythonのファイル操作に関する記事です。
not_contain.txt
更新日: 2019/10/15
この記事はpythonのファイル操作に関する記事です。
使用方法
filepath1 = './contain.txt'
text = '2020/02/02'
result1 = contain_text_in_file(filepath1, text)
print(result1) # True

filepath2 = './not_contain.txt'
text = '2020/02/02'
result2 = contain_text_in_file(filepath2, text)
print(result2) # False

使用したAPI

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

file を開き、対応する ファイルオブジェクト を返します。

any(iterable)

iterable のいずれかの要素が真ならば True を返します。iterable が空なら False を返します。以下のコードと等価です:

ファイル内のテキストから特定の文字列で囲まれた範囲のテキストを抽出する

コード

import re

def extract_text_in_file(filepath, pattern_prev, pattern_next):
    extracted_text_array = []
    pattern = pattern_prev + '(.*)' + pattern_next
    with open(filepath) as f:
        lines = f.readlines()
        for line in lines:
            tmp_extracted_text_array = re.findall(pattern, line)
            extracted_text_array.extend(tmp_extracted_text_array)

    return extracted_text_array

使用方法

以下のようなfile.txtというファイルがあって、「更新日」と「 by」に囲まれた日付部分を抽出したい場合のサンプル。

file.txt
更新日:2020/02/01 by taro
この記事はpythonのファイル操作に関する記事です。

更新日:2020/02/02 by jiro
この記事はpythonのファイル操作に関する記事です。
使用方法
filepath = './file.txt'
pattern_prev = '更新日:'
pattern_next = ' by'
extracted_text_array = extract_text_in_file(filepath, pattern_prev, pattern_next)

for extracted_text in extracted_text_array:
    print(extracted_text)

# 出力
# 2020/02/01
# 2020/02/02

使用したAPI

re.findall(pattern, string, flags=0)

string 中の pattern による全ての重複しないマッチを、文字列のリストとして返します。 string は左から右へ走査され、マッチは見つかった順で返されます。パターン中に 1 つ以上のグループがあれば、グループのリストを返します。パターンに複数のグループがあればタプルのリストになります。空マッチは結果に含まれます。

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

file を開き、対応する ファイルオブジェクト を返します。

6
11
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
6
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?