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

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

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

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

Q&A

解決済

2回答

1672閲覧

list型からint型への変換

Y_Miz

総合スコア3

Python 3.x

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

0グッド

0クリップ

投稿2020/07/24 08:28

前提・実現したいこと

あるテキストファイルについて、文字列'XXX'が含まれる行を全て削除したい。

やったこと・これからやる予定のこと

1.ファイルの読み込み。'rfile'にテキストファイル名を指定

with open(rfile) as f: lines = f.readlines()

2.'XXX'が含まれる行番号の取得

l_XXX_i = [i for i, line in enumerate(lines) if 'XXX' in line]

3.popでの要素削除(ここでエラーが発生)

lines_after = lines.pop(l_XXX_i)

4.ファイルへの書き込み(これからやること)。'wfile'に出力テキストファイル名を指定

with open(wfile, mode='w') as f: f.writelines(lines_after)

発生している問題・エラーメッセージ

'list' object cannot be interpreted as an integer

試したこと

変数'l_XXX_i'がリスト型だったため、下記の通りint型への変換を試したものの、

l_XXX_index = int(l_XXX_i)

エラーが表示

int() argument must be a string, a bytes-like object or a number, not 'list'

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

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

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

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

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

guest

回答2

0

中間リストを作る必要は無く、判定条件を反転させるだけで良い筈です。

Python

1with open(rfile) as f: 2 lines = f.readlines() 3 4lines_after = [line for line in lines if 'XXX' not in line]

次のように書くとちょっとだけメモリ効率が良くなります。特に除外される要素が多い場合。

Python

1with open(rfile) as f: 2 lines_after = [line for line in f if 'XXX' not in line]

おまけ

次のように読み出しと書き出しを同時に行うと、更にメモリ効率が良くなります。

Python

1with open(rfile) as fin, open(wfile) as fout: 2 for line in fin: 3 if 'XXX' in line: 4 continue 5 6 fout.write(line)

ここまで来るとシェルスクリプトやバッチの方がすっきりしそうなのはさておき。

投稿2020/08/01 07:46

編集2020/08/01 07:50
LouiS0616

総合スコア35660

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

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

0

ベストアンサー

このようにしたら行けるはずです。

python

1def remove(x): 2 lines.pop(x) 3 return lines 4 5 6with open(rfile) as f: 7 lines = f.readlines() 8l_XXX_i = [i for i, line in enumerate(lines) if 'XXX' in line] 9lines_after = list(map(remove, l_XXX_i)) 10with open(wfile, mode='w') as f: 11 f.writelines(lines_after)

※前提条件
l_XXX_iのリストの中身がすべてint型の場合のみ実行可能
str=>intへの変換方法

python

1list(map(int,l_XXX_i))

投稿2020/07/24 08:35

編集2020/07/24 08:50
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Y_Miz

2020/07/24 08:41

早速ご回答いただき、ありがとうございます。 ``` lines_after = list(map(lines.pop,l_XXX_i)) ``` を試したところ、下記のエラーが出力されました。 ``` IndexError: pop index out of range ``` 心当たりございますでしょうか。
退会済みユーザー

退会済みユーザー

2020/07/24 08:42

少々お待ちを
退会済みユーザー

退会済みユーザー

2020/07/24 08:51

修正かけました。ご確認ください。
Y_Miz

2020/07/24 14:10 編集

ご確認ありがとうございます。 ``` lines_after = list(map(remove, l_XXX_i)) ``` を試したところ、 ``` NameError: name 'remove' is not defined ``` が出力されました。 せっかくご提案いただきましたが、下記の通り、強引に('XXX'が現れる先頭行を消す操作を繰り返す)対処しました。 ``` l_XXX_i = [i for i, line in enumerate(lines) if 'XXX' in line] for j in range(len(l_XXX_i)): l_XXX_inside = [i for i, line in enumerate(lines) if 'XXX' in line] lines.pop(l_XXX_inside[0]) print(lines) ``` 未だ、丸括弧()を使うべきなのか、角括弧[]を使うべきなのか分かりません。 良い教科書などございましたら、ご教示いただけますと幸いです。
退会済みユーザー

退会済みユーザー

2020/07/24 20:31

教科書ですか...自分が個人的におすすめなのはみんなのpythonという本です。これを読めばpythonを不自由なく使うことは可能になります。評価も高いですし、買って損はないと思います。
Y_Miz

2020/07/25 00:54

ありがとうございます。 触って間もないため、是非購入したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問