藕丝空间

藕丝空间 查看完整档案

新乡编辑北华大学  |  电子信息工程 编辑藕丝空间工作室  |  创办人 编辑 www.os373.cn 编辑
编辑

宗旨:致力于在新乡本地传播编程知识。

flag:人称受程序员思维影响深刻的闷骚大叔。

本人博客:http://www.os373.cn

B 站视频:http://space.bilibili.com/194...

QQ 群:291521082,原是同城群,为了让新乡的技术小伙伴找到组织,现在已经超出同城的范围了。

个人动态

藕丝空间 回答了问题 · 2020-08-14

flask wtform里的submitfield()字段不好使?

class Loginform(FlaskForm):
    username = StringField('用户名', validators=[InputRequired(message='用户名不能为空')])
    password = PasswordField('密码', validators=[InputRequired(message="密码要8位")])
    remember_me = BooleanField('记住我')
    **submit = SubmitField('提交')**

这段代码里的 username = StringField('用户名', validators=[InputRequired(message='用户名不能为空')])
明确的告诉你 username 也就是用户名的输入框必须得有字符,不能为空。

关注 2 回答 1

藕丝空间 赞了文章 · 2020-05-21

CentOS7.5 部署 Jupyter Notebook 并通过外网访问

服务器部署在阿里云,想要在服务器内部进行python脚本测试比较麻烦,这时就想到了Jupyter Notebook,我们安装后即可直接在浏览器进行文学化编程,非常方便高效。

一、Jupyter notebook 是什么?

如何使用 Jupyter notebook。Jupyter notebook 是一种 Web 应用,能让用户将说明文本、数学方程、代码和可视化内容全部组合到一个易于共享的文档中。

Jupyter Notebook 已迅速成为处理数据的必备工具。其用途包括数据清理和探索、可视化、机器学习和大数据分析。我为我的个人博客创建了一个 notebook 示例,它展示了 notebook 的许多特点。这项工作通常在终端中完成,也即使用普通的 Python shell 或 IPython 完成。可视化在单独的窗口中进行,而文字资料以及各种函数和类脚本包含在独立的文档中。但是,notebook 能将这一切集中到一处,让用户一目了然。

GitHub 上也直接支持 Jupyter notebook 的渲染。借助此出色的功能,你可以轻松地共享工作。http://nbviewer.jupyter.org/ 也会提供 GitHub 代码库中的 notebook ,以及存储在其他地方的 notebook。

二、jupyter notebook使用

安装

pip install jupyter notebook

启动

jupyter notebook --allow-root # 如果是root用户则需要授权
# jupyter notebook

启动之后我们可以看到结果:

