-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcsv_io.py
More file actions
86 lines (69 loc) · 2.87 KB
/
Copy pathcsv_io.py
File metadata and controls
86 lines (69 loc) · 2.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# Импорт CSV
from card_model import _get_cards_by_deck
import csv
import os
from deck_model import _create_deck, _is_name_taken
from card_model import _create_card
from sqlite3 import IntegrityError
def load_deck(filename, encoding, deck_name=None) -> tuple[int, int] | None:
"""Читаёт файл и создаёт карточки в указанной колоде. По умолчанию пытается получить deck_id по названию переданного файла"""
if not deck_name:
deck_name = os.path.splitext(os.path.basename(filename))[0]
record, exists = _is_name_taken(deck_name)
if not exists:
deck_id = _create_deck(deck_name)
else:
deck_id = record["id"]
cards_added = 0
cards_skipped = 0
try:
enc = "utf-8-sig" if encoding.lower() in ("utf-8", "utf8") else encoding
with open(filename, "r", encoding=enc) as f:
reader = csv.reader(f, delimiter=",")
# Первая строка
first_row = next(reader, None)
if not first_row:
return
# Если первая строка - заголовок, идем дальше
# Если нет - то как данные обрабатываем
if not (
first_row[0].lower().startswith("question")
and first_row[1].lower().startswith("answer")
):
try:
_create_card(deck_id, first_row[0], first_row[1])
cards_added += 1
except (IntegrityError, IndexError):
cards_skipped += 1
# Основной цикл
for row in reader:
if len(row) >= 2:
question, answer = row[0], row[1]
try:
_create_card(deck_id, question, answer)
cards_added += 1
except IntegrityError:
cards_skipped += 1
else:
continue
return cards_added, cards_skipped
except FileNotFoundError:
raise
except UnicodeDecodeError:
raise
def save_deck(deck_id, filename, path):
cards = _get_cards_by_deck(deck_id)
file = f"{filename}.csv"
full_path = os.path.join(path, file)
os.makedirs(path, exist_ok=True)
with open(full_path, "w", encoding="UTF-8", newline="") as csvfile:
writer = csv.writer(csvfile, delimiter=",")
writer.writerow(["question", "answer"])
for card in cards:
writer.writerow([card["question"], card["answer"]])
return full_path
if __name__ == "__main__":
path = r"E:\Учёба\2 семестр\Программирование\Курсовая\1_capitals.csv"
name = "Файлик"
deck_id = 160
load_deck(path, "UTF-8", "Столицы")