ltbams 1.0.10__py3-none-any.whl → 1.0.12__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,12 +1,12 @@
1
1
  ams/__init__.py,sha256=q-9-f0YCg6aaTW19VCkY6VosfvRA2ObI9mF1f_3016Y,313
2
2
  ams/__main__.py,sha256=EB4GfGiKgvnQ_psNr0QwPoziYvjmGvQ2yVsBwQtfrLw,170
3
- ams/_version.py,sha256=kccksMimNEDK-8pkw0RnSVrUE7NGH1_HlY85CE4sJgQ,498
3
+ ams/_version.py,sha256=jNLhv-DaZngBxRAi3mCJd0jmQgAAbgAoAn-N8TbLgbQ,498
4
4
  ams/cli.py,sha256=EyNFXn565gFCppTxpyTZviBdPgUuKtgAPZ4WE6xewRk,6164
5
- ams/interface.py,sha256=-I5dRdHQPxyHBDCp02eYuqyW1aleHwn_nGgTxFYAG1I,45248
5
+ ams/interface.py,sha256=-UN7-TiSt7mOS0W7526LuOk4KCIGDZSguRaVmh_KMRM,45240
6
6
  ams/main.py,sha256=lIqC16TO0pye75Wv8l_6EemNtm15iyMdvu8YQFkdd_4,23599
7
7
  ams/report.py,sha256=ewcffopOzT5o45eJNmcV8pxeQqPIjKbarGN33-yHGA8,10961
8
8
  ams/shared.py,sha256=4sY2U0sghs_S2V6C7Z0OyQ6WZRfpCXk2_Cf_Mg24Vr4,3900
9
- ams/system.py,sha256=kASxxtA6rQ2mCBdwGXd_M3FRTH8xSXE99h8UCPrMnfU,29773
9
+ ams/system.py,sha256=bGbZQrN5N2tx1tnxoPz6JSGE568EGH1Oi1zQIyLFLug,31948
10
10
  ams/cases/5bus/pjm5bus_demo.json,sha256=IpxO2vzB9-9Kg9xjOXREKeXEz9wjFE7cuQbcUu8VORA,23152
11
11
  ams/cases/5bus/pjm5bus_demo.xlsx,sha256=OWIUprkg8_aQ_bTCaEFMl7Bhfa1R20zxAHXRQtXBix0,32607
12
12
  ams/cases/5bus/pjm5bus_ev.xlsx,sha256=vR8dJv5jIxib1pgcMonhzvraoqZVJWhBSJdVXDL0qsI,19498
@@ -37,8 +37,8 @@ ams/cases/wecc/wecc.m,sha256=8Wqal6H5r1wNxLLQBCXo2V3v3JZY5IJDEkyrEGCrCWE,30498
37
37
  ams/cases/wecc/wecc_uced.xlsx,sha256=R3tZgxEqz_ctKcjA1wwFecxn-QZXutvf7NzgnCg_078,94767
38
38
  ams/core/__init__.py,sha256=lIvrAvYf2yrHWqYi0rVuJgJt8KNA8nTmN2iuZ125z9Q,123
39
39
  ams/core/common.py,sha256=934J7xq5JvC14yKp2Z4hWKUFJFhxzAnxB_8_99CChY0,704
40
- ams/core/documenter.py,sha256=FNkpiP65iO809B4Bgmp5C1QeJTQHi-sS9vTP7Wd9D8Q,23131
41
- ams/core/matprocessor.py,sha256=3eEij-ul8Rx25ZwNbv66YEOKyUXB-fYO-ZQs5BpqmIU,26610
40
+ ams/core/documenter.py,sha256=3-jUYrtN8zDZXd8tQZlmZouJluJPH9_xIDbK9ZEEnRU,25762
41
+ ams/core/matprocessor.py,sha256=gOEqg5xYpzmj4aMgTdzYeOPaL-5Bp493TrxUVmMaiTw,26453
42
42
  ams/core/model.py,sha256=LNZtzyf2A7Tz3pn9IDs35JYaHSkQRqhqZicTpZGSqsc,10926
43
43
  ams/core/param.py,sha256=LPH48xUHyqWqODD6IsiamUtkJDDSgGCEMAo6vroFoHE,11130
