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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Python

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

Q&A

解決済

1回答

7010閲覧

Python csvファイルに指数で書き込まない

sabotenn

総合スコア14

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Python

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

0グッド

0クリップ

投稿2020/05/06 13:26

編集2020/05/08 04:57

あるcsvファイルから値を読みだして別のcsvファイルに書き込みを行いますが
printではすべての桁数表示されますが、書き込んだcsvファイルは指数表示になってしまいます。

指数表示ではなくすべての桁数をcsvファイルとして保存しておきたいです。

Python

1data_file = open('AAA.csv') 2data_reader = csv.reader(data_file) 3 4 5for row in data_reader: 6 hasou_data = list(row) 7 print(hasou_data) 8 9 upload_file = open('BBB.csv','a',newline='') 10 upload_write = csv.writer(upload_file) 11 upload_write.writerow(hasou_data) 12 upload_file.close() 13```

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

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

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

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

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

meg_

2020/05/06 14:22

・タイトルの「Physon」は「Python」ですか? ・コードは「コードの挿入」で記入してください。 ・csvファイルのサンプルを提示してください。 ・タグに「pandas」とありますがコード中に出てきません。どういう意味で付けたのでしょうか?
magichan

2020/05/06 14:47 編集

csv.reader() は基本的にデータを文字列として読み込みます。 上記のソースコードにはその文字列を数値に変換する処理が見当たりませんので、csv.writer() ではその文字列を文字列のまま CSVデータに書き込むかと思われます。 ですので質問にあるような「print文では全ての桁数が表示されていたのに、CSVファイルでは指数表示になっている」ことは起こらないように思うのですが、本当に上記のコードにて指数表記に勝手に変換されるようなことが起こったのでしょうか?
magichan

2020/05/06 14:47 編集

ちなみに、データが数値型(浮動小数型)のデータに変換されているのであれば、指数表記に変換されることはありえます。
sabotenn

2020/05/08 04:53

ご回答ありがとうございます。 確認したところprint文でも指数表示になっていました。申し訳ありません。 読みだすcsvも既に指数表示になっており、列により文字列、数値が混ざっているため、指数表示されてしまう箇所のみ数値型にして読み出し、新たなcsvファイルに書き込みにはどうすればよいのでしょうか?
sabotenn

2020/05/08 04:54

meg_さん  いろいろとご指摘ありがとうございます。  正しく質問できずにすみません。
guest

回答1

0

ベストアンサー

文字列として読み込んだデータを

文字列 → 少数 → 少数表記の文字列

のように変換して、CSVファイルに書き込むのはどうですか?
こんな感じで実現できるかと思います。

Python

1data_file = open('AAA.csv') 2data_reader = csv.reader(data_file) 3 4for row in data_reader: 5 hasou_data = [f'{float(d):f}' for d in row] 6 upload_file = open('BBB.csv','a',newline='') 7 upload_write = csv.writer(upload_file) 8 upload_write.writerow(hasou_data) 9 upload_file.close()

ただ、上記ではデータの中に少数に変換できないデータがある場合ValueErrorが発生しますので、その場合はこうなります。(例外が発生した場合は元のデータを書いておく)

Python

1data_file = open('AAA.csv') 2data_reader = csv.reader(data_file) 3 4for row in data_reader: 5 hasou_data = [] 6 for d in row: 7 try: 8 new_data = f'{float(d):f}' 9 except ValueError: 10 new_data = d 11 hasou_data.append(new_data) 12 13 upload_file = open('BBB.csv','a',newline='') 14 upload_write = csv.writer(upload_file) 15 upload_write.writerow(hasou_data) 16 upload_file.close()

ただ、少数→文字列の際に桁数が丸められる可能性がありますので、最大桁数を指定したほうが良いかもしれませんね。


【補足】

f'{float(d):f}'

の部分は

Python

1num = float(d) # d を float型に変換 2"{:f}".format(num) # num を少数表記で文字列変換

を1行で書いた感じです。
f'{}' という書き方は Python 3.6 で導入された f-strings(f文字列)ってやつで、
{0:f}.format(num)f'{num:f}'のように書けます。今回は更にnum = float(d)` も展開されて

f'{float(d):f}'

となってます。

投稿2020/05/08 08:04

編集2020/05/08 09:37
magichan

総合スコア15898

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

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

sabotenn

2020/05/08 09:00

回答ありがとうございました。 すみません。初心者でf'{float(d):f}' が何を示しているのか教えていただきたいです。 実施してみましたが、やはり書き込んだファイルは指数表示になってしまいます。 csvファイルデータは下記のような値です。 334315-20191017-00044015 696519073 4.29378E+11 ←ここが指数になってしまいます。 本当は429378078021 1003 2020/5/5
magichan

2020/05/08 09:20

確認です。上記のようなデータの場合に3行目だけを変換したいということですか?
magichan

2020/05/08 09:26

ちなみに、私の環境で AAA.csv に上記の5行のデータを入れて動作確認したところ BBB.csvは 334315-20191017-00044015 696519073.000000 429378000000.000000 1003.000000 2020/5/5 と変換されておりました(2行目・4行目も無条件少数変換したのでこうなる)
magichan

2020/05/08 09:37

f'{float(d):f}' の部分は回答に補足を書きました
sabotenn

2020/05/10 07:20

丁寧なご回答ありがとうございました。 私も変換した後のprintで表示すると本当の値(429378078021)が出てきますが BBB.csvファイルを見ると指数で表示されてしまいます。 元のAAA.csvが指数表示になっているからでしょうか? 1003もprintは1003.000000となりますが、BBB.csvでは1003表示になります。 また小数点表示は必要ではなく、3行目のみintで表示したいのですが。 何度も質問させていただきすみません。
sabotenn

2020/05/10 07:35

エディタの問題でした。csvをエクセルで開いたいたので、たのエディタで開いたら正しく変換できており 何もしなくても指数表示されませんでした。 色々と助けていただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問