分享

关于Python包非同级导入若干问题

 云深无际 2021-11-03

好气啊,spark运行不了就算了,自己写的程序也是一键砸锅。/(ㄒoㄒ)/~~

不得不说,调试真好用

一下就看出来,路径加载错误了

算法理论是一方面,实践又是一方面。尊重每一个可以运行的算法,无论它结果怎么样。这个过程真的是没有地方找人说,程序和数学一样精确,对错看结果就行。

还是先补补相关知识吧:

  1. 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd();

  2. 返回指定目录下的所有文件和目录名:os.listdir();

  3. 函数用来删除一个文件:os.remove();

  4. 删除多个目录:os.removedirs(r“c:\python”);

  5. 检验给出的路径是否是一个文件:os.path.isfile();

  6. 检验给出的路径是否是一个目录:os.path.isdir();

  7. 判断是否是绝对路径:os.path.isabs();

  8. 检验给出的路径是否真地存:os.path.exists();

  9. 返回一个路径的目录名和文件名:os.path.split();

  10. 分离扩展名:os.path.splitext()。

import osos.getcwd()

导入

'c:\\Users\\yunswj\\Desktop\\精通数据科学算法\\DataScienceAlgorithmsinaWeek_Code\\DataScienceAlgorithmsinaWeek_Code'

结果

import pprint
pprint.pprint(os.listdir)

总之是内置的库,用到时候引入就行

其实最想解决的问题是,当你想引入的一个包,不在你的当前文件,或者在上一层目录,或者是在某个文件夹里面,怎么办啊?

大多数的方案是这个,确实有点效果,但我的执行效果不是这样的。

解决模块的问题:

  1. 向 sys.path 中临时添加模块文件存储位置的完整路径;

  2. 将模块放在 sys.path 变量中已包含的模块加载路径中;

  3. 设置 path 系统环境变量。

import sys sys.path.append(’需要引用模块的地址') sys.path.append(..) # 这代表添加当前路径的上一级目录

你看

确实是有,但是会引入吗?

这说了,是一个模块

其实是引入了,不过是短暂的引入一次,别的文件不引入就失效了。。。

sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__FILE__))))

真真的引入应该是这样的

获取主执行文件路径的最佳方法是用sys.argv[0],它可能是一个相对路径;

通过调用 __file__ 属性输出的绝对路径,我们可以很轻易地找到该模块(或包)的源文件。

Python 的扩展模块添加在 lib\site-packages 路径下,它专门用于存放 Python 的扩展模块和包。

. ; d:\python_ module

路径

点的意思是,当前路径读取。分号是分隔路径,然后后面是绝对的路径。

只有以“from 模块名 import *”形式导入的模块,当该模块设有 __all__ 变量时,只能导入该变量指定的成员,未指定的成员是无法导入的。

__all__ 变量仅限于在其它文件中以“from 模块名 import *”的方式引入。也就是说,如果使用以下 2 种方式引入模块,则 __all__ 变量的设置是无效的。

import 模块名
from 模块名 import 成员

每个包的目录下都必须建立一个 __init__.py 的模块,可以是一个空模块,可以写一些初始化代码,其作用就是告诉 Python 要将该目录当成包来处理。

注意,__init__.py 不同于其他模块文件,此模块的模块名不是 __init__,而是它所在的包名。例如,在 settings 包中的 __init__.py 文件,其模块名就是 settings。

包就是一个目录,好好记住这个。

看个例子

http://c.biancheng.net/view/4669.html

这个链接里面有更多的精彩描述

当直接导入指定包时,程序会自动执行该包所对应文件夹下的 __init__.py 文件中的代码。

import stringprint(dir(string))
['Formatter', 'Template', '_ChainMap', '_TemplateMetaclass', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_re', '_string', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords', 'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation', 'whitespace']
import stringprint([e for e in dir(string) if not e.startswith('_')])

使用这个代码就会下划线的方法不输出

导入包,实际就是执行的__init__的文件

也就是说__file__就是__init__文件的所在位置

也就是说,没有init的文件,就没有输出

