当前位置: 首页 > 工具软件 > gf-markdown > 使用案例 >

常用软件工具(Pycharm、码云、Git、 正则表达式、markdown、Jupyter、anaconda)

尉迟彬
2023-12-01

Part A. Pycharm的常用快捷键

参考来源

在PyCharm安装目录的help文件夹下可以找到ReferenceCard.pdf快捷键英文版说明。中文版的说明可见参考来源。

自定义的快捷键

ctrl+Num1:在文件夹中打开文件。
ctrl+Num2:显示本地的历史记录。

一、代码编写

1、一些常用的,不用解释说明的快捷键

Ctrl + /:注释(取消注释)选择的行
Shift + Enter:开始新行
TAB / Shift+TAB:缩进/取消缩进所选择的行
Ctrl + Y:删除当前插入符所在的行
Ctrl + D:复制当前行、或者选择的块
鼠标拖拉文件到pycharm:在pycharm中打开
Ctrl + ← :退回当前单词开头
Ctrl + Shift + ← :多选到当前单词开头
Ctrl + →:退回当前单词末尾
Ctrl + backspace:删除光标位置前的单词
Shift + F6:重命名。包括文件、函数。
todo : 前面加 # 在行头,就能在运行框的TODO直接索引到该位置。

2、快速插入常用代码:ctrl + J

File-》Setting-》Editor-》Live Templates-》Python进入代码片段编辑界面进行自定义常用代码。 参考
比如 # encoding = utf8 语句,自定义为endong。那么我可以用这个快捷键下拉选框找到它,或者我打了encode,它就能自动提示要不要转换。

3、智能重构:菜单栏的 Refactor

重构大类里面有:重命名、移动文件、移动函数等等。它能自动解决路径、依赖问题。
实践:需要点击到要更改的地方。

二、代码整理

1、一些常用的,不用解释说明的快捷键

Ctrl + Shift + NumPad+/-:展开或者收缩所有的代码块
Ctrl + Alt + L:代码格式化。如果与锁屏热键冲突,就加多win键一起按。
Ctrl + Alt + O:优化导入
Ctrl + Alt + I:自动稳定修复已选行的缩进。小写 i 就行了。
一个展示多个页面:鼠标放到当前导航处的文件名,然后右键 Split Vertically 或者 Split Horizontally 就可以啦。

2、函数调用层级可视化

在大型项目中,可视化函数调用关系。在 PyCharm 中,将光标定位到函数定义处,通过 Navigate->Call Hierarchy,则可以查看该函数调用层级关系。
实现发现:需要对弹出的框选择正三角、倒三角的图标(代表:Callee 被调用 / Caller 调用)这两种情况。

三、文档帮助、修正

Ctrl + P:参数信息(在方法中调用参数)
Ctrl + Q:快速查看文档
Ctrl + 鼠标:查看简介或跳转到变量的声明
Alt + Enter:快速修正
F2 / Shift + F2:下一条、前一条高亮的错误
Ctrl + Shift + I:快速查看变量函数等的定义
Ctrl + F12:弹出文件结构
Alt+F7 / Ctrl+Alt+F7:在下方菜单/弹出提示框显示该函数或变量的使用情况
Compare With(文件比较工具):右键文件或文件夹选择比较 diff。

四、运行、调试

Shift+F10/F9:运行/调试 当前代码文件
Alt+Shift+E:在控制台上运行选中的代码
F7:进入或执行下一行
F9 / Shift + F8:退出或执行到下一轮迭代
Alt + F9:运行游标
Alt + F8:验证表达式或写一些代码提取本轮数据
Ctrl + F8:增加/取消断点
Ctrl + Shift + F8 查看断点

五、查找、替换、书签

Ctrl+F / Ctrl+Shift+F:普通/高级查找。File mask 如果选择 .py 则会只在.py后缀的文件中查找。
Ctrl + R / Ctrl + Shift + R 普通/高级替换
F11 / Alt + F11:添加删除普通标签/记忆标签
Alt + [0-9]:传送到特定的记忆书签
Shift + F11:显示所有的书签
Ctrl+Shift+N:快速查找文件。非快捷键是Navigate -> File。

