質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

1164閲覧

テキストから文字を読み取りその文字が当てはまればエラーを表示させたい

ryop9982

総合スコア15

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/02/02 14:37

編集2018/02/02 22:21

前提・実現したいこと

テキストから文章を読み取り、もう一つのテキストから単語を読み取りその文章の中に単語が当てはまっているのであればエラーを出力したいです。

発生している問題

すべてにエラーが表示される

該当のソースコード

#import sys #coding:UTF-8 file=open('text.txt','r') line=file.readline() file2=open('index.txt','r') line2=file2.readline() while line: print(line) index = line.find(line2) if index != -1: print('syntax error') line=file.readline() line2=file2.readline()

###テキストファイル
text.txt

a b c d あいうえお

index.txt

a b c d e f

補足情報(FW/ツールのバージョンなど)

python3.6.4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryop9982

2018/02/02 15:01

発生している問題のエラーはprintで表示で出たsyntax errorのことです
guest

回答2

0

ベストアンサー

ループの回し方がおかしいようです。
text.txtの読み込みを始める前に、index.txtに書かれたキーワードは全部取り込んでおかないとまずいでしょう。現状ではtext.txtを一行読むごとにindex.txtからも一行読みこんでいるので、両ファイルの同じ行番号のところでキーワードが一致しないといけないというナンセンスなことになっています。

ざっと修正してみました。

import re file2= open('index.txt','r') x = file2.read() file2.close() x = re.sub("[\n\r]+$", "", x) indexwords = re.split("[\n\r]+", x) print(indexwords) file=open('test.txt','r') line = file.readline() while line: for word in indexwords: index = line.find(word) if index != -1: print(line, word, ' syntax error') line=file.readline()

投稿2018/02/02 15:29

KojiDoi

総合スコア13669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryop9982

2018/02/02 16:38

ご返答ありがとうございます。 なるほど、私はwhile文でreadlineで一行ずつ調べるといったプログラムになっていたわけですね たとえ、readlineをreadにプログラムを変更してもテキスト同士の行番号が完全に一致しないといけないわけですね... for文はなぜin演算子にwordを使用するのでしょうか...? 調べてみましたがよくわからず…変な質問でしたらすみません。
KojiDoi

2018/02/02 19:42

> for文はなぜin演算子にwordを使用するのでしょうか 判りやすい適当な名前を選んだだけです。
ryop9982

2018/02/02 22:30 編集

ご返信ありがとうございます 関数名として使っているということですね 定義されていない状態でいきなりwordという関数が出てきたので少し戸惑いました
ryop9982

2018/02/02 22:27

もう一つ疑問点なのですが何故text.txtよりindex.txtを 先に読まないといけないのでしょうか? 先にtext.txtを読み込みそのあとindex.txtを読み込んでfindで検索すればいいと考えていました
KojiDoi

2018/02/03 03:33

>関数名として使っているということですね 関数名ではありません。変数名です。 > 先にtext.txtを読み込みそのあとindex.txtを読み込んでfindで検索すればいいと考えていました 両方のファイルの内容を先に全部読み込み、そのあとでfindするという作戦なら、その順番で構いません。 しかし、ここで示した例ではtest.txtの内容を一行づつ読んでは評価してそのまま捨てています。このためindex.txtを先に読んでNGワードをすべて把握しておかないと比較ができません。この作戦は少しわかりにくく思えるかもしれませんが、text.txtの中身を抱え込んでおかなくていいのでメモリが少なくて済むという利点があります。text.txtが百万行あるといったケースでは大きな違いになります。
ryop9982

2018/02/03 07:00

変数名、指摘ありがとうございます! なるほど…頭の中ではすごい何行分のことしか考えていなかったのですが そういうメモリの問題や数が増えるとそういう問題も出てくるわけですねすごい納得できました。 アドバイス、ご指摘ありがとうございました!!
guest

0

書いてみました。
良いコードを書くためには、コードを読む能力がまず必要です。


check_syntax.py

Python

1from itertools import count 2 3def main(): 4 with open('ng_word.txt') as f: 5 ng_words = [line.rstrip() for line in f.readlines()] 6 7 for i in count(start=1): 8 try: 9 line = input() 10 if any(ng_word in line for ng_word in ng_words): 11 print( 12 f'{i:2d}. Syntax Error: {line}' 13 ) 14 except EOFError: 15 break 16 17if __name__ == '__main__': 18 main()

実行結果

plain

1C:...>python check_syntax.py < text.txt 2 1. Syntax Error: a 3 2. Syntax Error: b 4 3. Syntax Error: c 5 4. Syntax Error: d

投稿2018/02/03 05:11

LouiS0616

総合スコア35658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryop9982

2018/02/03 18:14

回答ありがとうございます 前回の記事でもお答えくださりありがとうございます いろいろなコードを読んでみます すごい勉強になります!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問