{} ,,, [...]

Слайд 2: Работа с различными форматами файлов

Теория: Форматы файлов

1. Работа с JSON:

import json

# Сохранение данных персонажа
character_data = {
    "name": "Венти",
    "level": 90,
    "constellation": 1,
    "talents": {
        "normal_attack": 8,
        "skill": 8,
        "burst": 9
    },
    "weapon": {
        "name": "Небесное крыло",
        "refinement": 1
    }
}

# Запись в JSON
with open('character.json', 'w', encoding='utf-8') as f:
    json.dump(character_data, f, ensure_ascii=False, indent=4)

# Чтение из JSON
with open('character.json', 'r', encoding='utf-8') as f:
    loaded_char = json.load(f)
    
# Преобразование в строку
json_str = json.dumps(character_data, ensure_ascii=False)
# Из строки
data = json.loads(json_str)

2. Работа с CSV:

import csv

# Запись статистики фарма артефактов
artifacts_stats = [
    ['Дата', 'Домен', 'Потрачено смолы', '5* артефакты', 'Подходящие статы'],
    ['2024-01-15', 'Горный пик', 160, 8, 1],
    ['2024-01-16', 'Горный пик', 160, 7, 0],
]

# Запись в CSV
with open('farming_stats.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerows(artifacts_stats)

# Чтение из CSV
with open('farming_stats.csv', 'r', encoding='utf-8') as f:
    reader = csv.reader(f)
    headers = next(reader)  # Пропускаем заголовки
    for row in reader:
        date, domain, resin, artifacts, good_ones = row
        print(f"Получено {good_ones} хороших артефактов из {artifacts}")

# Использование DictReader/DictWriter
with open('artifacts.csv', 'r', encoding='utf-8') as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(f"Домен: {row['Домен']}, 5*: {row['5* артефакты']}")

3. Работа с INI файлами:

import configparser

# Создание конфигурации
config = configparser.ConfigParser()

# Настройки для разных персонажей
config['Венти'] = {
    'artifact_set': 'Странствующий ансамбль',
    'weapon': 'Небесное крыло',
    'main_stats': 'АТК%, Анемо ДПС, Крит шанс'
}

config['Ху Тао'] = {
    'artifact_set': 'Горящая алая ведьма',
    'weapon': 'Посох Хомы',
    'main_stats': 'HP%, Пиро ДПС, Крит урон'
}

# Сохранение конфигурации
with open('builds.ini', 'w', encoding='utf-8') as f:
    config.write(f)

# Чтение конфигурации
config.read('builds.ini', encoding='utf-8')
venti_weapon = config['Венти']['weapon']
hutao_stats = config['Ху Тао']['main_stats']

4. Работа с путями (pathlib):

from pathlib import Path

# Создание путей
saves_dir = Path('saves')
builds_dir = saves_dir / 'builds'
builds_dir.mkdir(parents=True, exist_ok=True)

# Работа с файлами
character_file = builds_dir / 'venti.json'
if character_file.exists():
    data = json.loads(character_file.read_text(encoding='utf-8'))
    
# Поиск файлов
artifact_files = list(builds_dir.glob('*.json'))
for file in artifact_files:
    print(f"Найден билд: {file.stem}")

Важно помнить:

  • Всегда указывайте кодировку при работе с текстовыми файлами
  • Используйте pathlib вместо прямой работы со строками путей
  • JSON поддерживает только базовые типы данных
  • CSV не хранит информацию о типах данных
  • INI файлы хороши для простых конфигураций

Задача: Система импорта/экспорта билдов

Создайте систему для сохранения и загрузки билдов персонажей с поддержкой разных форматов:

Подсказка: Примеры структур данных и функций:

# Пример структуры билда
build = {
    "version": "1.0",
    "character": {
        "name": "Венти",
        "level": 90,
        "talents": [8, 8, 9]
    },
    "weapon": {...},
    "artifacts": [...],
    "teams": [...]
}

# Пример функции экспорта
def export_build(build, format='json'):
    if format == 'json':
        return export_to_json(build)
    elif format == 'csv':
        return export_to_csv(build)