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

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

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

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

openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python 3.x

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

Python

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

Q&A

解決済

1回答

6480閲覧

【Python3でcsvファイルをExcelに読み込む】数値データが文字列として読み込まれるので、数値に変換したい(数値として読み込みたい)

TEKKO

総合スコア8

CSV

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

openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2022/02/25 09:24

編集2022/02/25 09:42

Pythonでcsvデータを新規作成したExcelに読み込み処理を自動化したいと考えております。

数値データが文字列として読み込まれてしまい、解決方法を探しています。
対象の範囲だけ数値で読み込む、もしくは数値に変換する方法をご教示いただけませんでしょうか。


読み込むCSVデータ構成

cost.csv

1ID,012,035,123 2アカウント名,あああああ,かかかかか,ははははは 32021/1/1,45678,12345,98765 42021/2/1,34567,11234,98652
  • カンマ区切りの複数行データです。
  • 各行の先頭に見出しがあります。
  • 1行目はIDで先頭に0がつく場合があります(文字列で読み込みたい)
  • 3・4行目の日付以外は数値で読み込みを行いたい(Excel読み込み後に計算したい)

記載したpythonのコード

python

1#ライブラリを取り込む 2import openpyxl as excel 3import csv 4from datetime import datetime 5 6#新規ワークブックを作る 7book = excel.Workbook() 8 9#sheetの作成 10sheet = book.active 11 12#CSV読み込みファイル名指定 13csv_filename="cost.csv" 14 15#CSVファイルを開く 16with open(csv_filename, encoding="utf-8",newline="") as csvf: 17 #CSVファイルからデータを読み込む 18 data=csv.reader(csvf) 19 20 r=1 21 for line in data: 22 c=1 23 for v in line: 24 sheet.cell(row=c,column=r).value=v 25 c += 1 26 r += 1 27 28#年月を取得 29now = datetime.now() 30 31#ファイルを保存 32book.save('前月比較{}.xlsx'.format(now.strftime('%Y%m'))) 33 34#ファイルを閉じる 35book.close() 36

上記を実行すると、行列を入れ替えた状態でExcelに正常に読み込まれるのですが、1点課題があります。
各月の数値の値がテキスト形式(文字列)として読み込まれてしまっています。

試みたこと

そのため以下の処理を試みてみましたが、うまくいきません。

  • 値をfloat形式で読み込む
  • 書式設定を数値に指定する

以下が変更したコードになります。

python

1(省略) 2#CSVファイルを開く 3with open(csv_filename, encoding="utf-8",newline="") as csvf: 4 #CSVファイルからデータを読み込む 5 data=csv.reader(csvf) 6 7 r=1 8 for line in data: 9 10 c=1 11 for v in line: 12 if r>=2 and c>=3: 13 sheet.cell(row=c,column=r).number_format='#,##0' 14 sheet.cell(row=c,column=r).value=float(v) 15 else: 16 sheet.cell(row=c,column=r).value=v 17 c += 1 18 r += 1 19(省略) 20

補足

CSVから読み込んだデータをpython上でprint確認したところ、以下のように文字列として処理されていました

python

1[`ID`,`012`,`035`,`123`] 2[`アカウント名`,`あああああ`,`かかかかか`,`ははははは`] 3[`2021/1/1`,`45678`,`12345`,`98765`] 4[`2021/2/1`,`34567`,`11234`,`98652`]

今日1日色々調べて様々な方法で記述変更して試しているのですが、解決方法がわからずご質問いたしました。

*Python初学者で色々調べながらここまで来ましたが、基礎的な理解が足りていないと思います。
ただ、まず一つ形にしてみたく…助言いただけますと幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

CSVファイルの3行目以降について、第2列以降を整数型に変えればよいです。
,,のケースも考慮して、修正しました。

python3

1#ライブラリを取り込む 2import openpyxl as excel 3import csv 4from datetime import datetime 5 6#新規ワークブックを作る 7book = excel.Workbook() 8 9#sheetの作成 10sheet = book.active 11 12#CSV読み込みファイル名指定 13csv_filename="costs.csv" 14 15#CSVファイルを開く 16with open(csv_filename, encoding="utf-8",newline="") as csvf: 17 #CSVファイルからデータを読み込む 18 data=csv.reader(csvf) 19 20 r=1 21 for line in data: 22 if r > 2: 23 for i,v in enumerate(line): 24 if (i > 0) and (v.isdecimal() == True): 25 line[i] = int(v) 26 c=1 27 for v in line: 28 sheet.cell(row=c,column=r).value=v 29 c += 1 30 r += 1 31 32#年月を取得 33now = datetime.now() 34 35#ファイルを保存 36book.save('前月比較{}.xlsx'.format(now.strftime('%Y%m'))) 37 38#ファイルを閉じる 39book.close()

投稿2022/02/25 10:23

編集2022/02/25 22:18
tatsu99

総合スコア5438

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

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

TEKKO

2022/02/25 12:09 編集

早速のご回答ならびにコード付きでわかりやすく教えていただき、ありがとうございました! 頂いたコードをもとに実行したら無事数値として読み込みを行えました。 ありがとうございます。 1点追加でご教示可能でしたらおねがいしたいのですが、 以下のように、値が入っていない場合にValueErrorが表示されてしまいました。 === ID,012,035,123 アカウント名,あああああ,かかかかか,ははははは 2021/1/1,45678,,98765 2021/2/1,34567,,98652 === Nullがあっても、空白のセルとして読み込むことは可能でしょうか。 本来、別の質問として起票するべきかもしれませんが、よろしくお願いいたします。
tatsu99

2022/02/25 12:44

回答を修正しました。
TEKKO

2022/02/25 15:05 編集

,,のケースを考慮する件、自分なりに考えてみたのですが、解決できませんでした…。 コードの記述方法についてもヒント、助言をいただくことは可能でしょうか。 無理をお願いして恐縮ですが、よろしければよろしくお願いいたします。
tatsu99

2022/02/25 22:21

大変失礼しました。回答を修正したつもりでしたが、投稿した分が反映されていなかったようです。 再度、投稿しました。 for i,v in enumerate(line): if (i > 0) and (v.isdecimal() == True): line[i] = int(v) の箇所が修正した箇所です。
TEKKO

2022/02/26 05:00

再度、ご丁寧に教えていただきありがとございます。 おかげさまでいただいたコードにて実行したいことが本番のCSVでも問題なく実現できました。 インデックス値を付与できる?enumerate関数と文字列の中身を確認するisdecimalメソッドを全く知らなかったので、今回の実行内容も確認し、勉強させていただきました。 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問