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

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

ただいまの
回答率

90.46%

  • Python

    12341questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    10312questions

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

Pythonの文字列置換について

解決済

回答 1

投稿

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

under

score 2

こんばんわ。
分かりにくい質問内容でしたら申し訳ありません。

Pythonを使用して、テキストの文字列の特定文字を置換したいのですが出来ません…。
\tを,にと、テキストの中にある改行コードを削除したいのですが、エラーではじかれてしまいます。
超初心者で、つたないコードではありますが掲載します。

import numpy as np
import sys
import io

x = open("test.txt", "r")
y = open("test.txt", "r")
z = open("test2.txt", "w")

gyou = sum(1 for i in x)
print(gyou-2)
maxime = gyou-2

data=[]
for i in range(22):
    y.readline()
for i in range(maxime):
    lines1 = y.readline()
    data.append(lines1)

print(data)

z.writelines(data)

x.close() 
y.close()
z.close()

z = open("test2.txt", "r")
n = open("test3.txt", "w")

bad_words = ['Channels', 'Samples', 'Date', 'Time', 'Y_Unit_Label',
             'X_Dimension', 'X0', 'Delta_X', '***End_of_Header***', 'X_Value', '\n'] 

with z as oldfile, n as newfile: 
    for line in oldfile: 
     if not any(bad_word in line for bad_word in bad_words):
     n.replace('\t', ',')
         n.writelines(line)

z.close() 
n.close()

実行するとAttributeError: '_io.TextIOWrapper' object has no attribute 'replace'が出てきます。
調べてみはしたのですが、良く分からず解決しないままです…。
またデータ間に入る改行コードのみを消したいのですが、行頭文字を参照にした削除もうまくいかない状況です。

上記コードを用いて
1111\t2222\n
3333\t4444\n
\n
5555\t6666\n
7777\t8888\n

というデータを
1111,2222\n
3333,4444\n
5555,6666\n
7777,8888\n

にしたいと考えています。
質問内容が分かりにくくて申し訳ありません。
よろしければご回答のほうお願いいたします…。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

replaceはstrのメソッドです。

- n.replace('\t', ',')
+ line = line.replace('\t', ',')

全体的にも、改善の余地がいくつかあります。とりあえずコード後半だけ。

with open("test2.txt", "r") as oldfile, \
        open("test3.txt", "w") as newfile: 

    for line in oldfile:
        if any(bad_word in line for bad_word in bad_words):
            continue

        line = line.replace('\t', ',')
        newfile.write(line)
  • with文を使うなら、生の open/close は不要です。
  • continueを使うと、『~のときはスキップ』という処理を素直に書けます。
  • 一行だけ書き出すのなら、writelinesよりwriteの方が自然です。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/01/05 16:25

    ご回答ありがとうございます・
    早速試してみましたが、結果がファイルに出力されなくなってしまいました…。
    ご指摘いただいた部分を入れ替えるだけではダメなのでしょうか…?

    キャンセル

  • 2019/01/05 16:34

    試してみたところ、7777\t8888\nとだけ書き出されました。
    同じような結果になっているでしょうか?

    また、bad_wordsの役割を教えていただいても良いでしょうか。
    bad_wordsが一つでも含まれている行は出力しない、ということでしょうか。

    キャンセル

  • 2019/01/05 16:45

    お返事ありがとうございます。
    bad_wordsに指定していた\nを削除してrunし直しした結果、
    1111,2222\n
    3333,4444\n
    \n
    5555,6666\n
    7777,8888\n
    という結果になりました、お騒がせ致しました。
    bad_wordsの役割については、仰る通りです。
    こちらで\nを指定していた為、何も出力されていなかったようです…(全ての行の終わりに\nが含まれている)

    キャンセル

  • 2019/01/05 16:50

    なるほど。
    コードに改善の余地があるので、少しだけ追記しておきました。

    キャンセル

  • 2019/01/05 16:56

    ご丁寧に追記までありがとうございます。
    元のコードと比べ、すっきりした感じがあります。

    これで、この質問の本題とは少し外れますが…
    3333,4444\n
    \n ←これ
    5555,6666\n
    を消すだけになりました…。
    もう少し頑張ってみます、ありがとうございました!

    キャンセル

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

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

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

  • Python

    12341questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    10312questions

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