88 lines
3.4 KiB
Python
88 lines
3.4 KiB
Python
# 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}")
|