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

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

ただいまの
回答率

89.06%

list型からint型への変換

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 116

Y_Miz

score 2

前提・実現したいこと

あるテキストファイルについて、文字列'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'
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

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

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

lines_after = [line for line in lines if 'XXX' not in line]

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

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

おまけ

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

with open(rfile) as fin, open(wfile) as fout:
    for line in fin:
        if 'XXX' in line:
            continue

        fout.write(line)

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

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

def remove(x):
    lines.pop(x)
    return lines


with open(rfile) as f:
    lines = f.readlines()
l_XXX_i = [i for i, line in enumerate(lines) if 'XXX' in line]
lines_after = list(map(remove, l_XXX_i))
with open(wfile, mode='w') as f:
    f.writelines(lines_after)


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

list(map(int,l_XXX_i))

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/24 23:09 編集

    ご確認ありがとうございます。

    ```
    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/25 05:31

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

    キャンセル

  • 2020/07/25 09:54

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

    キャンセル

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

  • ただいまの回答率 89.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る