Initial commit: планирование эксперимента и оптимизация смесей
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
# core/table_io.py
|
||||
"""
|
||||
Модуль для работы с таблицами: вывод, сохранение в CSV, копирование в буфер обмена.
|
||||
"""
|
||||
import os
|
||||
import csv
|
||||
from table import print_table
|
||||
|
||||
try:
|
||||
import pyperclip
|
||||
HAS_PYPERCLIP = True
|
||||
except ImportError:
|
||||
HAS_PYPERCLIP = False
|
||||
|
||||
def handle_table_output(headers, rows, title="Таблица", ask_each_time=True):
|
||||
"""
|
||||
Выводит таблицу, затем предлагает сохранить в CSV или скопировать в буфер обмена.
|
||||
headers – список заголовков
|
||||
rows – список строк
|
||||
title – заголовок
|
||||
ask_each_time – если False, только выводит таблицу без дополнительных вопросов.
|
||||
"""
|
||||
if title:
|
||||
print(f"\n=== {title} ===")
|
||||
print_table(headers, rows)
|
||||
|
||||
if not ask_each_time:
|
||||
return
|
||||
|
||||
while True:
|
||||
print("\nДействия с таблицей:")
|
||||
print(" 1. Сохранить в CSV")
|
||||
if HAS_PYPERCLIP:
|
||||
print(" 2. Скопировать в буфер обмена")
|
||||
else:
|
||||
print(" 2. Скопировать в буфер обмена (недоступно, установите pyperclip)")
|
||||
print(" Enter - пропустить")
|
||||
choice = input("Выберите действие: ").strip()
|
||||
|
||||
if choice == "":
|
||||
break
|
||||
|
||||
if choice == "1":
|
||||
save_to_csv(headers, rows)
|
||||
break
|
||||
elif choice == "2":
|
||||
if HAS_PYPERCLIP:
|
||||
copy_to_clipboard(headers, rows)
|
||||
break
|
||||
else:
|
||||
print("pyperclip не установлен. Установите командой: pip install pyperclip")
|
||||
continue
|
||||
else:
|
||||
print("Неверный выбор. Введите 1, 2 или Enter.")
|
||||
|
||||
def save_to_csv(headers, rows, default_filename="table.csv"):
|
||||
"""Сохраняет таблицу в CSV-файл."""
|
||||
filename = input(f"Имя файла (по умолчанию {default_filename}): ").strip()
|
||||
if not filename:
|
||||
filename = default_filename
|
||||
if not filename.lower().endswith('.csv'):
|
||||
filename += '.csv'
|
||||
try:
|
||||
with open(filename, 'w', newline='', encoding='utf-8-sig') as f:
|
||||
writer = csv.writer(f, delimiter=';')
|
||||
writer.writerow(headers)
|
||||
writer.writerows(rows)
|
||||
print(f"Таблица сохранена в {os.path.abspath(filename)}")
|
||||
except Exception as e:
|
||||
print(f"Ошибка при сохранении: {e}")
|
||||
|
||||
def copy_to_clipboard(headers, rows):
|
||||
"""Копирует таблицу в буфер обмена в формате TSV."""
|
||||
if not HAS_PYPERCLIP:
|
||||
print("pyperclip не установлен. Установите командой: pip install pyperclip")
|
||||
return
|
||||
lines = []
|
||||
lines.append("\t".join(str(h) for h in headers))
|
||||
for row in rows:
|
||||
lines.append("\t".join(str(cell) for cell in row))
|
||||
text = "\n".join(lines)
|
||||
try:
|
||||
pyperclip.copy(text)
|
||||
print("Таблица скопирована в буфер обмена (TSV-формат).")
|
||||
print("Вставьте её в Excel или другой редактор.")
|
||||
except Exception as e:
|
||||
print(f"Ошибка копирования в буфер обмена: {e}")
|
||||
Reference in New Issue
Block a user