219 indexing_lists: bool = False):
220 """
221 Сохраняет molfiles из pd.DataFrame в .sdf файл.
222
223 Args:
224 data (pd.DataFrame): DataFrame с колонками molfile и id.
225 file_name (str): имя файла (без ".sdf").
226 molecule_id_column_name (str): имя колонки с id соединения.
227 extra_data (pd.DataFrame, optional): дополнительная информация.
228 Defaults to pd.DataFrame().
229 indexing_lists (bool, optional): нужно ли индексировать списки.
230 Defaults to False.
231 """
232
233 def WriteColumnAndValueToSDF(file: TextIOWrapper,
234 value: Any,
235 column: str = ""):
236 """
237 Записывает столбец и значение в .sdf файл.
238
239 Args:
240 file (TextIOWrapper): открытый файл для записи.
241 value (Any): значение, которое нужно записать.
242 column (str, optional): имя столбца. Defaults to "".
243 """
244
245
246 if not column:
247 return
248
249
250 if isinstance(value, list) or isinstance(value, pd.Series):
251 file.write(f"> <{column}>\n")
252
253 i: int = 0
254
255 for elem in value:
256
257 if isinstance(elem, dict):
258
259 WriteColumnAndValueToSDF(file, elem)
260
261
262 else:
263
264 elem = str(elem)
265
266
267 if elem != "nan" and elem != "None" and elem != "":
268
269 if indexing_lists:
270 file.write(f"{i}: {elem}\n")
271
272 else:
273 file.write(f"{elem}\n")
274 i += 1
275
276
277 elif isinstance(value, dict):
278 file.write(f"> <{column}>\n")
279
280
281 for key, elem in value.items():
282
283 elem = str(elem)
284
285
286 if elem != "nan" and elem != "None" and elem != "":
287 file.write(f"{key}: {elem}\n")
288
289
290 else:
291
292 value = str(value)
293
294
295 if value != "nan" and value != "None" and value != "":
296 file.write(f"> <{column}>\n")
297
298 file.write(f"{value}\n")
299
300
301 file.write("\n")
302
303
304 with open(f"{file_name}.sdf", "w", encoding="utf-8") as f:
305
306 for value in data.values:
307
308 molecule_id, molfile = value
309
310
311 f.write(f"{molecule_id}{molfile}\n\n")
312
313
314 if not extra_data.empty:
315
316 df = extra_data.set_index(f"{molecule_id_column_name}")
317
318
319 for column in df.columns:
320
321 WriteColumnAndValueToSDF(
322 f, df.loc[molecule_id, column], column)
323
324
325 f.write("$$$$\n")
326
327 v_logger.info(
328 f"Writing {molecule_id} data to .sdf file...",
329 LogMode.VERBOSELY)