Part B. Pycharm的常用设置

或者不看下面的,直接设置字体大小就够了。

1、各种杂的 参考来源
待看上面的参考来源。。

2、设置代码模板(即自动生成注释:作者、时间、文件名等) 参考
打开设置 File-》Setting-》Editor -》File and Code Templates-》Python Script

# encoding=utf8
"""
    Author:  'cenhongjie'
    Date:    'create date: ${YEAR}-${MONTH}-${DAY}'; 'last updated date: ${YEAR}-${MONTH}-${DAY}'
    Email:   '568713651@qq.com'
    Describe: 

"""
from __future__ import print_function
import numpy as np
import os


3、加载大型项目时,如果一直在扫描,可以手动禁止排除扫遍哪些大型文件夹的。
参考
setting -> Project structure -> Excluded Folders

如果你想中途把大型文件加入到pycharm项目里面,可以先创建一个文件夹,然后对该文件夹Excluded Folders后,再把真正的文件夹拷贝或软链接到本处。

4、pycharm 无法输入中文 参考
当然也有人说是搜狗输入法要更新的问题。不过我用了参考的这个方法,当然也可能是重启软件的原因,就好了。

5、远程服务器参考1 参考2 参考3
(1)Tools -> Deployment -> Configuration -> Connection的Root path我实现发现最好设为 / ,Visable only for this project 要勾,不要让全部项目都可以用。在Mappings 选项卡中的Web path不用管。
(2)Tools -> Deployment -> Auto upload 设置自动上传到服务器中。
(3)可选:在pycharm下开终端,这样能一个界面下运行该项目。专门针对该项目的,而Terminator的是作其它杂的或统筹用途。Tools -> Start SSH Session
(4)如果要读取自己的私钥,选择SFTP后,Auth type 选择key pair(OpenSSH or PuTTY),然后输入私钥地址,和密码就行了。如果不能够直连,才去看下一步(5)。
(5)因为禁止直接远程服务器的原因,而必须要用跳板机。解法:先在ssh配置 ProxyCommand 代理,测试能够直接ssh 远程服务器后,本步骤 Auth type 选择OpenSSH config and authentication agent,。本步骤的 SFTP host 可以不填ip 而填ssh配置的Host名称就行。本步骤的 Port 就写ssh配置的端口。

6、自动换行 参考
只对当前文件有效:菜单栏->View -> Active Editor -> Use Soft Wraps。
对所有文件有效:settings -> Editor -> General -> Use soft wraps in console。

对所有文件有效,会有两个辅助选项:
(1)一个是additional shift 代表自动换行时前面空多少格。不用勾选。
(2)另一个是show indicators current line only 代表只在当前鼠标选的行显示换行符。建议勾选。

7、自己修改快捷键 参考
settings -> keymap 中修改自动格式化快捷键

8、待学:远程调试代码。可以print调试、也可以断点调试。
这样我就不需要每次传代码过去进行调试了。记得以前某个参考网址有的。

9、除了不是debug,不要使用pycharm的console控制台。因为我那次用jupyter加载10G微博词向量以及一些操作,jupyter快许多。迟些可以做实验看下:juypter、pycharm直接运行、pycharm-console控制台运行、python 直接调用代码。这四者哪个快。

10、运行工作台,有个戴眼镜的图标-show variables。这是debug时才用的,平时如果打开,会消耗内存的。

Part C. Pycharm与码云之间的操作

参考
1、pycharm上安装码云插件 参考
File->>Settings->>Plugins ->> 搜索 gitee 并安装 ->> 重启 idea

2、两者的连接
File -> Setting -> Version Control -> Gitee -> Creat API Token -> 输入账号密码 -> 测试能否连接

3、pycharm通过git上传到码云上的流程

先add,然后commit,最后push

(1)检查是否用着自己的邮件名、用户名

git config --global  --list