(base) [root@css Code]# jupyter notebook --allow-root
[I 14:08:27.170 NotebookApp] JupyterLab extension loaded from /root/anaconda3/lib/python3.7/site-packages/jupyterlab
[I 14:08:27.170 NotebookApp] JupyterLab application directory is /root/anaconda3/share/jupyter/lab
[I 14:08:27.174 NotebookApp] Serving notebooks from local directory: /work/Code
[I 14:08:27.174 NotebookApp] The Jupyter Notebook is running at:
[I 14:08:27.174 NotebookApp] http://localhost:8888/?token=04f6dcbcca528d3f3d0ca0ff349ebee4d755a872b3c31b42
[I 14:08:27.175 NotebookApp]  or http://127.0.0.1:8888/?token=04f6dcbcca528d3f3d0ca0ff349ebee4d755a872b3c42
[I 14:08:27.175 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[W 14:08:27.201 NotebookApp] No web browser found: could not locate runnable browser.
[C 14:08:27.201 NotebookApp] 
    
    To access the notebook, open this file in a browser:
        file:///root/.local/share/jupyter/runtime/nbserver-58623-open.html
    Or copy and paste one of these URLs:
        http://localhost:8888/?token=04f6dcbcca528d3f3d0ca0ff349ebee4d755a872b3c42
     or http://127.0.0.1:8888/?token=04f6dcbcca528d3f3d0ca0ff349ebee4d755a872b3c42

我们可以看到,可以通过http://127.0.0.1:8888 进行访问,如果需要公网IP访问,需要打开8888端口的防火墙:

firewall-cmd --zone=public --add-port=8888/tcp --permanent
firewall-cmd --reload

通过上边的试了下,内网可以访问,外网还不能访问,还需要再做相关配置。

三、外网访问

1、Jupyter密码配置

将生成的密钥复制下来

(base) [root@css scraper]# ipython
Python 3.7.6 (default, Jan  8 2020, 19:59:22) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.12.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from notebook.auth import passwd                                                                                                                                                 

In [2]: passwd()                                                                                                                                                                         
Enter password: 
Verify password: 
Out[2]: 'sha1:3c7ece6d01a3:aef0f9818ea49be2c2f2cc5f5a6228fd327ec00d'

file

2、修改配置文件

1.生成配置文件,输入:

jupyter lab --generate-config

配置文件输出路径:

Writing default config to: /root/.jupyter/jupyter_notebook_config.py

2.打开 jupyter_notebook_config.py 配置文件,修改一下下面几处。

vim /root/.jupyter/jupyter_notebook_config.py
# 将ip设置为*,意味允许任何IP访问
c.NotebookApp.ip = '*'
# 这里的密码就是上边我们生成的那一串
c.NotebookApp.password = 'sha1:3c7ece6d01a3:aef0f9818ea49be2c2f2cc5f5a6228fd327ec00d'
# 服务器上并没有浏览器可以供Jupyter打开
c.NotebookApp.open_browser = False
# 监听端口设置为8888或其他自己喜欢的端口
c.NotebookApp.port = 8888
# 我们可以修改jupyter的工作目录,也可以保持原样不变,如果修改的话,要保证这一目录已存在
#c.MappingKernelManager.root_dir = '/root/jupyter_run'
# 允许远程访问
c.NotebookApp.allow_remote_access = True

3、防火墙开启
我们再上边已经开启了防火墙,如果没开启记得一定要开启8888这个端口的防火墙,否则公网访问不了。

firewall-cmd --zone=public --add-port=8888/tcp --permanent
firewall-cmd --reload

3、远程访问 Notebook

1.启动 Jupyter

jupyter lab --allow-root

2.浏览器输入

打开浏览器,输入http://公网ip地址:8888(例如,我这里输入http://98.126.219.176:8888)

file

3.结果显示

file

4.测试
新建一个文件,写一段代码打印当前时间测试:
file

我们可以看到新建的文件后缀为.ipynb,这是notebook特有的文件后缀, 以后我们就可以通过jupty浏览器写代码了,就像写文章一样方便,这里写好测试好代码之后可以导出python文件即可,非常的方便。


相关文章:
Python 基础八-Jupyter notebook入门学习
云服务centos搭建jupyter notebook并通过外网访问
如何从外网调用内网的jupyter-notebook

查看原文

赞 3 收藏 1 评论 0

藕丝空间 赞了文章 · 2020-04-11

厉害了!每30秒学会一个Python小技巧,Github星数4600+

640?wx_fmt=png

作者:xiaoyu,数据爱好者
Python数据科学出品

很多学习Python的朋友在项目实战中会遇到不少功能实现上的问题,有些问题并不是很难的问题,或者已经有了很好的方法来解决。当然,孰能生巧,当我们代码熟练了,自然就能总结一些好用的技巧,不过对于那些还在刚熟悉Python的同学可能并不会那么轻松。

本次给大家推荐一个学习这些技巧的很好的资源“30-seconds-of-python”,所有技巧方法只要30秒就能get到,完全可以利用业务时间不断积累。下面赶紧来看一下。

https://github.com/30-seconds...

内容目录

下面是30秒学Python的整个目录,分为几大板块:ListMathObjectStringUtility,以下是整理的思维脑图。

640?wx_fmt=jpeg

我挑选了10个实用并很有意思的方法分享给大家,其余的感兴趣可以自行学习。

1. List:all_equal
功能实现:检验一个列表中的所有元素是否都一样。
解读:使用[1:] 和 [:-1] 来比较给定列表的所有元素。

def all_equal(lst):
return lst[1:] == lst[:-1]

举例:

all_equal([1, 2, 3, 4, 5, 6]) # False
all_equal([1, 1, 1, 1]) # True

2. List:all_unique
功能实现:如果列表所有值都是唯一的,返回 True,否则 False
解读:在给定列表上使用集合set()去重,比较它和原列表的长度。

def all_unique(lst):
return len(lst) == len(set(lst))

举例:

x = [1,2,3,4,5,6]
y = [1,2,2,3,4,5]
all_unique(x) # True
all_unique(y) # False

3. List:bifurcate
功能实现:将列表值分组。如果在filter的元素是True,那么对应的元素属于第一个组;否则属于第二个组。
解读:使用列表推导式和enumerate()基于filter元素到各组。

def bifurcate(lst, filter):
    return [
    [x for i,x in enumerate(lst) if filter[i] == True],
    [x for i,x in enumerate(lst) if filter[i] == False]
  ]

举例:

bifurcate(['beep', 'boop', 'foo', 'bar'], [True, True, False, True])

# [ ['beep', 'boop', 'bar'], ['foo'] ]

4. List:difference
功能实现:返回两个iterables间的差异。
解读:创建b的集合,使用a的列表推导式保留不在_b中的元素。

def difference(a, b):
  _b = set(b)
return [item for item in a if item not in _b]

举例:

difference([1, 2, 3], [1, 2, 4]) # [3]

5. List:flatten
功能实现:一次性的整合列表。
解读:使用嵌套的列表提取子列表的每个值。

def flatten(lst):
return [x for y in lst for x in y]

举例:

flatten([[1,2,3,4],[5,6,7,8]]) # [1, 2, 3, 4, 5, 6, 7, 8]

6. Math:digitize
功能实现:将一个数分解转换为个位数字。
解读:将n字符化后使用map()函数结合int完成转化

def digitize(n):
return list(map(int, str(n)))

举例:

digitize(123) # [1, 2, 3]

7. List:shuffle
功能实现:将列表元素顺序随机打乱。
解读:使用Fisher-Yates算法重新排序列表元素。

from copy import deepcopy
from random import randint

def shuffle(lst):
  temp_lst = deepcopy(lst)
  m = len(temp_lst)
while (m):
    m -= 1
    i = randint(0, m)
    temp_lst[m], temp_lst[i] = temp_lst[i], temp_lst[m]
return temp_lst

举例:

foo = [1,2,3]
shuffle(foo) # [2,3,1] , foo = [1,2,3]

8. Math:clamp_number
功能实现:将数字num钳在由a和b边界值规定的范围中。
解读:如果num落尽范围内,返回num;否则,返回范围内最接近的数字。

def clamp_number(num,a,b):
return max(min(num, max(a,b)),min(a,b))

举例:

clamp_number(2, 3, 5) # 3
clamp_number(1, -1, -5) # -1

9. String:byte_size
功能实现:返回字符串的字节数。
解读:使用string.encode('utf-8')解码给定字符串,返回长度。

def byte_size(string):
    return len(string.encode('utf-8'))

举例:

byte_size('?') # 4
byte_size('Hello World') # 11

10. Math:gcd
功能实现:计算几个数的最大公因数。
解读:使用reduce()math.gcd在给定列表上实现。

from functools import reduce
import math

def gcd(numbers):
    return reduce(math.gcd, numbers)

举例:

gcd([8,36,28]) # 4

以上就是30秒学python的各种小技巧。怎么样,对于一些常见操作是不是有了一些新的启发,除此之外,还有很多其它技巧可以慢慢学习,希望对各位读者有所帮助。

https://github.com/30-seconds...

最后,如果喜欢本篇文章,欢迎点赞收藏。更多精彩内容请关注Python数据科学

查看原文

赞 33 收藏 19 评论 3

藕丝空间 回答了问题 · 2020-04-07

解决sqlalchemy多对多关系的中间表,可以增加其他字段吗?

学 sqlachemy,你可以看看这个项目--https://gitee.com/ousikongjia...

关注 3 回答 2

藕丝空间 收藏了文章 · 2020-02-26

Python文件及目录操作

Python的目录操作主要依赖于osshutil 模块.

Python目录操作

新建目录
os.mkdir("./test/")
#在当前目录下新建名为“test”的目录,存在则报错
新建多级目录
os.makedirs("./test/test1/test2/")
#存在则报错
删除目录
os.rmdir("./test/") 
#移除非空目录,不为空情况下报错
删除多级目录
os.removedirs("./test/test1/test2") 
#移除最后一级(test2)非空目录,不为空情况下报错
递归拷贝树
shutil.copytree("./test/","./test1/") 
#目标目录(./test1/)必须保证不存在,存在情况下报错
递归删除树
shutil.rmtree("./test/") 
#删除test目录及所包含的文件和目录
获取当前文件所在目录使用 os.getcwd(),sys.path[0]

Python文件操作

拷贝文件
shutil.copyfile("./test/1.py","./test1/1.py") 
#目标(./test1/1.py)必须是新文件的路径,否则报错

shutil.copy("./test/1.py","./test1/") 
#目标可以是新文件的路径,也可以是新文件的目录,后者的情况下,新文件的名字为原文件的名字,若存在则覆盖
移动文件
shutyil.move("./test/1.py","./test1/")
#目标目录不存在则报错,存在同名文件也报错,目标也可以是文件的路径,例如“./test1/2.py” 此时文件会先移动到test1文件夹下,然后对文件进行重命名为2.py
删除文件
os.remove("./test/1.py") 
#移除目标文件,不存在则报错
获取当前文件所在路径

os.path.abspath("./test"):获取文件的绝对路径
os.path.realpath("./test/"):获取文件的真实路径

Python路径处理

python对路径的处理,主要存在于os.path模块下

文件路径拼接
os.path.join("./test/","test1") #./test/test1/
判断文件或目录是否存在
os.path.exists() 
#参数为文件路径或目录路径
判断是否为文件
os.path.isfile("./test/1.py") 
#True 文件不存在的情况下为 False 
判断是否为目录
os.path.isdir("./test/") 
#True. 目录不存在的情况下为 False
获取文件的名称
os.path.basename("./test/1.py") 
#1.py 路径不存在不会报错
获取目录的名称
os.path.dirname("./test/test1/")
# ./test/test1 参数后面的反斜杠很重要,区别是文件路径还是目录路径。
分割路径中的文件和目录
os.path.split("./test/test1/1.py") 
# ("./test/test1/","1.py")

os.path.split("./test/test1/") 
# ("./test/test1/","")
分割路径中的文件扩展名
os.path.splitext("./test/1.py") 
# ("./test/1",".py")
遍历文件夹
1)os.path.walk(path,func,args) 参数都必填
参数1为遍历的目录,文件路径不存在不报错
参数2为回调函数,定义为f(args,dirname,files)<dirname:文件当前遍历的目录,files:为当前目录下文件和目录信息的列表>
参数3与参数2中函数的参数1相对应
2)os.walk(path, topdown,onerror) 参数可选填
参数1为遍历的目录,文件路径不存在不报错
参数2为True或者不填时,遍历规则为先遍历目录在遍历文件,为False时与之相反
参数3为对错误处理的函数,它调用时有一个参数, 一个OSError实例。报告这错误后,继续walk,或者抛出exception终止walk。
调用方式:
for dirname(当前遍历的目录),dirs(目录下的目录列表),files(目录下的文件列表) in os.walk(path)
在进行文件内指针重置的时候,除了Python基础篇文件部分介绍的绝对定位外,通过os模块还可以实现相对定位。
f.seek(位置,os.SEEK_SET<相对起始位置>|os.SEEK_END<相对结束位置>|os.SEEK_CUR<相对当前位置>)

