Pythonでイテレータを先頭に戻すお話

先日作業量の多いタスクをこなさなければならず、さすがに全ての作業を手作業でするのは嫌だし、全てを手作業で行うとミスや漏れが出てくる可能性もあるため「ファイル名がCSVファイルの中に存在するかどうかを確認する」という作業を自動化しようと考えました。
その時に「まぁ今回しか使わないし、とりあえずファイル名一覧を書き込んだファイルとCSVファイルを読み込んで二重ループしとくか」と思ってPythonでスクリプトを書いたら、for文が全然回らずに思った通りに動かずに困ってしまいました。
時間との兼ね合いで解決策を調べられなかったため、家に帰ってから解決策を調べました。
「2回目のfor文が回らないよ~」という方は是非参考にしてください。

Contents

環境

Windows10 Home 64bit
Python 3.6.5

目標

二つのファイルを読み込んで二重ループして両方のファイルに存在する項目を出力する。

data.txtの中に入ってる値が、data.csvの1列目に入ってるかを確認します。

data.txt

1
3
5

data.csv

aa,bb,cc,dd,ee
1,1,1,1,1
2,2,2,2,2
3,3,3,3,3
4,4,4,4,4

問題

二重ループの2つ目のループが1度しか回らない。

2つ目のループが1度しか回らないのは、やっぱりイテレータ関係じゃないかと考える。

以下、失敗コード

# -*- coding: utf-8 -*-
import csv

csvFile = open("data.csv", "r", encoding="utf-8", errors="", newline="")
csvf = csv.reader(csvFile, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)

with open("data.txt", "r") as textf:
	for s_line in textf:
		target = s_line.replace("\n", "")

		for row in csvf:
			if target == row[0]:
				print(target + " Match!!")

csvFile.close()

単純な二重ループです。これでいけるかなと思ったけどダメでした。

for文でcsvfをループで回してるんだから「変数csvfに対してイテレータを先頭に戻すメソッドがあるんじゃないか?」と思ってdir(csvf)を実行してもそれっぽいメソッドはありませんでした。

解決策

変数csfFileに対してseekメソッドを実行します。
以下成功コード

# -*- coding: utf-8 -*-
import csv

csvFile = open("data.csv", "r", encoding="utf-8", errors="", newline="")
csvf = csv.reader(csvFile, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)

with open("data.txt", "r") as textf:
	for s_line in textf:
		target = s_line.replace("\n", "")

		for row in csvf:
			if target == row[0]:
				print(target + " Match!!")
		# テキストファイルのイテレータを先頭に戻す
		csvFile.seek(0)

csvFile.close()

この記事のポイントは15行目です。
このseekメソッドを実行することで、イテレータを先頭に戻すことができるようです。

ちなみにですが、with句で開いているファイルのオブジェクトtextfに対してもseek(0)を行うことで、イテレータを先頭に戻して再度for文を回すことができました。

まとめ

問題じゃないかと睨んでいたイテレータが問題だと判明して、自分の中で安心しましたw
スクリプト言語でコーディング行うことが多くてイテレータって言葉を使ったのも久しぶりでしたが、皆様も基本的なことを忘れずにコーディングしましょう。(半分戒め)

量があるちょっとした作業をささっとプログラムを書いて自動化できると少し楽になりますよね。Pythonはプログラムを簡単に書けるのでちょっとした作業を自動化するのにはもってこいです。事務作業をする場合にもお勧めです。(事務作業をする人はこの記事見ないか…)

参考にさせていただいたサイト様

CSV読み込みで参考にさせていただいた記事
pythonでのcsvファイルの読み込み – Qiita
https://qiita.com/motoki1990/items/0274d8bcf1a97fe4a869

イテレータを先頭に戻すときに参考にさせていただいた記事
イテレータをPythonでリセットできますか? [iterator] [generator] | CODE Q&A 問題解決 [日本語]
https://code.i-harness.com/ja/q/31d684

シェアする

  • このエントリーをはてなブックマークに追加

フォローする