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

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

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

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

Q&A

1回答

2209閲覧

pythonでthreadを使ってエクセルにデータを読み込みたいです.

jvdt41563

総合スコア12

Python

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

0グッド

0クリップ

投稿2018/06/12 09:27

pythonでthreadを使い,エクセルにデータを書き込むプログラムを書いたのですが,threadの利用前のプログラムではエクセルにデータを読み込めるのですが,threadの利用後のプログラムではエクセルに読み込むデータが飛び飛びで全てのデータを読み込むことが出来ません.

threadの利用前

import serial import time import openpyxl PORT1 = 'COM3' PORT2 = 'COM5' com1 = serial.Serial(PORT1, timeout = 0.1) com2 = serial.Serial(PORT2, timeout = 0.1) raw_acc_1 = [0, 0, 0] raw_acc_2 = [0, 0, 0] wb = openpyxl.load_workbook('test.xlsx') sheet = wb.get_sheet_by_name('test_serial2') for i in range(2,31): while True: if com1.read() == 'B': data = com1.read(17) time_stamp_1 = raw_acc_1[0] = raw_acc_1[1] = raw_acc_1[2] = break else: time.sleep(0.001) while True: if com2.read() == 'B': data = com2.read(17) time_stamp_2 = raw_acc_2[0] = raw_acc_2[1] = raw_acc_2[2] = break else: time.sleep(0.001) sheet.cell(row =i,column =1).value = str(time_stamp_1) sheet.cell(row =i,column =2).value = str(raw_acc_1[0]) sheet.cell(row =i,column =3).value = str(raw_acc_1[1]) sheet.cell(row =i,column =4).value = str(raw_acc_1[2]) sheet.cell(row =i,column =5).value = str(raw_gyro_1[0]) sheet.cell(row =i,column =6).value = str(raw_gyro_1[1]) sheet.cell(row =i,column =7).value = str(raw_gyro_1[2]) sheet.cell(row =i,column =8).value = str(raw_comp_1[0]) sheet.cell(row =i,column =9).value = str(raw_comp_1[1]) sheet.cell(row =i,column =10).value = str(raw_comp_1[2]) sheet.cell(row =i,column =11).value = str(time_stamp_2) sheet.cell(row =i,column =12).value = str(raw_acc_2[0]) sheet.cell(row =i,column =13).value = str(raw_acc_2[1]) sheet.cell(row =i,column =14).value = str(raw_acc_2[2]) sheet.cell(row =i,column =15).value = str(raw_gyro_2[0]) sheet.cell(row =i,column =16).value = str(raw_gyro_2[1]) sheet.cell(row =i,column =17).value = str(raw_gyro_2[2]) sheet.cell(row =i,column =18).value = str(raw_comp_2[0]) sheet.cell(row =i,column =19).value = str(raw_comp_2[1]) sheet.cell(row =i,column =20).value = str(raw_comp_2[2]) wb.save('test.xlsx') print 'fin' com1.close() com2.close()

threadの利用後

import time import threading import serial import openpyxl PORT1 = 'COM3' PORT2 = 'COM5' com1 = serial.Serial(PORT1, timeout = 0.1) com2 = serial.Serial(PORT2, timeout = 0.1) raw_acc_1 = [0, 0, 0] raw_acc_2 = [0, 0, 0] wb = openpyxl.load_workbook('test.xlsx') sheet = wb.get_sheet_by_name('test_serial2') def foo(): for i in range(2,31): while True: if com1.read() == 'B': data = com1.read(17) time_stamp_1 = raw_acc_1[0] = raw_acc_1[1] = raw_acc_1[2] = raw_gyro_1[0] = raw_gyro_1[1] = raw_gyro_1[2] = raw_comp_1[0] = raw_comp_1[1] = raw_comp_1[2] = break else: time.sleep(0.001) sheet.cell(row =i,column =1).value = str(time_stamp_1) sheet.cell(row =i,column =2).value = str(raw_acc_1[0]) sheet.cell(row =i,column =3).value = str(raw_acc_1[1]) sheet.cell(row =i,column =4).value = str(raw_acc_1[2]) sheet.cell(row =i,column =5).value = str(raw_gyro_1[0]) sheet.cell(row =i,column =6).value = str(raw_gyro_1[1]) sheet.cell(row =i,column =7).value = str(raw_gyro_1[2]) sheet.cell(row =i,column =8).value = str(raw_comp_1[0]) sheet.cell(row =i,column =9).value = str(raw_comp_1[1]) sheet.cell(row =i,column =10).value = str(raw_comp_1[2]) wb.save('test.xlsx') def foo2(): for i in range(2,31): while True: if com2.read() == 'B': data = com2.read(17) time_stamp_2 = raw_acc_2[0] = raw_acc_2[1] = raw_acc_2[2] = raw_gyro_2[0] = raw_gyro_2[1] = raw_gyro_2[2] = raw_comp_2[0] = raw_comp_2[1] = raw_comp_2[2] = break else: time.sleep(0.001) sheet.cell(row =i,column =12).value = str(raw_acc_2[0]) sheet.cell(row =i,column =13).value = str(raw_acc_2[1]) sheet.cell(row =i,column =14).value = str(raw_acc_2[2]) sheet.cell(row =i,column =15).value = str(raw_gyro_2[0]) sheet.cell(row =i,column =16).value = str(raw_gyro_2[1]) sheet.cell(row =i,column =17).value = str(raw_gyro_2[2]) sheet.cell(row =i,column =18).value = str(raw_comp_2[0]) sheet.cell(row =i,column =19).value = str(raw_comp_2[1]) sheet.cell(row =i,column =20).value = str(raw_comp_2[2]) wb.save('test.xlsx') th=threading.Thread(target=foo) th2=threading.Thread(target=foo2) th.start() th2.start()

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

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

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

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

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

guest

回答1

0

openpyxl thread safe?
workbook modification is not thread safe
によると、同一ワークブックに対する変更はスレッドセーフではないそうです。
よって、意図しない結果になっているものと思われます。
別ワークブックへ書き込むなど別の手段をとるしかないようです。

投稿2018/06/12 09:39

編集2018/06/12 09:40
can110

総合スコア38262

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問