gpt4 book ai didi

python - 如何在 python 中将 pkgutils.get_data 与 csv.reader 一起使用?

转载 作者:行者123 更新时间:2023-12-01 22:54:08 26 4
gpt4 key购买 nike

我有一个 python 模块,其中包含需要在运行时加载的各种数据文件(一组表示曲线的 csv 文件)。 csv 模块运行良好

  # curvefile = "ntc.10k.csv"
raw = csv.reader(open(curvefile, 'rb'), delimiter=',')

但是如果我将此模块导入到另一个脚本中,我需要找到数据文件的完整路径。

/project
/shared
curve.py
ntc.10k.csv
ntc.2k5.csv
/apps
script.py

我希望 script.py 仅通过基本文件名引用曲线,而不是完整路径。在模块代码中,我可以使用:

pkgutil.get_data("curve", "ntc.10k.csv") 

它非常适合查找文件,但它返回已读入的 csv 文件,而 csv.reader 需要文件句柄本身。有什么办法可以让这两个模块很好地协同工作吗?它们都是标准的库模块,所以我并没有真正预料到会出现问题。我知道我可以开始拆分 pkgutil 二进制文件数据,但我可能不使用 csv 库。

我知道我可以在模块代码中使用它,而忘记 pkgutils,但看起来 pkgutils 确实正是它的用途。

this_dir, this_filename = os.path.split(__file__)
DATA_PATH = os.path.join(this_dir, curvefile)
raw = csv.reader(open(DATA_PATH, "rb"))

最佳答案

我打开了get_data的源代码,让它返回文件的路径而不是加载的文件是很简单的。这个模块应该可以解决问题。使用关键字 as_string=True 返回读入内存的文件,或使用 as_string=False 返回路径。

import os, sys

from pkgutil import get_loader

def get_data_smart(package, resource, as_string=True):
"""Rewrite of pkgutil.get_data() that actually lets the user determine if data should
be returned read into memory (aka as_string=True) or just return the file path.
"""

loader = get_loader(package)
if loader is None or not hasattr(loader, 'get_data'):
return None
mod = sys.modules.get(package) or loader.load_module(package)
if mod is None or not hasattr(mod, '__file__'):
return None

# Modify the resource name to be compatible with the loader.get_data
# signature - an os.path format "filename" starting with the dirname of
# the package's __file__
parts = resource.split('/')
parts.insert(0, os.path.dirname(mod.__file__))
resource_name = os.path.join(*parts)
if as_string:
return loader.get_data(resource_name)
else:
return resource_name

关于python - 如何在 python 中将 pkgutils.get_data 与 csv.reader 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5003755/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com