Python 에서 'NameError: name 'json' is not defined' 해결 방법

PythonBeginner
지금 연습하기

소개

Python 은 강력한 프로그래밍 언어이지만, 숙련된 개발자조차 개발 과정에서 오류를 겪습니다. 초보자가 흔히 직면하는 오류 중 하나는 JSON 데이터를 사용하려 할 때 발생하는 NameError: name 'json' is not defined입니다. 이 튜토리얼은 이 오류를 이해하고, 재현하며, 해결하여 Python 코드가 원활하게 실행되도록 안내합니다.

이 Lab 을 마치면, 이 오류가 발생하는 이유를 이해하고 Python 애플리케이션에서 JSON 모듈을 올바르게 가져와 사용하는 방법을 배우게 됩니다.

Python NameError 이해하기

Python 에서 NameError는 인터프리터가 사용하려는 변수, 함수 또는 모듈을 찾을 수 없을 때 발생합니다. 이 오류는 일반적으로 다음 원인 중 하나를 갖습니다.

  1. 변수를 정의하기 전에 사용
  2. 변수 또는 함수 이름을 잘못 입력
  3. 모듈을 사용하기 전에 가져오는 것을 잊음

간단한 NameError 예제 살펴보기

NameError를 생성하는 간단한 스크립트를 만들어 보겠습니다. 코드 편집기를 열고 /home/labex/project 디렉토리에 name_error_example.py라는 새 파일을 다음 내용으로 만듭니다.

## This script demonstrates a simple NameError
print("Starting the script...")

## Try to use a variable that hasn't been defined
print(undefined_variable)

print("This line won't execute because of the error above")

이제 이 스크립트를 실행해 보겠습니다. 터미널을 열고 다음을 실행합니다.

python3 /home/labex/project/name_error_example.py

다음과 유사한 출력을 볼 수 있습니다.

Starting the script...
Traceback (most recent call last):
  File "/home/labex/project/name_error_example.py", line 5, in <module>
    print(undefined_variable)
NameError: name 'undefined_variable' is not defined

이 오류 메시지는 다음을 알려줍니다.

  • 오류 유형: NameError
  • 구체적인 문제: name 'undefined_variable' is not defined
  • 위치: 스크립트의 5 번째 줄

Python 인터프리터는 undefined_variable이라는 변수를 먼저 정의하지 않고 사용하려고 했기 때문에 이 오류를 발생시켰습니다. 이것은 json 모듈을 가져오지 않고 사용하려고 할 때 발생하는 오류와 동일한 유형입니다.

JSON NameError 재현하기

NameError가 무엇인지 이해했으므로, 제목에 언급된 특정 오류인 NameError: name 'json' is not defined를 재현해 보겠습니다.

JSON 오류가 있는 스크립트 생성

/home/labex/project 디렉토리에 json_error.py라는 새 파일을 다음 내용으로 만듭니다.

## This script tries to use the json module without importing it

## Sample JSON string
json_string = '{"name": "Alice", "age": 30, "city": "New York"}'

## Try to parse JSON without importing the json module
parsed_data = json.loads(json_string)

print("User data:", parsed_data)

이 스크립트에서는 json.loads() 함수를 사용하여 JSON 문자열을 구문 분석하려고 하지만, 먼저 json 모듈을 가져오지 않았습니다.

스크립트를 실행하고 어떤 일이 발생하는지 살펴보겠습니다.

python3 /home/labex/project/json_error.py

다음과 같은 오류 메시지를 볼 수 있습니다.

Traceback (most recent call last):
  File "/home/labex/project/json_error.py", line 7, in <module>
    parsed_data = json.loads(json_string)
NameError: name 'json' is not defined

이것이 바로 이 Lab 에서 해결하려는 오류입니다! Python 인터프리터는 사용하기 전에 json 모듈을 가져오지 않았기 때문에 해당 모듈을 찾을 수 없습니다.

JSON 모듈 이해하기