我知道对于屏幕前的你,已经很补耐烦了,可能都没有在看。但是你要想写点东西出来,这些是基础知识中的基础知识了。

在程序的前面,我写了这个图像的风格

import matplotlib.pyplot as pltimport numpy as npplt.style.use('ggplot')
# Fixing random state for reproducibilitynp.random.seed(19680801)
fig, axes = plt.subplots(ncols=2, nrows=2)ax1, ax2, ax3, ax4 = axes.ravel()
# scatter plot (Note: `plt.scatter` doesn't use default colors)x, y = np.random.normal(size=(2, 200))ax1.plot(x, y, 'o')
# sinusoidal lines with colors from default color cycleL = 2*np.pix = np.linspace(0, L)ncolors = len(plt.rcParams['axes.prop_cycle'])shift = np.linspace(0, L, ncolors, endpoint=False)for s in shift: ax2.plot(x, np.sin(x + s), '-')ax2.margins(0)
# bar graphsx = np.arange(5)y1, y2 = np.random.randint(1, 25, size=(2, 5))width = 0.25ax3.bar(x, y1, width)ax3.bar(x + width, y2, width, color=list(plt.rcParams['axes.prop_cycle'])[2]['color'])ax3.set_xticks(x + width)ax3.set_xticklabels(['a', 'b', 'c', 'd', 'e'])
# circles with colors from default color cyclefor i, color in enumerate(plt.rcParams['axes.prop_cycle']): xy = np.random.normal(size=2) ax4.add_patch(plt.Circle(xy, radius=0.3, color=color['color']))ax4.axis('equal')ax4.margins(0)
plt.show()

出现的图,其实是扁平化的图案

import numpy as npimport matplotlib.patches as mpatches# 绘制一个圆形import matplotlib.pyplot as plt# 相当于matlab的绘图apiimport matplotlib
matplotlib.style.use('ggplot')

# sys.path.append('.//Common')# 对于模块和自己写的脚本不在同一个目录下,在脚本开头加sys.path.append('xxx')# 这个操作是添加搜索目录# pprint.pprint(sys.path)# 更加好看的打印方式
data_file_name = 'mary_and_temperature_preferences_completed.data'temp_from = 5temp_to = 30wind_from = 0wind_to = 10

# 返回一个包含3个列表的字典。第一个是x坐标。# 第二个是y坐标,第三个是数值的颜色

def get_x_y_colors(data): dic = {} dic['x'] = [0] * len(data) dic['y'] = [0] * len(data) dic['colors'] = [0] * len(data) for i in range(0, len(data)): dic['x'][i] = data[i][0] dic['y'][i] = data[i][1] dic['colors'][i] = data[i][2] return dic

data = np.loadtxt(open(data_file_name, 'r'), dtype={ 'names': ('temperature', 'wind', 'perception'), 'formats': ('i4', 'i4', 'S4')})
# 将类转换为要在图中显示的颜色。for i in range(0, len(data)): if data[i][2] == 'cold': data[i][2] = 'blue' elif data[i][2] == 'warm': data[i][2] = 'red' else: data[i][2] = 'gray'
# 将数组转换为可用于绘图功能的格式。data_processed = get_x_y_colors(data)
# 绘图