44
44
  ams/core/service.py,sha256=Q4aeaYFWycIEH7I8DSO8Itah2CJxc3oAW46dtKCQEyA,28041
@@ -48,8 +48,8 @@ ams/extension/__init__.py,sha256=5IFTNirDL0uDaUsg05_oociVT9VCy2rhPx1ad4LGveM,65
48
48
  ams/extension/eva.py,sha256=4_q4ME0WrQIcd205SBTjv0-rMRZZIdQ07QJuEHwLIC8,16340
49
49
  ams/io/__init__.py,sha256=GIfF7X44olHaySL8EzOBU1eXUnunr1owzzdPfPvvHZU,3802
50
50
  ams/io/json.py,sha256=IurwcZDuKczSbRTpcbQZiIi0ARCrMK6kJ0E3wS8ENy8,2585
51
- ams/io/matpower.py,sha256=IK6NwVUAM0FAv2rFF1hBoSTowfXD8l6YXrKiPch9hW8,26166
52
- ams/io/psse.py,sha256=qvKP9CP-70UejUsffPu4ibtyF1JXO0Sz0-evT4fDPXg,13631
51
+ ams/io/matpower.py,sha256=R8ynl88bWJAzISYZKfMQi7AFRUINwqk_e-Zsh_pnVCE,27541
52
+ ams/io/psse.py,sha256=S2JqpEFaXEiazbVtU77i93BA4ZnoKP7jDZ1rQGg24sE,13684
53
53
  ams/io/pypower.py,sha256=Fe0sxzC5DZegtYksTixadXk_LcfJ1GNetWu9EuHCkG8,2790
54
54
  ams/io/xlsx.py,sha256=7ATW1seyxsGn7d5p5IuSRFHcoCHVVjMu3E7mP1Mc74U,2460
55
55
  ams/models/__init__.py,sha256=EGkViLkVX_We9FAGuEkgfleMNmPw_vGp2Nq1OQimL7U,691
@@ -88,29 +88,29 @@ ams/routines/dcopf2.py,sha256=sDCP8zqYHDh7s7p9SX6G8QhMfIxCg3VPYJn6r3pRKyo,3620
88
88
  ams/routines/dcpf.py,sha256=lGZ9LmCL1DsFB-sNxI7NGrq0qd_iBRMDPJmU5022t20,8242
89
89
  ams/routines/dopf.py,sha256=8D36-FkPORYGaMnwGTqwz8HxAXk5ywo3mk8NlGq327g,6289
90
90
  ams/routines/ed.py,sha256=9Hf_ZqD6poIxCIBfsTMC0DGoPNEja1ZtVxqhb4ijhgE,11875
91
- ams/routines/grbopt.py,sha256=DeNpm6JU-I_i_Q_vicaz_u_MnrE6zSLeyxcfJOluOoc,5367
91
+ ams/routines/grbopt.py,sha256=RjrMq6XPHeBEbf-Pt9sLk2D1vnXZYYwaic4BP8lbACg,5480
92
92
  ams/routines/pflow.py,sha256=5_9n10r_PfsVXIRkaBgKxVITumImZ8mvpHnwxX_ECdw,9432
93
- ams/routines/pypower.py,sha256=1DjhNpCqhSQdZivYQsNvpBaKUEhmNsiWGgAHdMB7cOk,26740
94
- ams/routines/routine.py,sha256=v4jzsziQPvbVh5m0AH629NBEtmKlLvitFW5m-YfFtfY,35833
93
+ ams/routines/pypower.py,sha256=3nKm7VoVXWsiiBK0fEdHv0W2T2AsJ4a6Nqb9ts-1u1A,27214
94
+ ams/routines/routine.py,sha256=teafNQ7DmXntwNP-RbtJJ9Ixa5xOEioO-nXFhY1psmA,35574
95
95
  ams/routines/rted.py,sha256=GOHRxo0-HS5HhwQg8lv7-2VcGr_M_TdUvvomgJ31fDQ,22070
96
96
  ams/routines/type.py,sha256=lvTWSnCYIbRJXIm3HX6jA0Hv-WWYusTOUPfoW8DITlU,3877