更多内容请参考

os 模块: 请点击
shutil 模块:请点击

查看原文

藕丝空间 回答了问题 · 2020-02-26

python中cv2.findContours函数返回错误问题

这是 OpenCV 的版本造成的,你肯定是按照 OpenCV 3 版本的实例敲的代码,但是你自己的 OpenCV 的版本是4.1.x。
你只要把原来的代码

rect,contours, hierarchy = cv2.findContours(fgmask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 在二值图像上检测物体轮廓

改为

contours, hierarchy = cv2.findContours(fgmask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 在二值图像上检测物体轮廓

即可。

也就是把第一个变量去掉就行了。

关注 2 回答 1

藕丝空间 回答了问题 · 2020-02-24

PYQT5 将print的内容输出到多个窗口的QPlaintext中

这个是pyqt5中的常见问题,建议使用 partial 偏函数来调用。


下面是偏函数的实例。

from functools import partial
def multiply(x, y):
    return x * y
double = partial(multiply, y=2)

关注 2 回答 1

藕丝空间 回答了问题 · 2020-02-17

解决Python面向对象中__init__的实际作用是什么?

说到类的 '__init__' 方法,就不得不说类的实例化,而类的实例化是通过 '__new__' 方法为对象分配内存空间,构建一个“空”对象;然后,'__init__' 方法被调用来初始化它。
以下是类的实例化的步骤:

  1. Foo(*args, *kwargs) 等价于 Foo.__call__(*args, *kwargs)。
  2. 既然 Foo 是一个 type 的实例,Foo.__call__(*args, *kwargs) 实际调用的是 type.__call__(Foo, *args, *kwargs)。
  3. type.__call__(Foo, *args, *kwargs) 调用 type.__new__(Foo, *args, *kwargs),然后返回一个对象。
  4. obj 随后通过 obj.__init__(*args, *kwargs) 被初始化。
  5. obj 被返回。

现在我们回过头来看你的两个例子,例1 是一个 __init__ 方法的经典类,由于存在 __init__ 方法,所以类在实例化的过程中,直接会对数据进行初始化;而例2 是一个没有 __init__ 方法的经典类,所以实例化的步骤缺少了第 4 步,需要在外部对数据进行初始化。


对于例2 的情况,在使用 sqlalchemy 对数据库操作中,是不建议使用 __init__ 方法的,具体的内容,你可以看看我的这个实战例子--https://github.com/eastossifr...

如果喜欢看视频,建议看看我的 B 站主页 -- https://space.bilibili.com/19...

关注 4 回答 3

认证与成就

  • SegmentFault 讲师
  • 获得 129 次点赞
  • 获得 39 枚徽章 获得 1 枚金徽章, 获得 9 枚银徽章, 获得 29 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

  • pyblog

    Pyblog 是一个简单易用的在线 Markdown 博客系统,它使用 Python 的 flask 架构,理论上支持所有 flask-sqlalchemy 所能支持的数据库。博客的内容全部是 Markdown 格式,你只需要将写好的 Markdown文件的内容提交即可。同时支持百度统计,代码高亮等常用功能。 https://eastossifrage.github.io/pyblog/

  • sql to sqlalchemy

    这是一个本人在使用 sqlalchemy 中,总结的实例。使用的数据库是 MySQL 自带的示范数据库 employees 。希望这个项目能够减少你学习 sqlalchemy 的时间成本。

注册于 2017-08-22
个人主页被 2.9k 人浏览