Есть файл - с произвольным названием которое вводит пользователь. Его название сохраняется в переменную fileName. Далее появляется файл примерно такого содержания:
[Event "Casual Rapid game"]
[Site "yxpC0GIN"]
[Date "2021.11.29"]
[White "Roman8274518"]
[Black "Sliver777"]
[Result "0-1"]
[UTCDate "2021.11.29"]
[UTCTime "16:13:59"]
[WhiteElo "2227"]
[BlackElo "2294"]
[Variant "Standard"]
[TimeControl "600+5"]
[ECO "B03"]
[Termination "Normal"]
1. e4 Nf6 2. e5 Nd5 3. c4 Nb6 4. d4 d6 5. exd6 cxd6 6. Be3 g6 7. Nc3 Bg7 8. h3 O-O 9. Nf3 Nc6 10. Rc1 d5 11. b3 e5 12. dxe5 d4 13. Nxd4 Nxe5 14. Be2 f5 15. f4 Qh4+ 16. Kf1 Ng4 17. Bxg4 fxg4 18. Qe1 g3 19. Nf3 Qf6 20. Ne4 Qc6 21. Nxg3 Bd7 22. Kf2 Rae8 23. Qd2 g5 24. Nxg5 Qh6 25. c5 Qxg5 26. cxb6 Rxe3 27. Qxe3 Bd4 28. Ke2 Qb5+ 29. Qd3 Re8+ 30. Kd2 Qa5+ 31. Kd1 Qxb6 32. Qc4+ Be6 33. Qd3 Rd8 34. Kc2 Bf7 35. f5 Be5 36. Qe4 Qf2+ 37. Ne2 Bf6 38. Rhf1 Qc5+ 39. Kb1 Qa3 40. Qc2 Bd5 41. Nc3 Rc8 42. Rfd1 Rxc3 43. Qxc3 Be4+ 44. Ka1 Bxc3+ 45. Rxc3 Qb4 46. Rc8+ Kf7 47. Rd7+ Kf6 48. Rf8+ Qxf8 0-1
это - шахматная партия, и мне нужно считать: во первых данные в квадратных скобках отдельно, чтобы получить в переменные что white = Roman8274518 а переменная ECO = B03. а также отдельно всю партию, чтобы можно было отделить первый ход: 1. e4 Nf6. Как такое сделать?
Python
Создаю программу. Нужно считать данные
1)
По-моему Вы ошибаетесь насчет того, что левые части строк, должны стать названиями переменных. Названия переменных - это внутрення кухня программы и с внешним миром она не должна сообщаться. Для такого общения с внешним миром надо применять eval(), что небезопасно и не нужно.
По-моему из верхней части надо делать словарь вида:
D = { 'White': "Roman8274518", ..'ECO': "B03", ..}
А затем в программе по ключам 'White', 'ECO' находить соответствующие значения.
2) Для обработки можно использовать методы строк и регулярные выражения, а чтобы понять как, желательно чтобы Вы уточнили какие отклонения от приведенного примера могут быть в исходном файле, и какой вид надо получить на выходе.
Вот по-моему такой вариант вроде может подойти
https://pastebin.com/JQ8Ycp07
"""
входной файл f.txt
---------
[Event "Casual Rapid game"]
[Site "yxpC0GIN"]
[Date "2021.11.29"]
[White "Roman8274518"]
[Black "Sliver777"]
[Result "0-1"]
[UTCDate "2021.11.29"]
[UTCTime "16:13:59"]
[WhiteElo "2227"]
[BlackElo "2294"]
[Variant "Standard"]
[TimeControl "600+5"]
[ECO "B03"]
[Termination "Normal"]
1. e4 Nf6 2. e5 Nd5 3. c4 Nb6 4. d4 d6 5. exd6 cxd6 6. Be3 g6 7. Nc3 Bg7 8. h3 O-O 9. Nf3 Nc6 10. Rc1 d5 11. b3 e5 12. dxe5 d4 13. Nxd4 Nxe5 14. Be2 f5 15. f4 Qh4+ 16. Kf1 Ng4 17. Bxg4 fxg4 18. Qe1 g3 19. Nf3 Qf6 20. Ne4 Qc6 21. Nxg3 Bd7 22. Kf2 Rae8 23. Qd2 g5 24. Nxg5 Qh6 25. c5 Qxg5 26. cxb6 Rxe3 27. Qxe3 Bd4 28. Ke2 Qb5+ 29. Qd3 Re8+ 30. Kd2 Qa5+ 31. Kd1 Qxb6 32. Qc4+ Be6 33. Qd3 Rd8 34. Kc2 Bf7 35. f5 Be5 36. Qe4 Qf2+ 37. Ne2 Bf6 38. Rhf1 Qc5+ 39. Kb1 Qa3 40. Qc2 Bd5 41. Nc3 Rc8 42. Rfd1 Rxc3 43. Qxc3 Be4+ 44. Ka1 Bxc3+ 45. Rxc3 Qb4 46. Rc8+ Kf7 47. Rd7+ Kf6 48. Rf8+ Qxf8 0-1
---------
"""
import re
D = dict()
with open('f.txt') as f:
~for s in f:
~~s = s.strip().lstrip('[').rstrip(']')
~~if s:
~~~if s[0].isalpha():
~~~~a = s.find(' ') + 1
~~~~b = s.find('"') + 1
~~~~c = s.rfind('"')
~~~~D[s[:a]] = s[b:c]
~~~elif s[0] is '1':
~~~~pattern = '(\s)(\d+\.\s)'
~~~~repl = r'$$$\2'
~~~~moves = re.sub(pattern, repl, s).split('$$$')
~~~~moves = [a.split('. ') for a in moves]
~~~~moves = dict((int(a[0]),a[1].split()) for a in moves)
print(D)
print(moves)
"""
на выходе
-------------
==================
{'Event ': 'Casual Rapid game', 'Site ': 'yxpC0GIN', 'Date ': '2021.11.29', 'White ': 'Roman8274518', 'Black ': 'Sliver777', 'Result ': '0-1', 'UTCDate ': '2021.11.29', 'UTCTime ': '16:13:59', 'WhiteElo ': '2227', 'BlackElo ': '2294', 'Variant ': 'Standard', 'TimeControl ': '600+5', 'ECO ': 'B03', 'Termination ': 'Normal'}
{1: ['e4', 'Nf6'], 2: ['e5', 'Nd5'], ..43: ['Qxc3', 'Be4+'], 44: ['Ka1', 'Bxc3+'], 45: ['Rxc3', 'Qb4'], 46: ['Rc8+', 'Kf7'], 47: ['Rd7+', 'Kf6'], 48: ['Rf8+', 'Qxf8', '0-1']}
>>>
"""
По-моему Вы ошибаетесь насчет того, что левые части строк, должны стать названиями переменных. Названия переменных - это внутрення кухня программы и с внешним миром она не должна сообщаться. Для такого общения с внешним миром надо применять eval(), что небезопасно и не нужно.
По-моему из верхней части надо делать словарь вида:
D = { 'White': "Roman8274518", ..'ECO': "B03", ..}
А затем в программе по ключам 'White', 'ECO' находить соответствующие значения.
2) Для обработки можно использовать методы строк и регулярные выражения, а чтобы понять как, желательно чтобы Вы уточнили какие отклонения от приведенного примера могут быть в исходном файле, и какой вид надо получить на выходе.
Вот по-моему такой вариант вроде может подойти
https://pastebin.com/JQ8Ycp07
"""
входной файл f.txt
---------
[Event "Casual Rapid game"]
[Site "yxpC0GIN"]
[Date "2021.11.29"]
[White "Roman8274518"]
[Black "Sliver777"]
[Result "0-1"]
[UTCDate "2021.11.29"]
[UTCTime "16:13:59"]
[WhiteElo "2227"]
[BlackElo "2294"]
[Variant "Standard"]
[TimeControl "600+5"]
[ECO "B03"]
[Termination "Normal"]
1. e4 Nf6 2. e5 Nd5 3. c4 Nb6 4. d4 d6 5. exd6 cxd6 6. Be3 g6 7. Nc3 Bg7 8. h3 O-O 9. Nf3 Nc6 10. Rc1 d5 11. b3 e5 12. dxe5 d4 13. Nxd4 Nxe5 14. Be2 f5 15. f4 Qh4+ 16. Kf1 Ng4 17. Bxg4 fxg4 18. Qe1 g3 19. Nf3 Qf6 20. Ne4 Qc6 21. Nxg3 Bd7 22. Kf2 Rae8 23. Qd2 g5 24. Nxg5 Qh6 25. c5 Qxg5 26. cxb6 Rxe3 27. Qxe3 Bd4 28. Ke2 Qb5+ 29. Qd3 Re8+ 30. Kd2 Qa5+ 31. Kd1 Qxb6 32. Qc4+ Be6 33. Qd3 Rd8 34. Kc2 Bf7 35. f5 Be5 36. Qe4 Qf2+ 37. Ne2 Bf6 38. Rhf1 Qc5+ 39. Kb1 Qa3 40. Qc2 Bd5 41. Nc3 Rc8 42. Rfd1 Rxc3 43. Qxc3 Be4+ 44. Ka1 Bxc3+ 45. Rxc3 Qb4 46. Rc8+ Kf7 47. Rd7+ Kf6 48. Rf8+ Qxf8 0-1
---------
"""
import re
D = dict()
with open('f.txt') as f:
~for s in f:
~~s = s.strip().lstrip('[').rstrip(']')
~~if s:
~~~if s[0].isalpha():
~~~~a = s.find(' ') + 1
~~~~b = s.find('"') + 1
~~~~c = s.rfind('"')
~~~~D[s[:a]] = s[b:c]
~~~elif s[0] is '1':
~~~~pattern = '(\s)(\d+\.\s)'
~~~~repl = r'$$$\2'
~~~~moves = re.sub(pattern, repl, s).split('$$$')
~~~~moves = [a.split('. ') for a in moves]
~~~~moves = dict((int(a[0]),a[1].split()) for a in moves)
print(D)
print(moves)
"""
на выходе
-------------
==================
{'Event ': 'Casual Rapid game', 'Site ': 'yxpC0GIN', 'Date ': '2021.11.29', 'White ': 'Roman8274518', 'Black ': 'Sliver777', 'Result ': '0-1', 'UTCDate ': '2021.11.29', 'UTCTime ': '16:13:59', 'WhiteElo ': '2227', 'BlackElo ': '2294', 'Variant ': 'Standard', 'TimeControl ': '600+5', 'ECO ': 'B03', 'Termination ': 'Normal'}
{1: ['e4', 'Nf6'], 2: ['e5', 'Nd5'], ..43: ['Qxc3', 'Be4+'], 44: ['Ka1', 'Bxc3+'], 45: ['Rxc3', 'Qb4'], 46: ['Rc8+', 'Kf7'], 47: ['Rd7+', 'Kf6'], 48: ['Rf8+', 'Qxf8', '0-1']}
>>>
"""
Регулярками распарсь. Для скобок примерно такая:
\[([^\s]*)\s+\"([^\"]*)\"\]
Для ходов такая:
\d+\.\s*([^\s]+)\s+([^\s]+)
Вторую нужно немного доработать, либо следить когда кончатся скобки
\[([^\s]*)\s+\"([^\"]*)\"\]
Для ходов такая:
\d+\.\s*([^\s]+)\s+([^\s]+)
Вторую нужно немного доработать, либо следить когда кончатся скобки
Ну первые строчки просто переменная = строка либо их заносить в список.
А саму партию через str.split(".") Либо str.split() - удобнее работать будет с пробелом
Открытие файла - with open(fileName+".txt", "r") as f:
...
А саму партию через str.split(".") Либо str.split() - удобнее работать будет с пробелом
Открытие файла - with open(fileName+".txt", "r") as f:
...
Похожие вопросы
- Есть два файла .txt нужно сопоставить данные и вытащить актуальные
- Что нужно сделать что-бы программа работала?
- Алгоритмы и структуры данных. Нужно ли все понимать? Просто там такие математические действия.
- Программирование на питон, нужно написать программу
- Выразите число в виде суммы четырех квадратов Нужно написать программу на python
- Что делать если не работает программа на питоне с базой данных
- Ввод данных input(), int()
- Сколько места на диске примерно нужно для хранения датасетов для нейросетевой программы? Подробности внутри
- Общая база данных для разных устройств
- Во втором коде программы разобрался, а в предыдущем нет.