python文件中的With block是否创建本地范围?

2024-06-06 17:43:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python文件名app.py中使用以下代码块读取JSON数据:

import json
with open('./mapping/canada_provinces.geojson', 'r') as f:
    countryGeoJSONData = json.load(f)

这段代码的作用似乎是,同一目录中的任何其他文件都无法导入变量countryGeoJsonData,例如,在另一个文件中使用以下导入代码:

from app import countryGeoJSONData

尝试上述操作时,我收到一条错误消息,即无法从app.py导入名称countryGeoJSONData。 为什么会这样?with块是否正在创建某种本地上下文?该变量可在同一文件中的with块之外使用。为什么不能导入到另一个文件中

为了帮助再现这种情况,下面是app.py的内容:

import pandas as pd
import json

# Read in Report Data
indicators = pd.read_excel(".\data\In Depth_All Data Export Report.xlsx",3)
contextual = pd.read_excel(".\data\In Depth_All Data Export Report.xlsx",4)

#open the GeoJSON file to show canadian provinces on the map
with open('./mapping/canada_provinces.geojson', 'r') as f:
    countryGeoJSONData = json.load(f)

#unique available indicators 
availableIndicators = indicators["Indicator"].unique()
#unqiue provinces
provinces = indicators[indicators["Reporting level"]=="Province"]["Province/territory"].unique()

然后在layout.py中,我有以下导入代码:

from app import indicators, contextual, availableIndicators, provinces, countryGeoJSONData

这将导致以下错误:

ImportError: cannot import name 'countryGeoJSONData' from 'app' 

但是,如果在with块后插入以下代码:

importableJSON= countryGeoJSONData

然后,新变量可以毫无问题地导入layout.py。这就是为什么我认为呆在一个有障碍的地方会引起问题

Project folder structure:
project
-data (includes data files)
-mapping (includes geojson file)
app.py
layout.py

Tags: 文件代码pyimportjsonappdataas
1条回答
网友
1楼 · 发布于 2024-06-06 17:43:46

明白了

with语句与此无关,但您的相对文件名可能与此有关

如果您测试了该模块,并将其导入到数据文件夹(“mapping/”)所在的同一文件夹中,则该模块将正常工作。 如果尝试从任何其他文件夹导入此模块,将失败

解决方法是使用模块的__file__特殊变量来查找数据文件的绝对路径pathlib.Path允许使用最小的模糊:


import json
from pathlib import Path
with (Path(__file__).parent / 'mapping/canada_provinces.geojson').open() as f:
    countryGeoJSONData = json.load(f)

(路径对象覆盖“/”分隔符,因此路径可以与字符串复合-这不是打字错误)

相关问题 更多 >