97
97
  ams/routines/uc.py,sha256=VcuNy2TnBjsewKEGIqeo2EFTyuhpx5QsEvgpAtscDIQ,15648
98
98
  ams/utils/__init__.py,sha256=2hAQmWRgmnE-bCGT9cJoW9FkPDMGRiGkbBcUgj-bgjI,122
99
99
  ams/utils/misc.py,sha256=Y6tPKpUKJa7bL9alroJuG2UNW9vdQjnfAmKb2EbIls8,2027
100
- ams/utils/paths.py,sha256=D9VNUwtJtHy-8PFzMnxtQ9HpkOXT6vdVOjfOTuoKGKw,6699
100
+ ams/utils/paths.py,sha256=6iTux5UaHzRi6mGHnpbYUp-MoD-IFny4IuRsV8FKDcQ,9481
101
101
  docs/Makefile,sha256=UKXBFAbKGPt1Xw9J84343v0Mh8ylAZ-tE0uCd74DrQU,725
102
102
  docs/make.bat,sha256=9UgKGb4SdP006622fJiFxeFT1BeycYAs6hDbV1xwPy8,804
103
103
  docs/source/api.rst,sha256=BRzdDFDzDwVL7Jr_Xj-O5Icgx0gt5hNNd1OjvPl7ap0,1490
104
104
  docs/source/conf.py,sha256=UyoWogZTUNSJU7pQS_JaR28nKddW94zr01LYoIciZZw,6688
105
105
  docs/source/genmodelref.py,sha256=IhmF7bDw8BXPvLD8V3WjQNrfc-H07r5iS-_4DHbbp-8,1420
106
- docs/source/genroutineref.py,sha256=0JyMc2kV5bWrWbSoO6d7o4QgDgG8mVy3JGGQWacJypw,1064
106
+ docs/source/genroutineref.py,sha256=glHhbWUXfZzMDrkque9CBZu8QtdxlxPojInERzAAOwA,1063
107
107
  docs/source/index.rst,sha256=N5phQS5RIyYs-NZo_5yYB8LjvHzOKLeXzRA-M8i-g3Q,2688
108
- docs/source/release-notes.rst,sha256=Fa-rDL0lhaZVi8nwfyn7gCQhQUKyn7NtMIIBkeGM-Vc,13724
108
+ docs/source/release-notes.rst,sha256=zBHZ9dALCLSKKz5lwwalCQJiNCD2l2d3iJjISWtUiPg,14031
109
109
  docs/source/_templates/autosummary/base.rst,sha256=zl3U4baR4a6YjsHyT-x9zCOrHwKZOVUdWn1NPX2u3bc,106
110
110
  docs/source/_templates/autosummary/class.rst,sha256=Hv_igCsLsUpM62_zN0nqj6FSfKnS5xLyu8ZldMbfOAk,668
111
111
  docs/source/_templates/autosummary/module.rst,sha256=YdbpCudOrEU-JbuSlzGvcOI2hn_KrCM6FW5HcGqkaEE,1113
112
112
  docs/source/_templates/autosummary/module_toctree.rst,sha256=sg30OdqFDLyo8Y3hl9V-s2BXb1bzcjjqqWaWi-C3qFM,1126
113
- docs/source/examples/index.rst,sha256=6VT3wVeKk8BWf6pJQtZrmcumW_3jI8esdlzja8scUCA,742
113
+ docs/source/examples/index.rst,sha256=yXR54WHHcBY38-h9LkdTBcNq3HDeT6eSNyrMmafq12E,792
114
114
  docs/source/getting_started/copyright.rst,sha256=d3S7FjrbysVqQd3pEBadrrkcQOZ7sYYeDTCOS4goPC8,715
115
115
  docs/source/getting_started/index.rst,sha256=mcp1NdUwbPoNzpn7Owf5Qzfd6J_--ToU52PjmrbwjBY,1512
116
116
  docs/source/getting_started/install.rst,sha256=pCL5GDNxwkWnrPaO48i9c0bBPT_dYAWvD2CQ7Oi2P_0,7400