(2)右击项目根目录,git->add。
(3)右击项目根目录,git->compare with branch。比较检查本次提交修改的地方。

绿色表示新增,所以不用看。
灰色代表删除的,要看下是否删错了。
蓝色代表内容部分增加,或修改,或者完全相同。要看。

(4)导航栏VCS->commit->commit and push

Part D. Git语法、概念

《学习方法》
1、先把廖雪峰的博客看一下,然后看一下书籍。重在实践。实践后总结到这里。
总起-廖雪峰教程
菜鸟教程,也是很不错的,看完廖的可以简单看着来补充
中文的官方文档,比较啰嗦,最好不用看它
其它的网址的知识,可以根据工作的需要,要什么技术就学什么技术。

下面主要是摘录廖雪峰博客的笔记

1、通用符号的意义
HEAD代表当前分支、当前使用的版本。
master:主分支。
–:通常用于分离版本以及文件名两者,git不能区分哪些是版本的名字,哪些是文件的名字。
origin:远程仓库的默认名称,也可以改成别的,但是origin这个名字一看就知道是远程库。

2、git的三个区
(1)工作区
本地可以直接读取的文件。
(2)暂存区
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
注意:暂存区也有版本的功能
某时刻add到暂存区后,又作了修改。此时,进行checkout回滚,是回到add到暂存区的版本。此时,进行git diff,也是与暂存区的内容进行对比。
(3)版本区
存在很多的历史版本。使用reset来进行切换版本。

3、初始化一个Git仓库,使用git init命令。
不一定必须在空目录下创建Git仓库,选择一个已经有东西的目录也是可以的。

4、git add、git commit 两步把一个文件放到Git仓库
第一步,用命令git add告诉Git,把文件添加到仓库:
git add readme.txt

第二步,用命令git commit告诉Git,把文件提交到仓库:
git commit -m "wrote a readme file"

注意:
(1)commit可以一次提交很多文件,所以你可以多次add不同的文件。
(2)如果add的文件是同一份,将会以最新的一份为准。
以下两个流程相同结果:
(1)第一次修改 -> git add -> 第二次修改 -> git add -> git commit
(2)第一次修改 -> git add -> 第二次修改 -> git commit(只会提交第一次修改) -> git add -> git commit

5、git status 展示工作区的状态
它会提示使用checkout、reset等来进一处处理。

6、git checkout 撤销工作区的文件、切换分支

(1)撤销工作区的文件
git checkout -- readme.txt。如果没有--,就变成了“切换到另一个分支”的命令。--分离版本以及文件名两者。
情况一:readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
情况二:readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
(2)用于切换分支
使用checkout改变分支。已验证:不会丢失当前工作区、暂存区的修改。

7、git rm 删除文件
git rm filename
(1)执行此命令既会删除工作区的特定文件,也会把删除文件的操作放到暂存区。然后需commit后才提交到版本库中。
(2)会比rm更加安全,如果本地修改了,但是没有保存就删除了,用git rm会报告。

8、git clone 拉取远程仓库内容
(1)–recursive 代表子模块也下载。一般都带上它。
(2)码云给出的地址https开头、git开头的区别
使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。

9、git pull 的用法 参考

git pull <远程主机名> <远程分支名>:<本地分支名>
git pull = fetch + merge

比如,要取回origin主机的next分支,与本地的master分支合并,需要写成下面这样
git pull origin next:master

10、git diff 的用法 参考1 参考2
使用git diff --help 能看到官方文档。查看后发现:
(1)某些情况下如果不给,默认HEAD,但是我这边统一都给吧。
(2)git diff [options] [] [–] [ …]
可见有些博客会写的–,是可选的,我这边统一不谢。
(3) git diff优先工作区的文件与暂存区的文件进行对比。如果暂存区没有文件时,才会进行工作区与版本库的对比。
(4)如果要与版本库对比: git diff HEAD readme.txt命令可以查看工作区和版本库里面最新版本的区别

