Pythonのfileinputモジュールで複数ファイルの行を反復処理する方法
Pythonの組み込み関数open()は、1つのファイルを読み書きモードで開き、そのファイルに対して読み書き操作を行うためのものです。複数のファイルをまとめて一括処理したい場合は、Python標準ライブラリのfileinputモジュールを使用します。このモジュールは、ファイルを順番に反復処理する機能を持つFileInputクラスを提供しており、同じ目的のためのヘルパー関数も定義されています。
fileinput.input()関数の基本
このモジュールの主要なインターフェースはinput()関数です。この関数はFileInputクラスのインスタンスを返します。
fileinput.input(files, inplace, mode)
filesパラメータには、読み込む対象となる1つ以上のファイル名を指定します。各ファイルはジェネレータとして動作するため、forループで反復処理できます。ファイル内の各行がPythonコンソールに出力されます。
>>> for line in fileinput.input('data.txt'):
print(line)
filesパラメータには、複数のファイル名からなるタプルを指定することもできます。この場合、各ファイルの内容が順番に表示されます。
>>> for line in fileinput.input(files=('a.txt', 'b.txt')):
print(line)
また、FileInputクラスはwith文のコンテキストマネージャとしても使用できます。これにより、処理終了後のリソース解放が自動的に行われます。
>>> with fileinput.input(files=('a.txt', 'b.txt')) as f:
for line in f:
print(line)
fileinputモジュールの主な関数
fileinputモジュールには、以下のような便利な関数が定義されています。
| No. | 関数と説明 |
|---|---|
| 1 | filename() 現在読み込み中のファイル名を返します。 |
| 2 | fileno() ファイルディスクリプタ(整数値)を返します。 |
| 3 | lineno() 現在読み込み中の行番号を返します。この番号は全ファイルを通じた累積カウントです。 |
| 4 | filelineno() 現在のファイル内でのみ有効な行番号を返します。 |
| 5 | isfirstline() 現在のファイルの最初の行を読み込んでいる場合はTrue、それ以外の場合はFalseを返します。 |
行番号付きで出力する例
次のコードは、ファイル内の各行を行番号とともに出力します。
>>> for line in fileinput.input('books.py'):
print('{}->{}'.format(fileinput.filelineno(), line))
上記コードの出力例は次のとおりです。
1->import sqlite3
2->conn = sqlite3.connect('c:/python36/books.db')
3->cursor = conn.cursor()
4->cursor.execute("SELECT * from books;")
5->print(cursor.fetchall())
glob()と組み合わせた複数ファイル処理
次のコードは、フォルダ内の各ファイル名に続けて、そのファイル内の行に行番号を付けて出力します。ここではglob()関数を使用しています。glob()関数は、カレントパス内のファイルのリストを返し、ワイルドカードによる絞り込みにも対応しています。この例ではglob('*.py')により、カレントフォルダ内の拡張子が.pyのすべてのファイルのリストが取得され、それがfileinput.input()関数のfilesパラメータとして渡されます。
import fileinput, glob, sys
for line in fileinput.input(glob.glob("*.py")):
if fileinput.isfirstline():
print(fileinput.filename(),'>')
sys.stdout.write("{}.{}".format(fileinput.filelineno(),line))
ここで注目すべきはisfirstline()関数の使い方です。新しいファイルの反復処理が始まると、この関数はTrueを返すため、まずfileinput.filename()関数で取得したファイル名が出力され、続いて行番号付きの各行が表示されます。実行結果の例は次のとおりです。
1.py >
1.a = 10
2.b = 20
3.print ('addition=',a+b)
hello.py >
1.x = 10
2.y = 20
3.z = x+y
4.print ("x+y=",z)
inplaceパラメータでファイルを直接編集する
fileinput.input()関数のinplaceパラメータは、デフォルトではFalseに設定されています。これをTrueにすると、入力ファイルが書き込み可能な状態になり、ファイルの内容をその場で置き換えることができます。
たとえば、次のテキストが含まれる「msg.txt」があるとします。
Hello Python. Good morning
次のコードは、fileinputモジュールを使ってファイルを開き、内容を直接書き換えます。
>>> for line in fileinput.input(files='msg.txt',inplace = True):
line = line.replace('morning', 'evening')
sys.stdout.write(line)
実行後、「msg.txt」には変更が反映され、「Good morning」が「Good evening」に置き換えられます。なお、inplace=Trueを使用する際は、元のファイルがバックアップなしで上書きされるため、重要なファイルを扱う場合は事前にバックアップを取っておくことをおすすめします。
-
Python Pandas入門:DataFrameから複数の行を抽出する方法をわかりやすく解説
PandasのDataFrameから複数の行を選択・抽出するには、スライス演算子「:」を使う方法が便利です。この記事では、基本的な行の選択方法から、locやilocを使った応用的な抽出方法まで、サンプルコードと実行結果とともに詳しく解説します。 1. Pandasのインポート まず、必要なPandasライブラリを別名(エイリアス)付きでインポートします。慣例として「pd」という別名を使うのが一般的です。 import pandas as pd 2. DataFrameの作成 次に、サンプル用のDataFrameを作成します。ここでは4行2列のデータを用意し、行ラベルに「w」「x」「y」「z
-
Python Tkinterのキャンバスから描画した線を削除する方法
TkinterのCanvas(キャンバス)ウィジェットは、GUIアプリケーション開発において非常に多くの場面で活用される便利な部品です。図形の描画はもちろん、グラフィックスや画像の作成など、さまざまな用途に使用できます。キャンバス上に線を描画するには、create_line(x, y, x1, y1, **options) メソッドを使用します。Tkinterでは、実線と破線の2種類の線を描くことが可能です。作成した線をアプリケーションから削除したい場合は、delete() メソッドを使います。このメソッドに削除対象のアイテムIDを渡すことで、指定した図形だけをキャンバスから取り除くことができ