@@ -136,25 +136,25 @@ docs/source/modeling/model.rst,sha256=j7OSvoXnDht6rGpgwPiJklsCWrebfx4DxIN-G8r6iF
136
136
  docs/source/modeling/routine.rst,sha256=BkUE3y5L1lA7LP9Nyzc4zzY-tF3t4k7egBE188kybHY,4286
137
137
  docs/source/modeling/system.rst,sha256=NMOPNMOKG1_dRyNPPx-MiCKbbpadxWJxGyU6geRUsvQ,1374
138
138
  tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
139
- tests/test_1st_system.py,sha256=63ngZwXbUzs1964XmqzlkWUgBugi29vuEDMBBTXxLiE,1900
139
+ tests/test_1st_system.py,sha256=WoCgeyUCjBVwyYCqzwDkYy8F3dWArMQBESqIUQk6tOk,1907
140
140
  tests/test_addressing.py,sha256=MIT713KCqMg0h2o4rBDZsGUrpGadmMlXnrrdq-wB77E,1364
141
141
  tests/test_case.py,sha256=b_YZhwIN9sX3FCMD03hRNygV-mYthNj7cOhEv7-by-g,8857
142
142
  tests/test_cli.py,sha256=TtCGBy2e7Ll_2gJTFo9juZtzhaakho_MqkcqhG2w2dk,870
143
143
  tests/test_export_csv.py,sha256=NTULXfTexgI1jf5koUMOYi3RLrSQouS7zxRjXo3ng50,2921
144
144
  tests/test_group.py,sha256=Tq0s9gtenqrv4ws5YNzWxbiF4WgyhtMEAXZfJtew6M4,2699
145
145
  tests/test_interface.py,sha256=8hOZ1caRfoyoEdy1lnh8Y4rIL97FLb2oUKfX_N1lEDo,8838
146
- tests/test_io.py,sha256=MIale4g0jMC9Vy4jjtFKpnh12aavp9lusczff1iIVC0,6493
146
+ tests/test_io.py,sha256=OXt1C6F_RAt0RoRj3xLKdbA3raKEAjvVyWlKD7Ju7BA,6947
147
147
  tests/test_jumper.py,sha256=bdOknplEGnO_tiJc7p3xQvgTe2b6Dz53bOgbFaXKMAI,537
148
148
  tests/test_known_good.py,sha256=NBrlAxnVMxIHXR2cWps-Kwjh36fiU4Y-eupspZkM0ks,9670
149
149
  tests/test_matp.py,sha256=LkjhqxSFr6oY_ENpduDQ77rhLLBl6RzIHZ2d0m_8i-8,17262
150
150
  tests/test_model.py,sha256=ZgghNYmEeALf8_1sPjq9lIJwuYDQ2SelivJNEYpHxJU,1621
151
151
  tests/test_omodel.py,sha256=niVdTZJEZNSVHz-ocA0nnVx84Dt3-8P5FUrwKkNiA0I,4305
152
- tests/test_paths.py,sha256=BU6Tjl4Q_WuHbid0ujkiibqx7yas42YJ7eV_avVMwuw,633
152
+ tests/test_paths.py,sha256=j_D9-Cjg73mwhTS3sUHDfQ8mCebD8enCQxjyRaR2ZH4,3020
153
153
  tests/test_report.py,sha256=RR23by4G-cyleaHTy9A7SEVet0eOVS-Tm0kk1GXY5dM,8134
154
154
  tests/test_repr.py,sha256=g7MRdxLcZRI1PlREFdUG_npp0LkcQiJZfOPw1aq0EFM,570
155
155
  tests/test_routine.py,sha256=DP5CwKtzliw2gNLW2W_3kp0Ihy4rCaxeBxMpgyN5AXA,6234
156
156
  tests/test_rtn_acopf.py,sha256=Kg-RHflrrwyX2uHr16xSAze9XAdYcK7eg1LHMyr1uyA,2354
157
- tests/test_rtn_dcopf.py,sha256=Pl6yGfvznnjP1oGiIWEhnqFIBW2futxPZS4o_DRkbrw,3660
157
+ tests/test_rtn_dcopf.py,sha256=qFY9mKTAIG-qDlU9-loHZddKDDszdGQwRjL-ZDnESu8,4204
158
158
  tests/test_rtn_dcopf2.py,sha256=57_62TnHW-cS6iK2zXT_eXChnh83YiYoPypJwub3VmQ,3747