11、git remote 控制远程仓库 中文的官方文档
(1)git remote -v 查看已经添加的仓库名称,-v用于把仓库名对应的地址也显示出来。
(2)git remote add your_name your_path 用于添加远程仓库。
your_name:表示创建的远程仓库名字。
your_path:表示远程仓库映射的地址,比如码云某个项目的ssh地址。

实例:第一次推到码云上,如果远程库已经有文件如readme.md,而且本地没有该文件的变化记录。就需要pull先,才能push。参考

12、git push 命令
参考1 参考2
第一次推送到远程仓库时,需要加-u,后续就可以不用加。-u是–set-upstream的意思,用于避免多个远程仓库导致的混乱问题。
git push -u origin master

13、git merge 合并
(1)merge原理 参考
原理:用当前版本(即HEAD的版本)与目标的版本进行合并,然后HEAD游标、本分支的游标【两者本来就在一起的】,指向新产生的版本。
(2)解决冲突
方法:执行merge,然后对合并失败的文件进行手动编辑成我们想要的最终文件,再提交。
(3)如果默认情况下,进行merge,会把分支所做的操作全部变成master做的操作。这是很不合理的,不然都不能区分哪个员工做了哪些的操作。所以一定要加多参数–no-ff,这样合并相当于是master的一次版本更新,而不是单纯的游标移动。

14、git reset 切换版本、撤销暂存区的文件 参考1 参考2 参考3
(1)切换版本
通常使用不带参数的git reset就好了,比较安全。

git reset --mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit(版本库)和index(暂存区)信息
git reset --soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可
git reset  --hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容,此命令 慎用!

例子:git reset --hard commit_id
不用看:虽然能使用相对HEAD的位置,比如HEAD^表示上一个版本,但是我统一用上面的。
拓展,相似功能的git revert,暂时不用看。区别:git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进。参考

(2)撤销暂存区的文件
git reset HEAD readme.txt

15、查看历史
(1)穿梭以前,用git log可以查看提交历史,以便确定要回退到哪个版本。
如果嫌输出太多版本,导致看得眼花缭乱的,可以简化输出 git log --pretty=oneline

(2)重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

16、可视化图
(1)用git log --graph命令可以看到分支合并图。
git log --graph --pretty=oneline --abbrev-commit
(2)在pycharm下,version control框->log框。或者选择 git->show history

17、git branch 命令
(1)查看分支
情况1:查看远程分支
git branch -a
情况2:查看本地分支
git branch
(2)创建分支
首先,我们创建dev分支,然后切换到dev分支:

git branch dev
git checkout dev

又因为git checkout命令加上-b参数表示创建并切换,可以代替上面两条命令。所以常用下面。

git checkout -b dev

(3)删除分支

合并完成后,就可以放心地删除dev分支了:
git branch -d dev

18、git stash 命令
储藏的功能:把当前的工作区、暂存区的内容储藏起来,然后令当前分支干净。一个仓库里面,不同分支的储藏会放在一起,而且只要本分支干净,就允许调出其它分支的储藏内容。所以调出来时要小心。
(1)git stash list
显示全部的储藏信息。
(2)git stash apply stash@{0}
最后一个参数是可以从git stash list打印的信息中找到的。
(3)git stash drop 用于删除储藏的版本,但是我不知道会删掉哪一个。
(4)git stash pop 既弹出、有删除的意思,但是我不知道会删掉哪一个。。

19、推送到远程分支
参考博客-已实践
(1)远程先开好分支然后拉到本地

git checkout -b feature-branch origin/feature-branch    //检出远程的feature-branch分支到本地

(2)本地先开好分支然后推送到远程

git checkout -b feature-branch    //创建并切换到分支feature-branch  
git push origin feature-branch:feature-branch    //推送本地的feature-branch(冒号前面的)分支到远程origin的feature-branch(冒号后面的)分支(没有会自动创建)

书签:分支管理策略
我这边通常使用码云的,不用github。
自己已经在码云新建一个仓库了,准备使用它 learn_git 项目。

《拓展工具》