plt.title('Mary and temperature preferences')plt.xlabel('temperature in C')plt.ylabel('wind speed in kmph')plt.axis([temp_from, temp_to, wind_from, wind_to])# Add legends to the graph.blue_patch = mpatches.Patch(color='blue', label='cold')red_patch = mpatches.Patch(color='red', label='warm')plt.legend(handles=[blue_patch, red_patch])plt.scatter(data_processed['x'], data_processed['y'], c=data_processed['colors'], s=[1400] * len(data))plt.show()
7 3 cold6 9 cold12 1 cold16 6 cold16 9 cold14 4 cold13 4 cold19 4 warm18 4 cold15 1 cold5 6 cold20 7 cold25 1 warm22 6 warm21 6 warm27 2 warm26 6 warm8 5 cold23 7 warm5 8 cold28 5 warm10 8 cold9 0 cold6 7 cold30 0 warm29 8 warm11 5 cold10 7 cold16 3 cold17 7 cold12 6 cold8 8 cold17 2 warm14 1 cold13 7 cold20 9 cold19 3 warm18 9 cold5 7 cold24 1 warm20 4 warm22 3 warm27 1 warm8 2 cold23 10 cold28 10 cold9 3 cold15 5 cold6 0 cold11 0 cold16 0 cold16 5 cold14 2 cold13 10 cold6 8 cold25 10 cold26 1 warm21 9 cold9 9 cold23 9 cold29 1 warm7 8 cold14 8 cold13 0 cold12 8 cold19 8 cold18 0 warm17 8 cold24 8 warm20 3 warm25 5 warm21 2 warm5 4 cold27 6 warm26 2 warm8 9 cold23 3 warm22 9 cold28 1 warm9 4 cold5 1 cold29 4 warm10 3 cold7 2 cold12 2 cold11 10 cold17 6 cold16 10 cold14 5 cold13 3 cold19 7 cold18 5 cold16 4 cold15 0 cold15 6 cold21 8 cold20 0 warm26 8 warm25 0 warm22 7 warm21 5 warm27 5 warm26 7 warm8 6 cold23 6 warm22 10 cold28 6 warm10 9 cold9 7 cold6 4 cold30 1 warm29 7 warm11 4 cold10 4 cold7 1 cold12 7 cold11 9 cold17 1 warm15 10 cold14 6 cold13 6 cold20 10 cold19 2 warm18 6 cold24 2 warm20 5 warm25 3 warm22 0 warm5 5 cold27 0 warm8 3 cold23 5 warm5 10 cold10 10 cold9 2 cold6 1 cold30 2 warm29 10 cold11 3 cold16 1 cold12 4 cold15 9 cold14 3 cold13 9 cold19 1 warm7 6 cold15 7 cold6 10 cold9 8 cold8 0 cold23 8 warm30 8 warm29 0 warm28 8 warm6 2 cold14 9 cold12 9 cold18 1 warm24 9 warm25 9 warm25 4 warm21 1 warm26 3 warm8 10 cold23 2 warm28 2 warm27 10 cold5 0 cold29 3 warm10 0 cold12 3 cold17 5 cold30 6 warm14 10 cold13 2 cold30 5 warm19 6 cold18 2 warm17 10 cold15 3 cold20 1 warm26 9 warm7 7 cold15 4 cold21 4 warm19 9 cold27 4 warm26 4 warm8 7 cold23 1 warm24 4 warm28 7 warm27 9 warm9 6 cold6 5 cold5 3 cold29 6 warm11 7 cold10 5 cold7 0 cold24 7 warm12 0 cold11 8 cold17 0 warm16 8 cold14 7 cold13 5 cold19 5 warm18 7 cold24 3 warm21 10 cold20 6 warm26 10 cold25 2 warm22 1 warm21 7 cold27 3 warm8 4 cold23 4 warm5 9 cold28 4 warm20 8 cold9 1 cold6 6 cold30 3 warm29 9 warm11 2 cold10 6 cold16 2 cold12 5 cold17 3 warm15 8 cold14 0 cold13 8 cold30 4 warm19 0 warm18 8 cold25 8 warm24 0 warm7 4 cold22 2 warm8 1 cold30 9 warm28 9 warm6 3 cold11 1 cold16 7 cold7 10 cold24 6 warm12 10 cold19 10 cold24 10 cold21 0 warm26 0 warm30 7 warm28 3 warm9 10 cold30 10 cold29 2 warm10 1 cold25 7 warm18 10 cold17 4 cold7 9 cold13 1 cold24 5 warm18 3 warm17 9 cold15 2 cold22 4 warm20 2 warm25 6 warm22 5 warm21 3 warm27 7 warm26 5 warm7 5 cold23 0 warm22 8 warm28 0 warm27 8 warm9 5 cold5 2 cold29 5 warm11 6 cold10 2 cold

本来是想写K近邻算法,可惜有错误。我又走神了,这是对代码的可视化部分

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约