159
159
  tests/test_rtn_ed.py,sha256=SeSuzqpTZZnBph41PV2Piplo9yxR3qpbhQUa6UCYnSw,10267
160
160
  tests/test_rtn_opf.py,sha256=MmMNwb9-G0KzHcrrP4uHTvs9DBU71_XPIJqNnkQQPHo,4846
@@ -163,8 +163,8 @@ tests/test_rtn_pypower.py,sha256=KO5VOZxETxVH2mY1mgNvzj1gz1Gdak1sAWxYleDU4E8,104
163
163
  tests/test_rtn_rted.py,sha256=QHDUymorCqQAJKFlDgTy40JyLTGDvNVNU3tjbjDl3-0,9850
164
164
  tests/test_rtn_uc.py,sha256=UbMeaam3dZwgq2LAJokGOl3LT5B3TWKMjCp4dRcLs40,8497
165
165
  tests/test_service.py,sha256=6IP6CAH2xHxGHZM4-R8LjZxVJ2L10LcGaPDyRIqKLmc,2438
166
- ltbams-1.0.10.dist-info/METADATA,sha256=607sw75UjOTCI4FuqQROlZn7BobwBeBubXQ5r9H_Bgc,13511
167
- ltbams-1.0.10.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
168
- ltbams-1.0.10.dist-info/entry_points.txt,sha256=FA56FlhO_yVNeEf810SrorVQb7_Xsmo3_EW-W-ijUfA,37
169
- ltbams-1.0.10.dist-info/top_level.txt,sha256=pyKDqG2kj13F9-BYd_wkruRdBSqLXw8Nwc-cmljqrxg,15
170
- ltbams-1.0.10.dist-info/RECORD,,
166
+ ltbams-1.0.12.dist-info/METADATA,sha256=ZKZlrfSVEg8RkdZ-YjEWGZfY4p7kdEGppQfhHV6hgpg,13808
167
+ ltbams-1.0.12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
168
+ ltbams-1.0.12.dist-info/entry_points.txt,sha256=FA56FlhO_yVNeEf810SrorVQb7_Xsmo3_EW-W-ijUfA,37
169
+ ltbams-1.0.12.dist-info/top_level.txt,sha256=pyKDqG2kj13F9-BYd_wkruRdBSqLXw8Nwc-cmljqrxg,15
170
+ ltbams-1.0.12.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.8.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
tests/test_1st_system.py CHANGED
@@ -30,7 +30,7 @@ class TestCodegen(unittest.TestCase):
30
30
  docum._var_doc(max_width=78, export=export)
31
31
  docum._service_doc(max_width=78, export=export)
32
32
  docum._param_doc(max_width=78, export=export)
33
- docum.config.doc(max_width=78, export=export)
33
+ docum.parent.config.doc(max_width=78, export=export)
34
34
 
35
35
 
36
36
  class TestParamCorrection(unittest.TestCase):
tests/test_io.py CHANGED
@@ -85,6 +85,16 @@ class TestMATPOWER(unittest.TestCase):
85
85
  self.assertEqual(np.unique(mpc5['bus'][:, 10]).shape[0],
86
86
  np.unique(self.mpc5['bus'][:, 10]).shape[0])
87
87
 
88
+ def test_system2mpc_pq(self):
89
+ """Test AMS System to MPC conversion with multiple PQ at one bus."""
90
+ system = ams.load(ams.get_case('5bus/pjm5bus_demo.json'),
91
+ setup=False, no_output=True)
92
+ system.add('PQ', dict(bus=1, p0=0.2))
93
+
94
+ mpc = system.to_mpc()
95
+ np.testing.assert_almost_equal(mpc['bus'][:, 2].sum(),
96
+ system.config.mva * system.PQ.p0.v.sum())
97
+
88
98
  def test_gencost1(self):
89
99
  """Test when gencost is type 1."""
90
100
  mpcgc1 = self.mpc14.copy()
tests/test_paths.py CHANGED
@@ -1,7 +1,9 @@
1
1
  import unittest