오류를 수정하기 전에 JSON 모듈이 무엇인지 이해해 보겠습니다.

  • JSON (JavaScript Object Notation) 은 가벼운 데이터 교환 형식입니다.
  • Python 에는 JSON 데이터를 사용하기 위한 내장 json 모듈이 포함되어 있습니다.
  • json 모듈은 Python 객체를 JSON 문자열로 인코딩하고 JSON 문자열을 Python 객체로 디코딩하는 메서드를 제공합니다.
  • 일반적인 함수에는 json.dumps() (Python 을 JSON 으로 변환) 및 json.loads() (JSON 을 Python 으로 변환) 가 있습니다.

모든 Python 모듈과 마찬가지로, json 모듈의 함수를 사용하려면 먼저 해당 모듈을 가져와야 합니다.

JSON NameError 수정하기

이제 오류를 재현했으므로 JSON 모듈을 올바르게 가져와서 수정해 보겠습니다.

import 문 추가하기

json_error.py 파일을 열고 맨 위에 import 문을 추가하여 업데이트합니다.

## This script properly uses the json module by importing it first
import json

## Sample JSON string
json_string = '{"name": "Alice", "age": 30, "city": "New York"}'

## Parse JSON after importing the json module
parsed_data = json.loads(json_string)

print("User data:", parsed_data)

핵심 변경 사항은 파일 시작 부분에 import json을 추가하는 것입니다. 이렇게 하면 Python 이 JSON 모듈을 사용하기 전에 로드하도록 지시합니다.

수정된 스크립트 실행하기

파일을 저장하고 다시 실행합니다.

python3 /home/labex/project/json_error.py

이번에는 다음과 같은 출력을 통해 스크립트가 성공적으로 실행되는 것을 볼 수 있습니다.

User data: {'name': 'Alice', 'age': 30, 'city': 'New York'}

이제 json 모듈을 사용하기 전에 올바르게 가져왔으므로 스크립트가 오류 없이 실행됩니다.

대체 import 방법

Python 에서 모듈을 가져오는 방법에는 여러 가지가 있습니다.

  1. 전체 모듈 가져오기 (위에서 수행한 방식):

    import json
    ## Use as json.function_name()
  2. 모듈에서 특정 함수 가져오기:

    from json import loads
    ## Use directly as loads()
  3. 별칭 (alias) 으로 가져오기:

    import json as j
    ## Use as j.function_name()

두 번째 방법을 시도해 보겠습니다. json_import_variation.py라는 새 파일을 다음 내용으로 만듭니다.

## Importing specific functions from the json module
from json import loads

## Sample JSON string
json_string = '{"name": "Bob", "age": 25, "city": "San Francisco"}'

## Parse JSON using the directly imported function
parsed_data = loads(json_string)

print("User data:", parsed_data)

이 스크립트를 실행하여 작동하는지 확인합니다.

python3 /home/labex/project/json_import_variation.py

다음과 같은 출력을 볼 수 있습니다.

User data: {'name': 'Bob', 'age': 25, 'city': 'San Francisco'}

이것은 NameError를 방지하는 JSON 모듈을 가져오는 여러 가지 유효한 방법이 있음을 보여줍니다.

JSON 데이터 작업하기

이제 JSON 모듈을 올바르게 가져오는 방법을 알았으므로, 일반적인 JSON 작업에 사용하는 방법을 살펴보겠습니다.

완전한 JSON 예제 만들기

다음 내용으로 json_operations.py라는 새 파일을 만듭니다.

## Complete example of working with JSON in Python
import json

## 1. Converting Python object to JSON string (serialization)
user = {
    "name": "Charlie",
    "age": 28,
    "is_student": False,
    "courses": ["Python", "Data Science", "Web Development"],
    "address": {
        "street": "123 Tech Lane",
        "city": "Boston",
        "zipcode": "02101"
    }
}

## Convert Python dictionary to JSON string
json_string = json.dumps(user, indent=2)
print("JSON string created from Python object:")
print(json_string)
print("\n" + "-"*50 + "\n")