1、使用lfs处理大型文件

上传大型文件使用,因为会被限制大小,所以用lfs来上传。
参考博客1
参考博客2
[公司viki也有教程的]

《名词概念》

1、Patch 参考
补丁的意思。patch 作用:可以根据一个diff文件进行版本更新,不需要完整地上传下载文件。

《问题及解决办法》

报错:HEAD detached at 696aac3
原因:当使用 git checkout < branch_name> 切换分支时,HEAD 会移动到指定分支。但是如果使用的是 git checkout < commit id>,即切换到指定的某一次提交,HEAD 就会处于 detached 状态(游离状态)。
解决办法:我暂时因为是用别人的代码,不需要提交,所以不管它就行了。如果想提交,见参考解决办法,大致是创建新的分支。

Part E. 码云

Part F. 正则表达式

一份极好的博客: 地址
此外,cookbook 也有一些使用技巧。

一、一些基本要用的符号

1、加?变非贪婪模式。

例如:正则表达式"ab*“如果用于查找"abbbc”,将找到"abbb"。而如果使用非贪婪的数量词"ab*?",将找到"a"。

2、使用r处理反斜杠。

这样你才能用如\w去匹配,不然你要\\w。

二、匹配

1、先要编译 re.compile(strPattern[, flag])

strPattern是匹配模式串。flag是可选的模式。
(1)re.X(re.VERBOSE)是详细模式。这个模式下正则表达式可以是多行,忽略空白字符。例子以下两个等价

a = re.compile(r"""\d +  # the integral part
                   \.    # the decimal point
                   \d *  # some fractional digits""", re.X)
a = re.compile(r"\d+\.\d*")

(2)re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同,两种调用都可以)。
(3)re.M(re.MULTILINE): 多行模式,改变’^‘和’$‘的行为。匹配每一行的开头结尾。
原本:匹配字符串(文段)的开头结尾。
(4)re.S(re.DOTALL): 点任意匹配模式,改变’.‘的行为,能匹配全部字符。
原来’.'匹配除了\n换行符外的任意字符。如果使用该模式,就能全部字符都匹配。

2、match对象

调用match、search函数,返回的是match对象。
对象的内部函数:

group([group1, …]): 
获得一个或多个分组截获的字符串;指定多个参数时将以元组形式返回。group1可以使用编号也可以使用别名;编号0代表被匹配的字符串,没什么用;默认返回group(0);没有截获字符串的组返回None;截获了多次的组返回最后一次截获的子串。
groups([default]): 
以元组形式返回全部分组截获的字符串。相当于调用group(1,2,…last)。default表示没有匹配到字符串的组以这个值替代,默认为None。
3、search与match

功能:一次的匹配。
返回:一个match对象。
区别:match只能固定位置开始,而search如果当前位置开始匹配不成功,它会找下一个下标。记住search就行。

例子1:
pattern = re.compile(r'hello')
match = pattern.match('hello world!')
if match:
    print match.group() # 输出 hello
例子2:此例使用match()无法成功匹配 
pattern = re.compile(r'world') 
match = pattern.search('hello world!') 
if match: 
	print match.group()  # 输出 world
4、findall

作用:多次的匹配,返回全部匹配的子串。
返回:list形式。
拓展:finditer 与本函数区别是迭代,而且它返回的是match对象。因为内存还是够的所以不用学它。

p = re.compile(r'\d+')
print p.findall('one1two2three3four4') # 输出 ['1', '2', '3', '4']

三、切分、替换(因为可以直接用python内部函数,所以下面待整理)

1、split 原字符串对象的split不支持多个分隔符,所以要用正则的split

re.split(r"[0-9]",one_str)
注:使用括号匹配(即捕获组)的split,如(0-9) 而如(?:…)就取消括号是捕获组。捕获组不会删除分隔符,捕获的内容会保留下来。

\d 可以匹配一个数字,\w 可以匹配一个字母或数字

[\u4e00-\u9fa5]是匹配一个汉字的意思。在范围前面加个^ 意思是取反,而不是限制开头。 + 意思是连在一起的会当做一个。

