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

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

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

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

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

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

Q&A

解決済

1回答

738閲覧

Python:リストを分割して貼り付けようとするとErrorが発生します

H.shin

総合スコア1

openpyxl

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

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

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

0グッド

0クリップ

投稿2022/07/08 02:32

編集2022/07/08 17:17

Python初学者です。
エクセルより特定列をコピーしてリスト化し、そのリストの先頭とNoneを含む要素を削除して成形を行いました。
その後、このリストを20個に分割して別のエクセルファイルの各シートへ貼り付けようという目的でプログラムを書いておりました。
テストとして、シート1に分割したリストの[0]番目を張り付けようとしたところ、以下のようなエラーメッセージが出てきました。

(エラーメッセージ追記)
Traceback (most recent call last):
File "\array_split.py", line 26, in <module>
ws2.append(row)
File "\worksheet.py", line 676, in append
self._invalid_row(iterable)
File "\worksheet.py", line 812, in _invalid_row
raise TypeError('Value must be a list, tuple, range or generator, or a dict. Supplied value is {0}'.format(
TypeError: Value must be a list, tuple, range or generator, or a dict. Supplied value is <class 'numpy.float64'>

プログラムは以下の通りです。
不足していることが多々あるかもしれませんが教えていただけると幸いです。よろしくお願いいたします。

python

1##モジュールインポート 2import openpyxl 3import numpy as np 4 5##データ読み込み 6wb1 = openpyxl.load_workbook('\\test_result.xlsx') 7ws1 = wb1.worksheets[0] 8 9 10##H列のデータをリスト化し、valuesに格納 11values = [ cell.value for cell in ws1['H'] ] 12 13##先頭のセルとNoneを消した上でvaluesのリストを20個に分割 14values.pop(0) 15 16while None in values: 17 values.remove(None) 18 19result = list(np.array_split(values, 20)) 20 21##別のワークシートを準備して、分割したresultの最初のリストをSheet1に張り付ける 22wb2 = openpyxl.load_workbook('\\Amino_acid.xlsx') 23ws2 = wb2.worksheets[0] 24 25for row in result[0]: 26 ws2.append(row) 27 28##保存 29wb2.save("final.xlsx")

追記
print(result)
とし、実際にどのようなデータが出てくるか確認すると
[array([10.46, 8.98, 4.46, 11.69, 14.41, 10.92, 23.1 , 54.92, 32.93]), array([ 34.17, 36.08, 36.94, 59.15, 60.2 , 60.16, 113.7 , 113.3 , 115.47]), array([1111. , 1111. , 1111. , 13.78, 14.69, 12.8 , 26.19,
30.23, 32.43]), ....
といった形で出力され、
print(result[0])
とすると
[10.46 8.98 4.46 11.69 14.41 10.92 23.1 54.92 32.93]
となります。
初学者ゆえ理解できていない部分が多いのですが、この場合だとresult[0]で出てきたデータはリストになっていないという事でしょうか・・・

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

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

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

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

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

y_waiwai

2022/07/08 02:37

このままではコードが読めないので、質問を編集し、</>(コードの挿入)ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
H.shin

2022/07/08 02:38

失礼しました。 すぐに対応します。
usekay

2022/07/08 03:25

エラーメッセージを省略しすぎているように思います。おそらくエラーメッセージに問題が発生した行数、問題の変数名なども記載されているのでそういったところを省略せずに質問されると良いかと思います。
H.shin

2022/07/08 04:23

申し訳ありません。追記させていただきました。
usekay

2022/07/08 06:03

print(type(result[0])) とすると実際の型を確認できますよ。
H.shin

2022/07/08 07:18

試したところ、以下のような出力になりました。 <class 'numpy.ndarray'> 調べてみたところ、多次元配列というものらしいです。 これをリスト化するというような方向で検討してみたいと思います。 知識不足故、なにか良い取り扱い方があれば参考にしたいです。
guest

回答1

0

ベストアンサー

エラーメッセージに『引数はlist, tuple, range ,generator, dictのいずれかのみ。指定された引数は <class 'numpy.float64'>』とあります。怪しいのはエクセルに書き込んでいる箇所なので

python

1for row in result[0]: 2 ws2.append(row)

python

1for row in result[0]: 2 ws2.append(row.tolist())

とすれば良いように思います。

投稿2022/07/08 03:20

usekay

総合スコア395

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

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

H.shin

2022/07/08 04:27

ご指摘の通りに直してみたところ、エラーメッセージの最後の部分が以下のように変わりましたが、出力はできませんでした。。。 TypeError: Value must be a list, tuple, range or generator, or a dict. Supplied value is <class 'float'> リストとして書き込んでいるとおもっているものが、実はリストになっていないということもあるのでしょうか。もう少し検討してみます。 回答ありがとうございます。
usekay

2022/07/08 07:33

for row in result: ws2.append(row.tolist()) ↑かも。resultが二重リストかと思ってました。
H.shin

2022/07/08 08:17

無事にエクセルファイルに出力できました。 typeを確認することで色々わかることがあるということを理解しました。 初めての自力pythonプログラムでしたが、ご協力のおかげで何とかなりそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問