[๐Ÿค–] ํŒŒ์ด์ฌ์œผ๋กœ ๋ด‡ ๋งŒ๋“ค๊ธฐ! - 3

Python์œผ๋กœ Discord ๋ด‡์„ ๋งŒ๋“œ๋Š” ๊ฑด ์ƒ๊ฐ๋งŒํผ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ค€๋น„ ์กฐ๊ธˆ๊ณผ ๋ช‡ ์ค„์˜ ์ฝ”๋“œ๋กœ ๋ด‡์„ ๋งŒ๋“ค๊ณ , ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ์„ธ ๋ฒˆ์งธ ์‹œ๊ฐ„์—๋Š” ์™ธ๋ถ€์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ , ๋ถˆ๋Ÿฌ์™€๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

[๐Ÿค–] ํŒŒ์ด์ฌ์œผ๋กœ ๋ด‡ ๋งŒ๋“ค๊ธฐ! - 3

์ €๋ฒˆ ์‹œ๊ฐ„์— ํŠน์ • ๊ตฌ์กฐ์˜ ์ฑ„ํŒ…์„ ์ž…๋ ฅ ํ–ˆ์„ ๋•Œ, ๋ด‡์ด ๋‹ต์žฅ์„ ๋ณด๋‚ด๊ฒŒํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์„œ ์‹คํ–‰๊นŒ์ง€ ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ทธ ์ฝ”๋“œ๋Š” ๋ช…๋ น์–ด๋ฅผ ์ถ”๊ฐ€ ํ•  ๋•Œ, ์ง์ ‘ ์ฝ”๋“œ์— ๋ช…๋ น์–ด์™€ ๋‹ต์žฅ์„ ํ•˜๋‚˜ํ•˜๋‚˜ ์ ์–ด์•ผ ํ•œ๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š”, ์™ธ๋ถ€ ํŒŒ์ผ์— ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ , ์ฝ๊ณ , ์“ฐ๊ฒŒ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋ช…๋ น์–ด๋ฅผ ์ €์žฅํ•˜๊ณ , ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


1. Python์—์„œ ํŒŒ์ผ ์ฝ๊ณ  ์“ฐ๊ธฐ

๊ธฐ๋ณธ์ ์œผ๋กœ Python์—์„œ๋Š” open ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํŒŒ์ผ์„ ์ฝ๊ณ  ์”๋‹ˆ๋‹ค.