p = re.compile(ur'[^\u4e00-\u9fa5]+')#先进行编译,然后得到的p就能在很多地方使用了。 r 是为了避免不用\\ 表示一个\。
text = p.sub(u' ', text).strip()
text = re.split(ur'!|,|。|?|;', text) # 遇到这些东西都会被舍弃而切分成一个个地小段

[]的作用 :[]内的字符可以以任意次序出现。
[]后有了+,[]内的字符可以取任意多个。于是[]内的字符可以以任意次序出现任意多次,直到遇到第一个非[]内的字符。

如[AB]+ 既可以匹配AAABBB又可以匹配BBBAAA BABAAABA等,不是一定要A…B…的次序。

2、sub或subn进行替换字符串。

Part G. Markdown常用语法

(1)在表格中插入图片
参考1 参考2
直接插入图片到表格位置就行了。

利用github存储图片,在markdown引用图片链接地址 步骤如下:
1.将markdown需要用的图片放到git仓库中,发布到github上
2.访问github仓库,smshen/MarkdownPhotos · GitHub 
3.访问图片MarkdownPhotos/test.jpg at master · smshen/MarkdownPhotos · GitHub
4.点 download 按钮,在地址栏可以复制图片地址,或者在Download按钮上直接右键 "复制链接地址"
5.拷贝链接地址https://raw.githubusercontent.com/smshen/MarkdownPhotos/master/Res/test.jpg
6.在Markdown中引用图片,![Aaron Swartz](https://raw.githubusercontent.com/smshen/MarkdownPhotos/master/Res/test.jpg)

Part H. Jupyter 使用

一、参数说明

参考
–NotebookApp.allow_remote_access=True:默认是False,如果公网远程,需要设为True。

二、jupyter 远程访问

1、内网范围的远程
参考1参考2参考3
我实践了下,c.NotebookApp.ip='*' 这一句如果开了,jupyter notebook 直接运行会端口报错OSError: [Errno 99] Cannot assign requested address,需要加--ip= 这个参数或者不打开就没事。

此外,主要还是由于局域网,以及少量可能防火墙被监管问题。所以只能支持局域网的共享。此时要加上--ip= 这个参数,并不是教程里面的直接替换ip地址就可以了(教程的可能本来就不是局域网)。

jupyter notebook --ip=内网ip地址

2、公网范围的远程
需要用到natapp来实现内网穿透。开启http协议通道,并把端口号开到【某自定义端口号】,然后jupyter也开到这个端口。

jupyter-notebook --port 端口号 --ip=127.0.0.1 --NotebookApp.allow_remote_access=True

三、解决报错:

(1)Error executing Jupyter command 'notebook': [Errno 2] No such file or directory
(2)Error when executing "jupyter notebook" (No such file or directory)

参考1参考2参考3参考4-卸载jupyter

我的实践:
上面说的很多是重装jupyter,但是我在学校的服务器一直删除不干净,重装也不行。不仅在python第三方目录下,在ubuntu的bin目录也有jupyter,所以我怀疑 jupyter 是apt安装的全局变量。

jupyter notebook运行会报notebook找不到,然后我在anaconda3/bin下面找到了 jupyter-notebook,如果直接运行也不行(某些机器可以某些不行),那么python3 jupyter-notebook 就能运行了。当我切换到不是 anaconda3/bin 目录下的时候,尽管配置了环境变量,该语句找不到 jupyter-notebook 文件,所以我把 jupyter-notebook 文件做了软链接到当前目录,就可以了。

Part I. anaconda使用

1、解决(base)在终端提示符最左端
原因:这是anaconda3安装时导致的。我直接运行.sh安装文件最后一步使用conda初始化anaconda3,我选择yes。初始化后它就自动说了解决办法。
解决:

conda config --set auto_activate_base False

2、增加多个python环境 / python内核
即python2、python3等多个,且多版本。
google搜索了下是有的,但未细看文章

 类似资料: