私がやっていることの背景:
Microsoft OLE 構造化ストレージ ファイル タイプを読み書きするプロセスを開発するために、Python 3 でプログラムを作成しています。ユーザーが tkinter、PySimpleGUI を使用して読み書きするストレージとストリームを選択できるシンプルな GUI を作成できます。私は olefile、pandas、および numpy パッケージを使用してほとんどのプログラムのレッグワークを実行していますが、olefile で次のような既知の問題に遭遇しました。
書き込まれるバイトストリームのサイズは、OLE ファイル内の既存のバイトストリームと同じサイズでなければなりません。これは、プログラムのデバッグを開始してから比較的すぐに問題になりました。
私は何をする必要がありますか?
主要なプログラミング サイトを徹底的に調査し、Win32 での Python プログラミング (具体的には COM ストレージで Ch12 を読む) という本を購入しました。私は行き止まりに陥ってしまいました。
https://github.com/joxeankoret/nightmare/blob/master/mutators/OleFileIO_PL.py
https://github.com/decalage2/olefile/issues/6
https://github.com/decalage2/olefile/issues/95
https://github.com/decalage2/olefile/issues/99
以下は、私が使用している骨抜きのコードです。
file_path = values[0]
xl_path = values[1]
data = olefile.OleFileIO(file_path)
storages = olefile.OleFileIO.listdir(data, streams=False, storages=True)
streams = olefile.OleFileIO.listdir(data, streams=True, storages=False)
stmdata = data.openstream(streams[index])
readData = data.openstream(streams[index]).read()
#Send the data into Excel to be manipulated by User
with pd.ExcelWriter(xl_path, engine='openpyxl') as ew:
ew.book = xl.load_workbook(xl_path)
df.to_excel(ew, sheet_name=tabNames)
データが操作されます。今度はそれを読み戻します。
Pandas を使用してデータを DataFrame に読み込む
df1 = pd.read_excel(xls, x, encoding='utf-8', header=None)
newDF = newDF[0].str.encode(encoding="utf-8")
byteString = newDF[0]
次のステートメントは、等しいサイズの ByteString のみを許可します
data.write_stream(streams[setIndex], byteString)
ValueError: write_stream: データは既存のストリームと同じサイズでなければなりません
編集:
この質問は、以下のコメントで Decalade によって回答されました。私の問題を解決するために使用したコードは次のとおりです。
istorage = pythoncom.StgOpenStorageEx(file_path, mode, STGFMT_STORAGE, 0, pythoncom.IID_IStorage)
istorage1 = istorage.OpenStorage(stgRelays, None, mode, None, 0)
istorage2 = istorage1.OpenStorage(storage_choice, None, mode, None, 0)
for x in set_compArr:
set_STM = x + '.TXT'
istream = istorage2.OpenStream(set_STM, None, mode, 0)
istream.Write(byteString)