2
2
 
3
+ import os
4
+
3
5
  import ams
4
- from ams.utils.paths import list_cases
6
+ from ams.utils.paths import list_cases, get_export_path
5
7
 
6
8
 
7
9
  class TestPaths(unittest.TestCase):
@@ -20,3 +22,68 @@ class TestPaths(unittest.TestCase):
20
22
  no_output=True, default_config=True,
21
23
  )
22
24
  self.assertNotEqual(ss, None)
25
+
26
+
27
+ class TestExportPath(unittest.TestCase):
28
+
29
+ def setUp(self) -> None:
30
+ self.ss = ams.load(ams.get_case('5bus/pjm5bus_demo.json'),
31
+ setup=True, no_output=True)
32
+
33
+ def test_no_fullname(self):
34
+ """
35
+ Test export path with no full name specified.
36
+ """
37
+ self.ss.files.full_name = None
38
+
39
+ path, file_name = get_export_path(self.ss,
40
+ 'DCOPF',
41
+ path=None,
42
+ fmt='csv')
43
+
44
+ dir_path, only_file_name = os.path.split(path)
45
+ self.assertTrue(os.path.exists(dir_path))
46
+ self.assertIsNotNone(only_file_name)
47
+ self.assertEqual(only_file_name, file_name)
48
+
49
+ def test_no_path(self):
50
+ """
51
+ Test export path with no path specified.
52
+ """
53
+ path, file_name = get_export_path(self.ss,
54
+ 'DCOPF',
55
+ path=None,
56
+ fmt='csv')
57
+
58
+ dir_path, only_file_name = os.path.split(path)
59
+ self.assertTrue(os.path.exists(dir_path))
60
+ self.assertIsNotNone(only_file_name)
61
+ self.assertEqual(only_file_name, file_name)
62
+
63
+ def test_current_path(self):
64
+ """
65
+ Test export path with current path specified.
66
+ """
67
+ path, file_name = get_export_path(self.ss,
68
+ 'DCOPF',
69
+ path='.',
70
+ fmt='csv')
71
+
72
+ dir_path, only_file_name = os.path.split(path)
73
+ self.assertTrue(os.path.exists(dir_path))
74
+ self.assertIsNotNone(only_file_name)
75
+ self.assertEqual(only_file_name, file_name)
76
+
77
+ def test_path_with_file_name(self):
78
+ """
79
+ Test export path with path and file name specified.
80
+ """
81
+ path, file_name = get_export_path(self.ss,
82
+ 'DCOPF',
83
+ path='./test_export.csv',
84
+ fmt='csv',)
85
+
86
+ dir_path, only_file_name = os.path.split(path)
87
+ self.assertTrue(os.path.exists(dir_path))
88
+ self.assertEqual(only_file_name, 'test_export.csv')
89
+ self.assertEqual(only_file_name, file_name)
tests/test_rtn_dcopf.py CHANGED
@@ -1,3 +1,5 @@
1
+ import os
2
+
1
3
  import unittest
2
4
  import numpy as np
3
5
 
@@ -99,3 +101,21 @@ class TestDCOPF(unittest.TestCase):
99
101
  a_dcopf = self.ss.DCOPF.get(src='aBus', attr='v', idx=bus_idx)
100
102
  a_acopf = self.ss.ACOPF.get(src='aBus', attr='v', idx=bus_idx)
101
103
  np.testing.assert_almost_equal(a_dcopf, a_acopf, decimal=3)
104
+
105
+ def test_export_csv(self):
106
+ """
107
+ Test `Routine.export_csv()` method.
108
+ """
109
+ self.ss.DCOPF.run(solver='CLARABEL')
110
+
111
+ # test when path is none
112
+ out = self.ss.DCOPF.export_csv()
113
+ self.assertTrue(os.path.exists(out), "CSV export failed!")
114
+
115
+ # test when path is not none
116
+ out2 = self.ss.DCOPF.export_csv(path='test_dcopf.csv')
117
+ self.assertTrue(os.path.exists(out2), "CSV export with path failed!")
118
+
119
+ # Clean up
120
+ os.remove(out)
121
+ os.remove(out2)