๋‚ด์žฅ ํ•จ์ˆ˜
ํŒŒ์ด์ฌ ์ธํ„ฐํ”„๋ฆฌํ„ฐ์—๋Š” ํ•ญ์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ํ•จ์ˆ˜์™€ ํ˜•์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์•ŒํŒŒ๋ฒณ ์ˆœ์œผ๋กœ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.,,,, ๋‚ด์žฅ ํ•จ์ˆ˜,,, A, abs(), aiter(), all(), anext(), any(), ascii(),, B, bin(), bool(), breakpoint(), bytearray(), bytes(),, C, callable(โ€ฆ

Python ๊ณต์‹ ๋ฌธ์„œ์˜ open ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ธ์ž๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

  • file
  • mode
  • buffering
  • encoding
  • errors
  • newline
  • closefd
  • opener

๊ทธ๋ฆฌ๊ณ , mode๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ’์ด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ž

์˜๋ฏธ

'r'

์ฝ๊ธฐ์šฉ์œผ๋กœ ์—ฝ๋‹ˆ๋‹ค (๊ธฐ๋ณธ๊ฐ’)

'w'

์“ฐ๊ธฐ์šฉ์œผ๋กœ ์—ฝ๋‹ˆ๋‹ค, ํŒŒ์ผ์„ ๋จผ์ € ์ž๋ฆ…๋‹ˆ๋‹ค.

'x'

๋…์ ์ ์ธ ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ์šฉ์œผ๋กœ ์—ฝ๋‹ˆ๋‹ค, ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

'a'

์“ฐ๊ธฐ์šฉ์œผ๋กœ ์—ฝ๋‹ˆ๋‹ค, ํŒŒ์ผ์˜ ๋์— ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

'b'

๋ฐ”์ด๋„ˆ๋ฆฌ ๋ชจ๋“œ

't'

ํ…์ŠคํŠธ ๋ชจ๋“œ (๊ธฐ๋ณธ๊ฐ’)

'+'

๊ฐฑ์‹ (์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ)์šฉ์œผ๋กœ ์—ฝ๋‹ˆ๋‹ค

๊ทธ ์ค‘์—์„œ file๊ณผ mode, encoding์ด ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • file์€ ๋ฌธ์ž์—ด๋กœ ์ „๋‹ฌ๋ฐ›์€ ํŒŒ์ผ ์œ„์น˜์— ํŒŒ์ผ์„ ์—ฝ๋‹ˆ๋‹ค.
    • "./data/test.json"์œผ๋กœ ์ง€์ •ํ–ˆ๋‹ค๋ฉด, data ํด๋”์˜ test.json์„ ์—ฐ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
  • mode๋Š” ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ• ์ง€ ์ •ํ•ฉ๋‹ˆ๋‹ค.
    • "r"์„ ํ†ตํ•ด ํŒŒ์ผ์„ ์ฝ๊ณ , "w"๋ฅผ ํ†ตํ•ด ํŒŒ์ผ์— ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • encoding์€ ํŒŒ์ผ์˜ ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • UTF-8์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉฐ, ํ•œ๊ตญ์—์„œ๋Š” cp949๋‚˜ euc-kr์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด open ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์€ 2๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

a. ๊ทธ๋ƒฅ ์—ด๊ณ , ๋‹ซ๊ธฐ

file = open("test.txt", "r", encoding="UTF-8")
print(file.read())
file.close()

์œ„ ์ฝ”๋“œ๋Š” test.txt๋ฅผ UTF-8๋กœ ์ฝ์–ด, printํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
๋์— file.close()๋ฅผ ํ–ˆ๋Š”๋ฐ, ํŒŒ์ผ์„ ์—ด๊ณ  ์‚ฌ์šฉ์„ ์™„๋ฃŒํ•˜๋ฉด close ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์™œ๋ƒํ•˜๋ฉด, ์ด๋ฏธ ์—ด๋ฆฐ ํŒŒ์ผ์„ ์—ด๋ ค๊ณ  ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๊ณ ,

๋˜๋Š” ์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์—์„œ ํŒŒ์ผ์„ ์ฝ๊ณ  ์“ฐ๋Š” ์ค‘์—๋Š” ๊ทธ ํŒŒ์ผ์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
๊ฒŒ์ž„์„ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋™์•ˆ, ๊ทธ ๊ฒŒ์ž„์„ ๊บผ์•ผํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ฝ”๋“œ์—์„œ ๋์— file.close()๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š”๊ฑด ์กฐ๊ธˆ ๊ท€์ฐฎ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ with๋ฌธ์„ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋” ๋งŽ์Šต๋‹ˆ๋‹ค.

b. with๋ฌธ ์‚ฌ์šฉํ•˜์—ฌ ์—ด๊ณ , ๋‹ซ๊ธฐ

with open("test.txt", "r", encoding="UTF-8") as file:
    print(file.read())

์œ„ ์ฝ”๋“œ๋Š” 1๋ฒˆ ์ฝ”๋“œ์™€ ์™„์ „ํžˆ ๋™์ผํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋” ๊ฐ„๊ฒฐํ•˜๊ณ , close๊ฐ€ ์—†์–ด์กŒ์Šต๋‹ˆ๋‹ค.

with๋ฌธ์—์„œ open ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, with๋ฌธ์—์„œ ๋ฒ—์–ด๋‚ฌ์„ ๋•Œ, close๊ฐ€ ์•Œ์•„์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

+ encoding์€ ์™œ ์“ธ๊นŒ?

๊ธฐ๋ณธ์ ์œผ๋กœ Python์—์„œ๋Š” UTF-8์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ํ•œ๊ตญ์—์„œ๋Š” ๋ช‡๋ช‡ ๊ฒฝ์šฐ์—, cp949๋‚˜ euc-kr์„ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Š” ํ”„๋กœ๊ทธ๋žจ์—์„œ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•จ์— ์žˆ์–ด์„œ, ์‚ฌ์šฉ๋˜๋Š” ํ‘œ์ค€์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ด์ œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ UTF-8์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์˜ˆ์ „์—๋Š” Microsoft์—์„œ ๋งŒ๋“  euc-kr๋“ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

euc-kr์„ ์ด์šฉํ•˜์—ฌ ์ž‘์„ฑ๋œ ํŒŒ์ผ์€ ๋˜‘๊ฐ™์€ ํ•œ๊ธ€์ด ์ ํžŒ ํŒŒ์ผ์ด์ง€๋งŒ, ๊ตฌ์กฐ๊ฐ€ ๋‹ฌ๋ผ์„œ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ธฐ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.


2. JSON์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์™ธ๋ถ€์— ์ €์žฅํ•˜๊ธฐ

ํŒŒ์ด์ฌ์—์„œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์—๋Š” ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณ€์ˆ˜๋“ค์€ ๋ชจ๋‘ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์‹คํ–‰์ด ๋๋‚˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์ง€ ์•Š๊ณ  ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋Š” ์™ธ๋ถ€์—, ํŒŒ์ผ๋กœ ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ €๋ฒˆ ์‹œ๊ฐ„์— ๋งŒ๋“ค์—ˆ๋˜ ๋ด‡์€ ๋ช…๋ น์–ด๋ฅผ ์ฝ”๋“œ ๋‚ด๋ถ€์— ์ •ํ™•ํžˆ ์ง€์ •ํ•˜๊ณ , ๋‹ต๋ณ€ ๋˜ํ•œ ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ๋œ๋‹ค๋ฉด Prefix๋ฅผ ๋ฐ”๊ฟ€ ๋•Œ, ํ•˜๋‚˜ํ•˜๋‚˜ ๋ฐ”๊ฟ”์•ผ ํ•˜๊ณ 
๋ช…๋ น์–ด๋ฅผ ์ถ”๊ฐ€ ํ•  ๋•Œ๋งˆ๋‹ค ๋ด‡์„ ๊ป๋‹ค๊ฐ€ ์ผœ์•ผํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ๊ฐ€ ์—„์ฒญ๋‚˜๊ฒŒ ๊ธธ์–ด์ง€๋Š” ๊ฒƒ์€ ๋ค์ด์ฃ .

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— JSON ํŒŒ์ผ์— ์ €์žฅํ•˜์—ฌ ๋ช…๋ น์–ด๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ์ฝ”๋“œ๋„ ์ค„์—ฌ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

import json

json ๋ชจ๋“ˆ์€ Python์— ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Pycord๋ฅผ ์„ค์น˜ํ–ˆ์„ ๋•Œ์ฒ˜๋Ÿผ, pip๋กœ ๊ท€์ฐฎ๊ฒŒ ์„ค์น˜ํ•˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค!

json โ€” JSON encoder and decoder
์†Œ์Šค ์ฝ”๋“œ: Lib/json/__init__.py JSON (JavaScript Object Notation), specified by RFC 7159(which obsoletes RFC 4627) and by ECMA-404, is a lightweight data interchange format inspired by JavaScript objecโ€ฆ

Python ๊ณต์‹ ๋ฌธ์„œ์˜ json ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

a. JSON ํ˜•์‹์œผ๋กœ ์ธ์ฝ”๋”ฉ(dumps)

import json

json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])

