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

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

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

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

Q&A

解決済

3回答

477閲覧

ファイル内のある行を10倍して,そこだけ差し替えて特殊文字が入らないように出力したい

tk-3113

総合スコア21

Python

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

0グッド

0クリップ

投稿2022/01/05 12:25

編集2022/01/05 14:04

リスト型の数字や文字を書式?というか[]や,が出ないように出力したいです.

したいこととしては,以下のようなファイルがあり,これの左から3,4,5行目の値を10倍し
その倍した行だけ変更してほかの部分は変更せず,[]や,'',,が出ないように出力したいです.

1 39 21.594828 -18.062821 -2.148329 1 A 38 -1.50000 -1.50000 "IPT " " N " 7 -1 2E2EFF 0 0 0 0 1 1 1 1 1 4 1 1
2 2 -1.209242 3.773569 -3.198849 1 A 10 0.00000 0.00000 "IPT " " C " 6 0 1EE11E 0 0 0 0 2 2 2 1 2 4 2 1
3 2 -1.423336 4.877664 -4.110872 1 A 10 -0.11500 -0.11500 "IPT " " C " 6 0 1EE11E 0 0 0 0 3 3 3 1 3 4 3 1
4 2 -0.736323 6.078586 -3.853030 1 A 10 -0.11500 -0.11500 "IPT " " C " 6 0 1EE11E 0 0 0 0 4 4 4 1 4 4 4 1

これが続いていくようなファイルです.わかりづらくて申し訳ないですが,入りきらず折り返されているように見えますが実際は1EE11Eの後に0 0 0...が続いており上記の例では4列です.
プログラムは以下まで組めて3,4,5行目の10倍まではできています.

lang

1f = open(f'{os.getcwd()}/上記のファイル.txt') 2 frs = f.read().splitlines() 3 4 bai = int(10) 5 even_listx=[] 6 even_listy=[] 7 even_listz=[] 8 for i in frs: 9 t = i.split() 10 even_listx.append(float(t[2])) 11 even_listy.append(float(t[3])) 12 even_listz.append(float(t[4])) 13 14 listx = [i*bai for i in even_listx] 15 listy = [i*bai for i in even_listy] 16 listz = [i*bai for i in even_listz]
最後のlistx,listy,listzに10倍したものが入っていますこれを

1 39 215.94828 -180.62821 -21.48329 1 A 38 -1.50000 -1.50000 "IPT " " N " 7 -1 2E2EFF 0 0 0 0 1 1 1 1 1 4 1 1
2 2 -12.09242 37.73569 -31.98849 1 A 10 0.00000 0.00000 "IPT " " C " 6 0 1EE11E 0 0 0 0 2 2 2 1 2 4 2 1
3 2 -14.23336 48.77664 -41.10872 1 A 10 -0.11500 -0.11500 "IPT " " C " 6 0 1EE11E 0 0 0 0 3 3 3 1 3 4 3 1
4 2 -7.36323 60.78586 -38.53030 1 A 10 -0.11500 -0.11500 "IPT " " C " 6 0 1EE11E 0 0 0 0 4 4 4 1 4 4 4 1

という感じで出力したいです.よろしくお願いいたします。

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

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

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

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

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

tk-3113

2022/01/05 13:59 編集

```lang-Python3 if __name__ == '__main__': f = open(f'{os.getcwd()}/上記のコード.txt') frs = f.read().splitlines() bai = int(10) even_listx=[] even_listy=[] even_listz=[] for i in frs: t = i.split() even_listx.append(float(t[2])) even_listy.append(float(t[3])) even_listz.append(float(t[4])) listx = [i*bai for i in even_listx] listy = [i*bai for i in even_listy] listz = [i*bai for i in even_listz] ```
tk-3113

2022/01/05 14:00

これで合っているでしょうか?使い方がよくわかっておらず申し訳ありません.
otn

2022/01/05 14:02

コメントに書いても無意味。質問本文を編集しましょう。
tk-3113

2022/01/05 14:04

ありがとうございます.質問本文を変更いたしました.
meg_

2022/01/05 14:16

> []や,'',,が出ないように出力したいです "出力"とは画面出力のことでしょうか?Pythonの実行環境は何でしょうか?(質問に追記してください)
tk-3113

2022/01/05 14:20

はい,画面出力です. Pythonの実行環境はLinuxのターミナル上で.pyファイルを $Python3 ~.py というように実行しています. 新たなファイルに出力したいとも思っています.
guest

回答3

0

浮動小数点数の誤差を防ぎたければ、Decimalを使いましょう。

python

