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

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

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

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

Python

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

Q&A

解決済

1回答

11506閲覧

Pythonの文字列置換について

under

総合スコア12

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2019/01/05 07:18

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

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

python

1import numpy as np 2import sys 3import io 4 5x = open("test.txt", "r") 6y = open("test.txt", "r") 7z = open("test2.txt", "w") 8 9gyou = sum(1 for i in x) 10print(gyou-2) 11maxime = gyou-2 12 13data=[] 14for i in range(22): 15 y.readline() 16for i in range(maxime): 17 lines1 = y.readline() 18 data.append(lines1) 19 20print(data) 21 22z.writelines(data) 23 24x.close() 25y.close() 26z.close() 27 28z = open("test2.txt", "r") 29n = open("test3.txt", "w") 30 31bad_words = ['Channels', 'Samples', 'Date', 'Time', 'Y_Unit_Label', 32 'X_Dimension', 'X0', 'Delta_X', '***End_of_Header***', 'X_Value', '\n'] 33 34with z as oldfile, n as newfile: 35 for line in oldfile: 36 if not any(bad_word in line for bad_word in bad_words): 37     n.replace('\t', ',') 38 n.writelines(line) 39 40z.close() 41n.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

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

replaceはstrのメソッドです。

diff

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

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

Python

1with open("test2.txt", "r") as oldfile, \ 2 open("test3.txt", "w") as newfile: 3 4 for line in oldfile: 5 if any(bad_word in line for bad_word in bad_words): 6 continue 7 8 line = line.replace('\t', ',') 9 newfile.write(line)
  • with文を使うなら、生の open/close は不要です。
  • continueを使うと、『~のときはスキップ』という処理を素直に書けます。
  • 一行だけ書き出すのなら、writelinesよりwriteの方が自然です。

投稿2019/01/05 07:21

編集2019/01/05 07:51
LouiS0616

総合スコア35658

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

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

under

2019/01/05 07:25

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

2019/01/05 07:34

試してみたところ、7777\t8888\nとだけ書き出されました。 同じような結果になっているでしょうか? また、bad_wordsの役割を教えていただいても良いでしょうか。 bad_wordsが一つでも含まれている行は出力しない、ということでしょうか。
under

2019/01/05 07:45

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

2019/01/05 07:50

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

2019/01/05 07:56

ご丁寧に追記までありがとうございます。 元のコードと比べ、すっきりした感じがあります。 これで、この質問の本題とは少し外れますが… 3333,4444\n \n ←これ 5555,6666\n を消すだけになりました…。 もう少し頑張ってみます、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問