# ๊ฒฐ๊ณผ
# '["foo", {"bar": ["baz", null, 1.0, 2]}]'

json.dumps ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ํŒŒ์ด์ฌ์˜ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ JSON ๋ฌธ๋ฒ•์˜ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ฐ”๋€ ๋ฌธ์ž๋Š” ๋ง ๊ทธ๋Œ€๋กœ ๋ฌธ์ž(str)๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
์ด ๋ฌธ์ž๋ฅผ ํŒŒ์ผ์— ์ €์žฅํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

b. JSON ํ˜•์‹์—์„œ ๋””์ฝ”๋”ฉ(loads)

import json

json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')

# ์ถœ๋ ฅ
# ['foo', {'bar': ['baz', None, 1.0, 2]}]

json.loads ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ JSON ๋ฌธ๋ฒ•์˜ ๋ฌธ์ž์—ด์„ ํŒŒ์ด์ฌ์˜ ๋ฐ์ดํ„ฐ๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ถˆ๋Ÿฌ์˜จ ๋ฐ์ดํ„ฐ๋Š” ํŒŒ์ด์ฌ ๋ฐ์ดํ„ฐ(int, str, dict ๋“ฑ)์˜ ์‚ฌ์šฉ๋ฐฉ์‹๊ณผ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

+ dump, load

๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, dumps์™€ loads ํ•จ์ˆ˜๋Š” ๊ฐ๊ฐ dump, load ํ•จ์ˆ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

dump, load ํ•จ์ˆ˜๋Š” file-like object๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
file-like object๋Š” ๋ง ๊ทธ๋Œ€๋กœ, ํŒŒ์ผ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

open ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์ฝ๊ฑฐ๋‚˜ ์“ธ ๋•Œ, file.write๋‚˜ file.read๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์ฝ๊ณ  ์”๋‹ˆ๋‹ค.

file.write๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, file.write(json.dumps(data))๋ฅผ ํ†ตํ•ด data ๋ณ€์ˆ˜์˜ ๋‚ด์šฉ์„ JSON ๋ฌธ๋ฒ•์˜ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ file์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ

json.dump(data, file)์„ ํ•œ๋‹ค๋ฉด ๊ตณ์ด JSON ๋ฌธ๋ฒ•์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ • ์—†์ด ๋ฐ”๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ณ 

file.read ๋˜ํ•œ ํŒŒ์ผ์„ ํŒŒ์ด์ฌ์˜ ๋ฌธ์ž ํ˜•์‹์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋‹ˆ, ๊ทธ๊ฒƒ์„ ์ด์šฉํ•ด์„œ json.loads(file.read())๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ

json.load(file)์„ ํ•œ๋‹ค๋ฉด ๊ตณ์ด ๋ฌธ์ž ํ˜•์‹์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ํ•„์š” ์—†์ด ๋ฐ”๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


3. ์ฝ”๋“œ ์ž‘์„ฑ

import json

import discord

intent = discord.Intents.all()
client = discord.Client(intents=intent)

with open('commands.json', 'r', encoding="UTF-8") as file:
    commands = json.load(file)

@client.event
async def on_ready():
    print(client.user.name)
    await client.change_presence(activity=discord.Game("ํ–„๋ฒ„๊ฑฐ"))

@client.event
async def on_message(msg: discord.Message):
    if msg.author.bot:
        return
    
    if msg.content.startswith("%๋ช…๋ น์–ด์ถ”๊ฐ€"):
        oper, cmd, rep = msg.content.split(' ')
        commands[cmd] = rep
        
        with open('commands.json', 'w', encoding="UTF-8") as file:
            json.dump(commands, file, ensure_ascii=False, indent=2)
        
        await msg.reply("๋ช…๋ น์–ด: " + cmd + "\n๋‚ด์šฉ: " + rep)
    
    if msg.content in commands.keys():
        await msg.reply(commands[msg.content])

client.run('<์—ฌ๊ธฐ์— TOKEN ์ž…๋ ฅ>')

์ „์ฒด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


import json

์œ„ ์ฝ”๋“œ๋Š” Json ํŒŒ์ผ์„ ํŒŒ์ด์ฌ์˜ Dictionary๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด, ๊ธฐ๋ณธ ๋ชจ๋“ˆ์ธ json ๋ชจ๋“ˆ์„ import ํ•ฉ๋‹ˆ๋‹ค.


with open('commands.json', 'r', encoding="UTF-8") as file:
    commands = json.load(file)

์œ„ ์ฝ”๋“œ๋Š” commands.json ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์™€, commands ๋ณ€์ˆ˜์— Dictionary ํ˜•ํƒœ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.


if msg.content.startswith("%๋ช…๋ น์–ด์ถ”๊ฐ€"):
    oper, cmd, rep = msg.content.split(' ')
    commands[cmd] = rep
    
    with open('commands.json', 'w', encoding="UTF-8") as file:
        json.dump(commands, file, ensure_ascii=False, indent=2)
    
    await msg.reply("๋ช…๋ น์–ด: " + cmd + "\n๋‚ด์šฉ: " + rep)

์œ„ ์ฝ”๋“œ๋Š” ๊ธฐ์กด์˜ ์ฝ”๋“œ์™€ ๋‹ค๋ฅด๊ฒŒ, %๋ช…๋ น์–ด์ถ”๊ฐ€ ๋ช…๋ ์–ด๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.

%๋ช…๋ น์–ด์ถ”๊ฐ€ ๋ช…๋ น์–ด๋Š” %๋ช…๋ น์–ด์ถ”๊ฐ€ <๋ช…๋ น์–ด> <๋‚ด์šฉ>์˜ ๊ตฌ์กฐ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ๋ฉ”์„ธ์ง€์˜ ๋‚ด์šฉ(msg.content)์„ ๊ณต๋ฐฑ ๋‹จ์œ„๋กœ ์ž˜๋ผ(.split(' ')) ๊ฐ๊ฐ oper, cmd, rep์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ๋ช…๋ น์–ด๊ฐ€ %๋ช…๋ น์–ด์ถ”๊ฐ€ ํ–„๋ฒ„๊ฑฐ ๋ง›์žˆ์–ด์˜€๋‹ค๋ฉด, ๊ฐ ๋ณ€์ˆ˜์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

  • oper: "%๋ช…๋ น์–ด์ถ”๊ฐ€"
  • cmd: "ํ–„๋ฒ„๊ฑฐ"
  • rep: "๋ง›์žˆ์–ด"

๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ช…๋ น์–ด๋ฅผ commands ๋ณ€์ˆ˜์— cmd๋ฅผ Key๋กœ, rep๋ฅผ Value๋กœ ์ €์žฅํ•˜๊ณ , ๋ช…๋ น์–ด๊ฐ€ ์žฌ์‹คํ–‰ ์‹œ ์‚ฌ๋ผ์ง€์ง€ ์•Š๊ฒŒ commands.json์— ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ

with open('commands.json', 'w', encoding="UTF-8") as file:
    json.dump(commands, file, ensure_ascii=False, indent=2)

open ํ•จ์ˆ˜๋กœ commands.json์„ ์“ฐ๊ธฐ ๋ชจ๋“œ('w')๋กœ ์—ด์–ด์„œ file์— ์ €์žฅํ•œ ํ›„, JSON ํ˜•์‹์œผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ json.dump์— ์‚ฌ์šฉ๋œ ์˜ต์…˜์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์ž๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • commands: ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉ๋˜๋Š” commands dict ํƒ€์ž… ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.
  • file: open์„ ํ†ตํ•ด ์—ฐ commands.json ํŒŒ์ผ์˜ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
  • ensure_ascii=False: ์˜์–ด ์ด์™ธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ 16์ง„์ˆ˜๋กœ ํ‘œ์‹œํ•˜๋Š” ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ๊บผ์•ผ ํ•œ๊ธ€๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.
  • indent=2: JSON ๋ฌธ์ž๋ฅผ ์ €์žฅํ•  ๋•Œ ๊ณต๋ฐฑ ํฌ๊ธฐ ์„ค์ •์ž…๋‹ˆ๋‹ค. ๋ณด๊ธฐ ํŽธํ•˜๊ฒŒ ํ‘œ์‹œ๋˜๋ฏ€๋กœ ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
await msg.reply("๋ช…๋ น์–ด: " + cmd + "\n๋‚ด์šฉ: " + rep)

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ช…๋ น์–ด๊ฐ€ ์ž˜ ์ถ”๊ฐ€๋˜์—ˆ์Œ์„ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ, ๋ช…๋ น์–ด๋ฅผ ์ถ”๊ฐ€ํ•œ ๋ฉ”์„ธ์ง€์— ๋ช…๋ น์–ด ์ด๋ฆ„๊ณผ ๋‚ด์šฉ์„ ํฌํ•จํ•˜์—ฌ ๋‹ต์žฅ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.


if msg.content in commands.keys():
    await msg.reply(commands[msg.content])

๋ช…๋ น์–ด์˜ ์ €์žฅ ๋ฐฉ์‹์ด ๋ฐ”๋€Œ์—ˆ์œผ๋ฏ€๋กœ, ๋ช…๋ น์–ด๋ฅผ ์ €์žฅํ•˜๋Š” dict์˜ ํŠน์„ฑ์„ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ ๋ฉ”์„ธ์ง€์˜ ๋‚ด์šฉ(msg.content)์ด commands ๋ณ€์ˆ˜์˜ Key๋“ค ์ค‘(commands.keys())์— ์žˆ๋‹ค๋ฉด

๋ฉ”์„ธ์ง€์˜ ๋‹ต์žฅ์œผ๋กœ(msg.reply) ๊ทธ ๋ช…๋ น์–ด์˜ ๊ฐ’(commands[msg.content])์„ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•œ๋‹ค๋ฉด ์ด์ œ๋Š” JSON ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด์„œ ์ถ”๊ฐ€ํ•˜๋ฉด ์•Œ์•„์„œ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋ฅผ ๋” ๋ฐ”๊ฟ€ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.


์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•˜์—ฌ, ์™ธ๋ถ€ ํŒŒ์ผ์— ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ๊นŒ์ง€ ์จ ๋ดค์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์‹œ๊ฐ„์—๋Š” ์ง€๊ธˆ๊นŒ์ง€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ Git์„ ํ†ตํ•ด ๊ด€๋ฆฌํ•˜๊ณ , Github์— ์˜ฌ๋ ค์„œ ์ €์žฅํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.