実現したいこと
Python初心者です。初書き込み失礼します。
Pythonを使用してエクセルを開いたままエクセル上で更新されるデータを同じシートの別のセルに転記してそのシートをcsvファイルとして保存し、csvデータを読み込むためのプログラムを作成中です。
発生している問題・分からないこと
while文にてClass1~8をループさせているのですが、Class6の挙動が1回目と2回目で違ってしまい、2回目の挙動が望まない動作をしてしまいます。
具体的にはClass5が実行されたあとはエクセルへのデータ転記→Sheet0.csvの保存→Sheet1.csvの保存となるはずなのですが、2回目のwhile文の動作でSheet0、Sheet1の保存→データの転記→もう一度Sheet0、Sheet1の保存となり同名データがあるため上書き保存の警告で動作が中断します。1回目の動作と同じ挙動にしたいです。宜しくお願いします。
エラーメッセージ
error
1エラーメッセージはありません。
該当のソースコード
python,
1import os 2import xlwings as xw 3import win32com.client 4 5 6# Class17class FileDeleterSheet2:8 def __init__(self, file_path_sheet2):9 self.state = 'initial' # 初期状態10 self.file_path_sheet2 = file_path_sheet2 11 12 # Sheet2.csvを削除13 def delete_file_sheet2(self):14 try:15 if os.path.exists(self.file_path_sheet2):16 os.remove(self.file_path_sheet2)17 print(f"File {self.file_path_sheet2} has been deleted successfully.")18 else:19 print(f"File {self.file_path_sheet2} does not exist.")20 except PermissionError:21 print(f"Permission denied. Cannot delete {self.file_path_sheet2}.")22 except Exception as e:23 print(f"An error occurred: {e}")24 25 self.state = 'updated' # インスタンス変数を更新26 27 print("Class1実行完了")28 29 30# 使用例31file_path_sheet2= "C:\\Users\\PC_User\\Desktop\\test_file_dummy\\Sheet2.csv"32deleter = FileDeleterSheet2(file_path_sheet2)33deleter.delete_file_sheet2()34 35 36 37# Class238class DummyFileCreator:39 def __init__(self, sheet_name, dummy_folder, save_folder):40 self.state = 'initial' # 初期状態41 self.wb = xw.books.active 42 self.sht = xw.sheets[sheet_name]43 self.dummy_folder = dummy_folder 44 self.save_folder = save_folder 45 self.dummy_file_path = None46 self.csv_file_path = None47 48 # フォルダ内のファイル数をカウントする49 def count_files(self):50 try:51 file_list = os.listdir(self.dummy_folder)52 return len(file_list)53 except FileNotFoundError:54 return 055 56 # Sheet(ダミーファイル + 2)の名前に変更するための設定 57 def save_dummy_csv(self):58 file_count = self.count_files()59 dummy_file_name = f'Sheet{file_count + 2}.csv'60 self.dummy_file_path = os.path.join(self.dummy_folder, dummy_file_name)61 self.sht.api.SaveAs(self.dummy_file_path, FileFormat=6)62 # ここで CSV ファイルを保存する処理を実装してください63 print(f"ダミーファイルSheet{file_count +2}を作成しました")64 65 self.state = 'updated' # インスタンス変数を更新66 67 print("Class2実行完了")68 69 70# 使用例71if __name__ == "__main__":72 dummy_folder_path = "C:\\Users\\PC_User\\Desktop\\test_file_dummy"73 save_folder_path = "C:\\Users\\PC_User\\Desktop\\test_file_save"74 handler = DummyFileCreator("Sheet1", dummy_folder_path, save_folder_path)75 handler.save_dummy_csv()76 77 78 79 80# Class381class FileDeleterSheet0:82 def __init__(self, file_path_sheet0):83 self.state = 'initial' # 初期状態84 self.file_path_sheet0 = file_path_sheet0 85 86 # Sheet0.csvを削除87 def delete_file_sheet0(self):88 try:89 if os.path.exists(self.file_path_sheet0):90 os.remove(self.file_path_sheet0)91 print(f"File {self.file_path_sheet0} has been deleted successfully.")92 else:93 print(f"File {self.file_path_sheet0} does not exist.")94 except PermissionError:95 print(f"Permission denied. Cannot delete {self.file_path_sheet0}.")96 except Exception as e:97 print(f"An error occurred: {e}")98 99 self.state = 'updated' # インスタンス変数を更新100 101 print("Class3実行完了") 102 103# 使用例104file_path_sheet0= "C:\\Users\\PC_User\\Desktop\\test_file_save\\Sheet0.csv"105deleter = FileDeleterSheet0(file_path_sheet0)106deleter.delete_file_sheet0()107 108 109 110# Class4111class FileDeleterSheet1:112 def __init__(self, file_path_sheet1):113 self.state = 'initial' # 初期状態114 self.file_path_sheet1 = file_path_sheet1 115 116 # Sheet1.csvを削除117 def delete_file_sheet1(self):118 try:119 if os.path.exists(self.file_path_sheet1):120 os.remove(self.file_path_sheet1)121 print(f"File {self.file_path_sheet1} has been deleted successfully.")122 else:123 print(f"File {self.file_path_sheet1} does not exist.")124 except PermissionError:125 print(f"Permission denied. Cannot delete {self.file_path_sheet1}.")126 except Exception as e:127 print(f"An error occurred: {e}")128 129 self.state = 'updated' # インスタンス変数を更新130 print("Class4実行完了") 131 132# 使用例133file_path_sheet1 = "C:\\Users\\PC_User\\Desktop\\test_file_save\\Sheet1.csv"134deleter = FileDeleterSheet1(file_path_sheet1)135deleter.delete_file_sheet1()136 137 138 139 140# Class5141class SheetRenamer:142 def __init__(self, sheet_index, new_name):143 self.state = 'initial' # 初期状態144 self.xl_app = win32com.client.GetObject(Class='Excel.Application')145 self.workbook = self.xl_app.Workbooks(1) # 1 番目のワークブックを指定146 147 148 def rename_sheet(self, sheet_index, new_name):149 try:150 sheet = self.workbook.Sheets(sheet_index)151 sheet.Name = new_name 152 print(f"Sheet {sheet_index} の名前を {new_name} に変更しました。")153 except Exception as e:154 print(f"エラー: {e}")155 156 self.state = 'updated' # インスタンス変数を更新157 print("Class5実行完了")158 159# クラスをインスタンス化160renamer = SheetRenamer(sheet_index=1, new_name='Sheet1')161renamer.rename_sheet(sheet_index=1, new_name='Sheet1')162 163 164 165 166 167# Class6168class Class6Test6:169 def __init__(self, sheet_name, output_folder):170 self.state = 'initial' # 初期状態171 172 self.wb = xw.books.active 173 self.sht = xw.sheets[sheet_name]174 self.output_folder = output_folder 175 self.file_number = 1176 self.count = 0177 178 179 def job(self):180 a1value = self.sht.range('A1').value 181 self.sht.range('A' + str(self.sht.cells.last_cell.row)).end('up').offset(1, 0).value = a1value # 1182 a1value = self.sht.range('B1').value 183 self.sht.range('B' + str(self.sht.cells.last_cell.row)).end('up').offset(1, 0).value = a1value # 2184 185 186 187 print(f"Job executed: {a1value}") # デバッグ用プリント文188 189 190 def save_csv(self):191 csv_file_name1 = f'Sheet{self.file_number - 1}.csv' #Sheet0のCSV保存設定192 csv_file_path1 = os.path.join(self.output_folder, csv_file_name1)193 194 csv_file_name2 = f'Sheet{self.file_number}.csv' #Sheet1のCSV保存設定195 csv_file_path2 = os.path.join(self.output_folder, csv_file_name2)196 197 198 # シート保存とクリアタイミングの設定199 self.sht.api.SaveAs(csv_file_path1, FileFormat=6) #Sheet0のCSV保存200 self.sht.api.SaveAs(csv_file_path2, FileFormat=6) #Sheet1のCSV保存201 print(f"Saved CSV: {csv_file_path1}, {csv_file_path2}") # デバッグ用プリント文202 203 last_row = self.sht.cells.last_cell.row 204 if last_row >= 3:205 self.sht.range(f'A2:B{last_row}').clear_contents()206 self.file_number += 1207 self.count = 0208 209 210 def run(self): #実行ファイルメソッド211 for _ in range(11): # 11回のイテレーションを実行212 self.job() # self.job メソッドまたは関数を実行213 print(f"Iteration: {_}") # デバッグ用プリント文214 215 # 最後にシートを保存216 self.save_csv()217 self.state = 'updated' # インスタンス変数を更新218 219 print("Class6実行完了")220 221 222 223# 使用224if __name__ == "__main__":225 exporter = Class6Test6(sheet_name="Sheet1", output_folder="C:\\Users\\PC_User\\Desktop\\test_file_save")226 exporter.run()227 228 229 230# Class7231class Class7Test7:232 def __init__(self):233 self.state = 'initial'234 235 def test7(self):236 237 print("test7")238 239 self.state = 'updated' # インスタンス変数を更新240 241 print("Class7実行完了")242 243class7test7 = Class7Test7()244class7test7.test7()245 246 247# Class8248class Class8Test8:249 def __init__(self):250 self.state = 'initial' 251 252 def test8(self):253 254 print("test8")255 256 self.state = 'noneupdated' # インスタンス変数を更新しない257 258 print("Class8実行完了")259 260class8test8 = Class8Test8()261class8test8.test8()262 263 264def main():265 class1_instance = FileDeleterSheet2(file_path_sheet2)266 class2_instance = DummyFileCreator("Sheet1", dummy_folder_path, save_folder_path)267 class3_instance = FileDeleterSheet0(file_path_sheet0)268 class4_instance = FileDeleterSheet1(file_path_sheet1)269 class5_instance = SheetRenamer(sheet_index=1, new_name='Sheet1')270 class6_instance = Class6Test6(sheet_name="Sheet1", output_folder="C:\\Users\\PC_User\\Desktop\\test_file_save")271 class7_instance = Class7Test7()272 class8_instance = Class8Test8() 273 274 275 while class8_instance.state != 'updated':276 class1_instance.delete_file_sheet2()277 class2_instance.count_files()278 class2_instance.save_dummy_csv()279 class3_instance.delete_file_sheet0()280 class4_instance.delete_file_sheet1()281 class5_instance.rename_sheet(sheet_index=1, new_name='Sheet1')282 class6_instance.job()283 class6_instance.save_csv()284 class6_instance.run()285 class7_instance.test7()286 class8_instance.test8()287 288 break289 290 291 print("Done!")292 293if __name__ == "__main__":294 main()295 296 297
試したこと・調べたこと
上記の詳細・結果
原因が不明で、AIチャットでもお手上げでした。
補足
特になし
0 コメント