1>>> print(frs) 2['1 39 21.594828 -18.062821 -2.148329 1 A 38 -1.50000 -1.50000 "IPT " " N " 7 -1 2E2EFF 0 0 0 0 1 1 1 1 1 4 1 1 ', '2 2 -1.209242 3.773569 -3.198849 1 A 10 0.00000 0.00000 "IPT " " C " 6 0 1EE11E 0 0 0 0 2 2 2 1 2 4 2 1 ', '3 2 -1.423336 4.877664 -4.110872 1 A 10 -0.11500 -0.11500 "IPT " " C " 6 0 1EE11E 0 0 0 0 3 3 3 1 3 4 3 1', '4 2 -0.736323 6.078586 -3.853030 1 A 10 -0.11500 -0.11500 "IPT " " C " 6 0 1EE11E 0 0 0 0 4 4 4 1 4 4 4 1'] 3>>> 4>>> from decimal import Decimal 5>>> bai = 10 6>>> for i in frs: 7... column1, column2, column3, column4, column5, rest = i.split(' ', 5) 8... print(column1, column2, (Decimal(column3)*bai).quantize(Decimal('0.00001')), (Decimal(column4)*bai).quantize(Decimal('0.00001')), (Decimal(column5)*bai).quantize(Decimal('0.00001')), rest) 9... 101 39 215.94828 -180.62821 -21.48329 1 A 38 -1.50000 -1.50000 "IPT " " N " 7 -1 2E2EFF 0 0 0 0 1 1 1 1 1 4 1 1 112 2 -12.09242 37.73569 -31.98849 1 A 10 0.00000 0.00000 "IPT " " C " 6 0 1EE11E 0 0 0 0 2 2 2 1 2 4 2 1 123 2 -14.23336 48.77664 -41.10872 1 A 10 -0.11500 -0.11500 "IPT " " C " 6 0 1EE11E 0 0 0 0 3 3 3 1 3 4 3 1 134 2 -7.36323 60.78586 -38.53030 1 A 10 -0.11500 -0.11500 "IPT " " C " 6 0 1EE11E 0 0 0 0 4 4 4 1 4 4 4 1

浮動小数点数の誤差が出ても良いなら以下です。

python

1>>> bai = 10 2>>> for i in frs: 3... column1, column2, column3, column4, column5, rest = i.split(' ', 5) 4... print(column1, column2, float(column3)*bai, float(column4)*bai, float(column5)*bai, rest) 5... 61 39 215.94828 -180.62821 -21.48329 1 A 38 -1.50000 -1.50000 "IPT " " N " 7 -1 2E2EFF 0 0 0 0 1 1 1 1 1 4 1 1 72 2 -12.092419999999999 37.735690000000005 -31.98849 1 A 10 0.00000 0.00000 "IPT " " C " 6 0 1EE11E 0 0 0 0 2 2 2 1 2 4 2 1 83 2 -14.23336 48.77664 -41.10872 1 A 10 -0.11500 -0.11500 "IPT " " C " 6 0 1EE11E 0 0 0 0 3 3 3 1 3 4 3 1 94 2 -7.36323 60.78586 -38.5303 1 A 10 -0.11500 -0.11500 "IPT " " C " 6 0 1EE11E 0 0 0 0 4 4 4 1 4 4 4 1 10

投稿2022/01/05 14:19

ppaul

総合スコア24670

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

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

tk-3113

2022/01/05 14:42

ご回答いただきありがとうございます. Decimal初めて聞きました.調べてみたいと思います. さらに追加の質問で申し訳ないのですが,baiの値が小数でも使用できるのでしょうか?
guest

0

追記

ppaulさんの回答のように浮動小数点の誤差をなくすためにはDecimalモジュールが必要です


for文を使って一つずつ出力すればいいのではないしょうか

lang=python

1items1 = [1, "a"] 2items2 = [2, "b"] 3 4for items in [items1, items2]: 5 for item in items: 6 print(item, end=" ") 7 print()

投稿2022/01/05 14:14

編集2022/01/05 14:25
wsb

総合スコア194

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

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

tk-3113

2022/01/05 14:44

ご回答いただきありがとうございます. なるほど,試してみます.ありがとうございます.
guest

0

ベストアンサー

一般的な、「行」「列」という言葉と逆にお使いのようです。

「各列は、空白1つで区切られている」
「3,4,5列目の数値を10倍して、それ以外はそのまま出力する」
という前提で、

Python

1with open("ファイル名") as f: 2 for line in f: 3 x = line.rstrip().split(" ") 4 for i in [2,3,4]: 5 x[i] = float(x[i])*10 6 print(*x,sep=" ")

投稿2022/01/05 14:27

otn

総合スコア85901

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

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

tk-3113

2022/01/05 14:40

ご回答いただきありがとうござます.行と列の言い方間違っていたのですね...気を付けます.ありがとうございます. 教えていただいた通り実行したら以下のように前の1,2,3列目が10倍されてしまいました... 10.0 390.0 215.94828 -18.062821 -2.148329 1 A 38 -1.50000 -1.50000 "IPT " " N " 7 -1 2E2EFF 0 0 0 0 1 1 1 1 1 4 1 1 20.0 20.0 -12.092419999999999 3.773569 -3.198849 1 A 10 0.00000 0.00000 "IPT " " C " 6 0 1EE11E 0 0 0 0 2 2 2 1 2 4 2 1 30.0 20.0 -14.23336 4.877664 -4.110872 1 A 10 -0.11500 -0.11500 "IPT " " C " 6 0 1EE11E 0 0 0 0 3 3 3 1 3 4 3 1 40.0 20.0 -7.36323 6.078586 -3.853030 1 A 10 -0.11500 -0.11500 "IPT " " C " 6 0 1EE11E 0 0 0 0 4 4 4 1 4 4 4 1
otn

2022/01/05 14:52

ファイルの先頭に空白が入っているとかでしょう。 空白が2つ入っているとそうなります。 「各列は、空白1つで区切られている」 が前提なので、その場合は空白のあたりが1列目2列目になるので、「5,6,7列目を10倍」になり、 [2,3,4] のところが2つずれて [4,5,6] ですね。 「各列は、空白1つで区切られている」という前提が正しくないなら、ファイル形式のちゃんとした説明が必要です。
tk-3113

2022/01/05 14:56

申し訳ありません,空白2つ前についておりました. ご丁寧に回答いただきありがとうございます.できました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問