## 2. Parse JSON string to Python object (deserialization)
parsed_user = json.loads(json_string)
print("Python object created from JSON string:")
print("Name:", parsed_user["name"])
print("Age:", parsed_user["age"])
print("Courses:", parsed_user["courses"])
print("City:", parsed_user["address"]["city"])
print("\n" + "-"*50 + "\n")

## 3. Writing JSON to a file
with open("/home/labex/project/user_data.json", "w") as json_file:
    json.dump(user, json_file, indent=2)
print("JSON data written to user_data.json")

## 4. Reading JSON from a file
with open("/home/labex/project/user_data.json", "r") as json_file:
    loaded_user = json.load(json_file)
print("JSON data loaded from file. User name:", loaded_user["name"])

이 스크립트는 네 가지 일반적인 JSON 작업을 보여줍니다.

  1. json.dumps()를 사용하여 Python 객체를 JSON 문자열로 변환
  2. json.loads()를 사용하여 JSON 문자열을 Python 객체로 구문 분석
  3. json.dump()를 사용하여 JSON 데이터를 파일에 쓰기
  4. json.load()를 사용하여 파일에서 JSON 데이터 읽기

스크립트를 실행합니다.

python3 /home/labex/project/json_operations.py

다음과 유사한 출력을 볼 수 있습니다.

JSON string created from Python object:
{
  "name": "Charlie",
  "age": 28,
  "is_student": false,
  "courses": [
    "Python",
    "Data Science",
    "Web Development"
  ],
  "address": {
    "street": "123 Tech Lane",
    "city": "Boston",
    "zipcode": "02101"
  }
}

--------------------------------------------------

Python object created from JSON string:
Name: Charlie
Age: 28
Courses: ['Python', 'Data Science', 'Web Development']
City: Boston

--------------------------------------------------

JSON data written to user_data.json
JSON data loaded from file. User name: Charlie

스크립트는 또한 user_data.json이라는 파일을 생성했습니다. 내용을 살펴보겠습니다.

cat /home/labex/project/user_data.json

적절한 들여쓰기로 형식이 지정된 JSON 데이터를 볼 수 있습니다.

{
  "name": "Charlie",
  "age": 28,
  "is_student": false,
  "courses": ["Python", "Data Science", "Web Development"],
  "address": {
    "street": "123 Tech Lane",
    "city": "Boston",
    "zipcode": "02101"
  }
}

이제 모듈을 올바르게 가져와서 NameError: name 'json' is not defined 오류를 방지하는 방법을 포함하여 Python 에서 JSON 데이터를 사용하는 방법을 성공적으로 배웠습니다.

요약

이 랩에서 다음을 배웠습니다.

  • Python 에서 NameError가 무엇인지, 그리고 이 예외의 일반적인 원인
  • 특정 오류 NameError: name 'json' is not defined를 식별하고 문제 해결하는 방법
  • 다양한 import 구문 옵션을 사용하여 JSON 모듈을 올바르게 가져오는 방법
  • 다음을 포함하여 Python 에서 JSON 데이터를 사용하는 방법:
    • Python 객체를 JSON 문자열로 변환
    • JSON 문자열을 Python 객체로 구문 분석
    • JSON 데이터를 파일에 쓰기
    • 파일에서 JSON 데이터 읽기

이러한 기술은 Python 에서 데이터를 처리하는 데 기본이며, 특히 웹 서비스와 통신하거나 구성 데이터를 저장하는 애플리케이션을 구축할 때 중요합니다. 모듈을 올바르게 가져오고 사용하는 방법을 이해함으로써 일반적인 오류를 방지하고 더 강력한 Python 코드를 작성할 수 있습니다.

이 패턴은 JSON 모듈뿐만 아니라 모든 Python 모듈에 적용된다는 점을 기억하십시오. 외부 기능을 사용하기 전에 항상 파일 시작 부분에 적절한 import 문이 있는지 확인하십시오.