sed

特殊字符反斜杠的问题

#sed -i '4 s/^/good baby\n/' test.txt 
执行成功,符合预期,但是
#sed -i '4 s/^/<center>查询结果:6个  <a href="./">继续</a>/' test.txt
却运行失败,经多次尝试排查,终于发现原因。
因为正则表达式中有'/'这个特殊字符,应该进行转义。
改成'\/'即可,但是实际在C代码中,采用system(cmd)的方式,并未成功

由于时间紧张,未能深入排查。
但是在排查的时候,意外发现把's'换成‘a’,即进行追加而不是替换的话,可以完美工作。
不需要考虑特殊字符的转义问题,在'a'后面,反斜杠'/'成了普通字符。

#sed -i '8 a<center>查询结果:6个  <a href="./">继续</a>' test.txt

一个常用技巧,查询数据类型在哪个头文件中定义
grep -rn keyWords ../../ | sed -n "/\.h:\w\+/"p

find ../ -name '*.c' | xargs grep -rni keyWords
--->>输出中带有路径

find ../ -type f | grep '\.c' | xargs grep -rni keyWords
-->>这种情况下,输出带有路径,行数,内容

find ../ -name '*.c' | xargs -i grep -rni keyWords {}
==>>这种情况下,输出结果中,没有文件名

grep 执行条目过多时,会报错
# grep -rni keyWords `find ../../ -name *.c`

找到关键字所在的行,将其替换为别的内容
如:void function(int a, int b) 修改为:
static void function(int a, int b)

fileName=/home/user/a.c
lineNum=`sed -n '/void function/=' a.c` ; \
echo ${lineNum}; \
sed -i "${lineNum}d" a.c; \
sed -i "${lineNum}iStatic void function(int a, int b)" a.c

说明: sed -i "${lineNum}d" 删除指定行
      sed -i "${lineNum}iXXX" 在指定行插入XXX
      sed -n "/key/=" 查找关键字所在行,如果是多个,
则返回 3 5 7 这样的字符串,可以用数组接收

找到关键字,并在其后追加一行
第一步,制作准备原始文件
# cat pps
aaaa
bbbb
cccc
dddd

第二步,命令行实验,尝试先查找"cccc"所在的行,并在其后追加"zzzz"
# sed -e "/cccc azzzz"
aaaa
bbbb
cccc
zzzz
dddd

第三步,因为第二步实验成功,将其写入文件
# sed -i "/cccc azzzz" pps
# cat pps
aaaa
bbbb
cccc
zzzz
dddd

一个高难度应用
1、问题描述
源文本如下:
<test> blah blah   blah blah blah   widget   blah blah blah
</test>
<formula>   blah   <details>      widget   </details>
</formula>

希望从文本中,提取出如下内容:
<test>widget</test> 
<formula>widget</formula>

2、实现脚本
sed -ne '/[Ww][Ii][Dd][Gg][Ee][Tt]/,/^<\// {//p}' file.txt | awk 'NR%2==1 { sub(/^[ \t]+/, ""); search = $0 }

效果:
<test>widget</test>
<formula>widget</formula>

3、脚本讲解
## The sed pipe: 
sed -ne '/[Ww][Ii][Dd][Gg][Ee][Tt]/,/^<\// {//p}'
## This finds the widget pattern, ignoring case, then finds the last, 
## highest level markup tag (these must match the start of the line)
## Ultimately, this prints two lines for each pattern match 
## Now the awk pipe: 
NR%2==1 { sub(/^[ \t]+/, ""); search = $0 }
## This takes the first line (the widget pattern) and removes leading
## whitespace, saving the pattern in 'search' 
NR%2==0 { end = $0; sub(/^<\//, "<"); printf "%s%s%s\n", $0, search, end }
## This finds the next line (which is even), and stores the markup tag in 'end'
## We then remove the slash from this tag and print it, the widget pattern, and
## the saved markup tag

对包含特殊关键字的行进行操作
1、在包含关键字的行中,删除另外一个关键字
# cat ass.txt
good boy
good man
good girl
# 将包含 man 的行中,对应的关键字 good 删除
# sed -i /man/{s/good//} ass.txt
# cat ass.txt
good boy
 man
good girl

2、将同时包含关键字A和关键字B的行删除
# cat ass.txt
good boy
good man
good girl
# 将包含 man 的行中,对应的关键字 good 删除
# sed -i /man/{/good/d} ass.txt
# cat ass.txt
good boy
good girl

sed 的一个大 bug
1、诡异现象
写入文件,出现故障。
一段脚本之中,前面写入表现都很正常。
但是执行到某一段代码时,出现莫名其妙的故障,代码如下:

#==>>这是前面一段代码,表现正常,能成功写入,符合预期
for fileName in ${file_1} ${file_2}
do
    lineNum=`sed -n /keyword_1/= ${fileName}`
    startLine=$((lineNum - 5))
    endLine=$((lineNum + 2))
    # 删除这一段内容
    sed -i "${startLine},${endLine} d"
    # 下面用 sed 重新插入代码
    sed -i "${startLine}a #ifndef OK" ${fileName} ; startLine=$((${startLine} + 1))
    sleep 0.01 # 为了防止写文件太耗时,加一个延时10ms
    sed -i "${startLine}a #define OK 0" ${fileName} ; startLine=$((${startLine} + 1))
    sleep 0.01 # 为了防止写文件太耗时,加一个延时10ms
    sed -i "${startLine}a #define ERRPR 1" ${fileName} ; startLine=$((${startLine} + 1))
    sleep 0.01 # 为了防止写文件太耗时,加一个延时10ms
    ...
    sed -i "${startLine}a #endif" ${fileName} ; startLine=$((${startLine} + 1))
done

#==>>第二段代码,与第一段雷同,只是行数略多,20行而已,但是后来发现跟行数无关
for fileName in ${file_3} ${file_4}
do
    lineNum=`sed -n /keyword_2/= ${fileName}`
    startLine=$((lineNum - 19))
    endLine=$((lineNum + 2))
    # 删除这一段内容
    sed -i "${startLine},${endLine} d"
    # 下面用 sed 重新插入代码
    sed -i "${startLine}a #ifndef OK" ${fileName} ; startLine=$((${startLine} + 1))
    sleep 0.01 # 为了防止写文件太耗时,加一个延时10ms
    sed -i "${startLine}a #define OK 0" ${fileName} ; startLine=$((${startLine} + 1))
    sleep 0.01 # 为了防止写文件太耗时,加一个延时10ms
    sed -i "${startLine}a #define ERRPR 1" ${fileName} ; startLine=$((${startLine} + 1))
    sleep 0.01 # 为了防止写文件太耗时,加一个延时10ms
    ...
    sed -i "${startLine}a #endif" ${fileName} ; startLine=$((${startLine} + 1))
done
# 此时,执行到第二段代码时,实际上成了死循环。如果只有一两行写入语句
# 还能跳出死循环,但目标文件已被写乱掉
# 如果行数多,直接就是死循环,及时中止,txt 文件已经达到37M
# 此问题百思不得其解,实在诡异

2、发现一点不同
在出故障的代码段中,发现最后一行行为正常:
    sed -i "${startLine}a #endif" ${fileName} ; startLine=$((${startLine} + 1))
它能正常写入,然后用它替换其它的行:
sed -i "${startLine}a #ifndef OK" ${fileName} ; startLine=$((${startLine} + 1))
改为 `#endif`之后,就能正常写入,其它字符串就不行,将中间空格去掉也不行:
sed -i "${startLine}a #ifndefOK" ${fileName} ; startLine=$((${startLine} + 1))

到了这份上,其实不就是写一个普通字符串吗,`#ifndefOK` 和 `#endif`能有啥区别?

samba

win7上,清除记录的samba密码

打开CMD,输入 control userpasswords2或者 control keymgr.dll

安装与启动

在 centos7 上,安装命令如下: yum -y install samba
启动命令:systemctrl start smb.service

添加 samba 用户
首先用户必须是系统用户:
  useradd ...

然后才是 samba 添加用户:
  smbpasswd -a userName #添加用户的同时设置密码
  smbpasswd userName  #更改用户密码

二、在linux下,怎样访问别的linux提供的samba服务:smbclient

1、别人的说明

来源链接:https://blog.csdn.net/yexiangcsdn/article/details/82867469

smbclient 命令属于 samba 套件,它提供一种命令行使用交互式方式访问samba服务器的共享资源。
语法:
smbclient(选项)(参数)
选项
-B<ip地址>:传送广播数据包时所用的IP地址;
-d<排错层级>:指定记录文件所记载事件的详细程度;
-E:将信息送到标准错误输出设备;
-h:显示帮助;
-i<范围>:设置NetBIOS名称范围;
-I<IP地址>:指定服务器的IP地址;
-l<记录文件>:指定记录文件的名称;
-L:显示服务器端所分享出来的所有资源;
-M<NetBIOS名称>:可利用WinPopup协议,将信息送给选项中所指定的主机;
-n<NetBIOS名称>:指定用户端所要使用的NetBIOS名称;
-N:不用询问密码;
-O<连接槽选项>:设置用户端TCP连接槽的选项;
-p<TCP连接端口>:指定服务器端TCP连接端口编号;
-R<名称解析顺序>:设置NetBIOS名称解析的顺序;
-s<目录>:指定smb.conf所在的目录;
-t<服务器字码>:设置用何种字符码来解析服务器端的文件名称;
-T<tar选项>:备份服务器端分享的全部文件,并打包成tar格式的文件;
-U<用户名称>:指定用户名称;
-w<工作群组>:指定工作群组名称。

参数
smb服务器:指定要连接的smb服务器。

实例
列出某个IP地址所提供的共享文件夹
    smbclient -L 198.168.0.1 -U username%password

像ftp客户端一样使用smbclient
    smbclient //192.168.0.1/tmp  -U username%password

执行 smbclient 命令成功后,进入 smbclient 环境,出现提示符:smb:/> 
这里有许多命令和ftp命令相似,如cd 、lcd、get、megt、put、mput等。通过这些命令,我们可以访问远程主机的共享资源。

直接一次性使用smbclient命令
smbclient -c "ls"  //192.168.0.1/tmp  -U username%password 和 
smbclient //192.168.0.1/tmp  -U username%password  smb:/>ls 功能一样的。

创建一个共享文件夹
smbclient -c "mkdir share1" //192.168.0.1/tmp -U username%password 

如果用户共享//192.168.0.1/tmp的方式是只读的,会提示NT_STATUS_ACCESS_DENIED making remote directory /share1

2、成功登录

smbclient //10.63.180.93/user -U user%password

3、成功将远程SAMBA目录转变为本地目录

sudo su ===>>必须先切换到root模式
mkdir /mnt/server_9

mount -t cifs -o username="userName",password="passWd" //192.168.1.9/userName /mnt/server_9


https://blog.csdn.net/Liuqz2009/article/details/51036840

samba访问共享提示,NT_STATUS_ACCESS_DENIED
samba访问共享提示,NT_STATUS_ACCESS_DENIED listing \*

rsync

一、scp引出的麻烦

公司桌面迁移,从win7迁移到linux.
需要自行迁移数据,于是在windows上用 mobaxterm 开启了一个 sshd 服务。

在 linux 执行:
scp -r -P 2222 user@192.168.1.3:/cygdrive/d/escape ./

然后就静静的等,等它同步完成。

等了一天一夜,终于结束。但是很奇怪。
linux预留空间是290G,win7上的文件夹是160G,怎么现在Linux硬盘满了,显然同步还没有完成。

于是百度一番,原来 scp 确实存在这样的问题,主要是自己对各参数不精通。默认情况下它会给空目录分配空间,造成空间变大

然后改用人家推荐的 rsync 来同步:
rsync -avzP -e 'ssh -p 2222' --progress --delete  user@192.168.1.3:/cygdrive/d/escape ./

发现其同步速度比 scp 要快太多

rsync 多种参数配置
rsync -avvz --times --stats --checksum --human-readable --acls \
--itemize-changes --progress \
--out-format='[%t] [%i] (Last Modified: %M) (bytes: %-10l) %-100n' \
/usr/include/glib-2.0 my-glib-copy/

个参数意义解释如下:
> -avvz = archive,verbose x 2,compress
> –times =保留修改时间
> –stats =提供一些文件传输统计信息
> –checksum =基于校验和跳过,而非mod-time&尺寸
> –human-readable =以人类可读格式输出的数字
> –acls =保留ACL(隐含-p)
> –itemize-changes =输出所有更新的更改摘要
> –progress =显示转移期间的进度
> –out-format ='[%t] [%i](上次修改时间:%M)(字节:%-10l)%-100n’ 
>%t =当前日期时间
>%i =正在更新的内容的逐项清单
>%M =文件的上次修改时间
>%-10l =文件的长度(以字节为单位)(-10表示对齐和精度)
>%-100n =文件名(短格式;在目录上尾随“/”)( – 100表示对齐和精度) 
注意:有关上述开关的完整详细信息,请参见rsync和rsyncd.conf的手册页. 
上面的命令产生以下脚本:

ReacOS

一、初次接触

2006年我大四,老师分配的任务就做抄作系统汉化。
选择的就是 ReacOS,当时还没有中文版

二、时隔多年,这次提起

因为公司在推进去windows化,大家都在像 linux 迁移。
   但是很多 windows 程序无法找到替代品
   此时,有人说用wine~~这玩意我上次实验了一下,没成功。
   我又想到了 ReactOS.

三、baidu查看最新进展

https://www.ithome.com/html/win10/378530.htm

https://m.ithome.com/html/378530.htm

挺好,应该搞一个到虚拟机上玩玩了
https://www.cr173.com/soft/811932.html

rdesktop

修改配置
 vi /etc/locale.conf
 LANG= "zh_CN.UTF-8" 

安装语言包
yum install -y kde-l10n-Chinese glibc-common

查看语言包
locale

IBus重启提示无法连接解决办法
ibus-daemon -r -d -x

最后,发现只能输入英文,无法输入五笔
  用 root 身份在终端下,运行下面命令:
yum install ibus-pinyin ibus ibus-gtk ibus-qt
使用im-chooser命令,选择ibus为默认输入法
重新登录桌面系统。

ibus 确实生效了,但是部分窗口无法输入中文
如何解决Linux在`某些`软件内无法输入中文的问题?
上网查过,但是他们的解决方法基本上就是在设置环境变量,但是对于一些软件真的没用,只要是鼠标点击某些软件的输入框,输入法就会切换成`布局\键盘`,而且无法切换成中文,试过好几种中午跟输入法,都是这样.

vim /root/.bashrc
export LC_CTYPE=zh_CN.UTF-8
操作之后---->> 然并卵

一、remmina搞不定,想其他办法

尝试 rdesktop

二、安装

sudo yum -y install rdesktop

三、用法

rdesktop 192.168.1.3

rdesktop -u UserName -p Paswd 192.168.1.3 -r sound:off/on -g 1024*768

多次尝试分辨率,都不满意,度娘说可以按照百分比设置
rdesktop -u UserName -p Paswd 192.168.1.3 -r sound:off/on -g 99%
完美搞定!

四、其他参数

-d domain
-f full screen
-r clipboard:PRIMARYCLIPBOARD剪切板可以与远程桌面交互
-r sound:on/off 声音开关
-r disk:share_name=/local-disk 将本地磁盘映射到远程电脑。
share_name为显示名称。如/data

python

python2.7 中的调试模块

https://blog.csdn.net/weixin_33843409/article/details/92691700

python 中的zip函数
import os,pdb
ass=zip(["good","better","best","supper"],[[],[],None,None])
myDict=dict(ass)
print(ass)
print(myDict)

用 python2.7 的执行结果:

----------------
 $ python2.7 ass.py
[('good', []), ('better', []), ('best', None), ('supper', None)]
------------------
{'better': [], 'good': [], 'best': None, 'supper': None}

用 python3.8 的执行结果:

 $ python ass.py
<zip object at 0xe838be28>
-------------------
{'good': [], 'better': [], 'best': None, 'supper': None}
$

python模块中 all 的作用

test.py文件开头写上: __all__ =[func1,func2]
当其它文件导入 from test import *
只会导出"[func1, func2]"里面的内容,其它调用不行

python中为什么要继承 object 类
https://www.zhihu.com/question/19754936

python2.7中,将输入内容转化为unicode

https://www.cnblogs.com/jinjiangongzuoshi/p/4375071.html

import  os, sys
val=raw_input("input your name:").decode(sys.stdin.encoding)


decode作用是把其它编码的字符串转换成unicode编码:name.decode("GB2312")
encode则是将unicode编码的字符串转换成其它编码:name.encode("GB232")表示将

又一个惊掉下巴的用法

import os,sys
[print("i=%d"%(i))  for i in range(0,1)]


此语句在 python3.7 环境运行,成功输出0~9
但在python2.7环境运行,却提示语法错误。但是在python2.7的项目中,却出现了此语法而没有报错,晕...

python中创建元组tuple

https://www.cnblogs.com/SCCQ/p/1266543.html
创建元组的方法,与创建列表很类似,只是将创建列表时的【】改为()即可:

创建元组:t=('aa','bb','cc')
创建数组:s=['aa','bb','cc']
两者区别在于,元组创建之后,即不能再更改,也不能插入。而数组可以随便操作

python中参数带星号的作用

https://blog.csdn.net/claire03/article/details/78950998?utm_source=blogxgwz5
1、对于函数定义:表示允许接收过量参数
2、对于调用,表示将参数打包成一个参数传入,然后在函数内部解开

python异常处理

import os,pdb
arr=[1,2,3,4,5]
for i in range(3,10):
    try:
        print(arr[i])
    except:
        print(%d failed"%(i))

python同时给多个变量赋值
  直接赋值
  a,b=0,1
  assert a==0
  assert b==1
  从数组(列表)赋值
  (r,g,b)==["red","green","blue"]
  assert r=="red"
  assert g=="green"
  assert b=="blue"
  从元组赋值
  (x,y)=(1,2)
  assert x==1
  assert y==2

python字典遍历
https://www.cnblogs.com/FlyingLiao/p/11192330.html

python中的property关键字

简而言之,就是把函数当成成员变量一样的 get.
具体解释,还是廖雪峰说的明白
https://www.liaoxuefeng.com/wiki/897692888725344/923030524000032

python中星号参数的作用

一句话简述:
      一个星号就是压缩参数与解压参数
  定义的地方,def func(a,b,*args)表示支持参数扩展,把收到的一个参数扩展成N个。
  相应的,在调用的地方,则表示将多个数据打包成一个参数传入
  https://blog.csdn.net/mm2zzyzzp/article/details/83057152

python2.7开发环境迁移

1、故事背景

因为工作需要,原来的windows环境需要切换为linux。
本机所有文件都被限期迁移到linux上。
整个团队只有一台win-server2008。

原来本地部署的python开发环境,经过长期积累,已经安装了许
多第三方库。即将面临废弃的风险。

迫切需要将现在开发环境原封不动的移到新服务器上

2、迁移方法,以及其中遇到的问题

方法:
   最简单的将 C:\python27 目录直接复制过去

遇到问题一:
   一开始运行简单程序还好,没问题。但是执行到某些第三方库时,会提示找不到对应的dll。
解决办法:
   将 python2.7.msi 安装文件,重新执行一次安装操作,选择修复。修复结束后,不再提示错误。

遇到问题二:
   操作excel时报错,花费了半天时间。一开始以为是 win32com模块在迁移后出了问题。
   后来认真查看错误,百度查找。原来只是因为服务器上没有安装office/excel 或者 wps/excel。
解决办法:
   安装wps/excel之后,即可正常执行,能生成excel和数据库

python 大数据扫描内存不足问题解决

1、来源

【解决Python memory error的问题(四种解决方案)_小白白的博客-CSDN博客】https://blog.csdn.net/weixin_39750084/article/details/81501395

2、引出问题

本文原作者:
昨天在用用Pycharm读取一个200+M的CSV的过程中,竟然出现了Memory Error!
简直让我怀疑自己买了个假电脑,毕竟是8G内存i7处理器,一度怀疑自己装了假的内存条。
下面说一下几个解题步骤。。。。一般就是用下面这些方法了,按顺序试试.

本人的原由:因为扫描100G左右的 TXT 文件,逐个进行内容
分析,
内存显然还没有用尽,程序就报 memory error!找了很久,
好不容易找到这篇文档,尝试后成功解决问题。

一、逐行读取

如果你用pd.read_csv来读文件,会一次性把数据都读到内存里来,导致内存爆掉,那么一个想法就是一行一行地读它,代码如下:
data = []
with open(path, 'r',encoding='gbk',errors='ignore') as f:
    for line in f:
        data.append(line.split(','))
        data = pd.DataFrame(data[0:100])

这就是先用with open把csv的每一行读成一个字符串,然后因为csv都是靠逗号分隔符来分割每列的数据的,那么通过逗号分割就可以把这些列都分离开了,然后把每一行的list都放到一个list中,形成二维数组,再转换成DataFrame。
这个方法有一些问题,首先读进来之后索引和列名都需要重新调整,其次很多数字的类型都发生了变化,变成了字符串,最后是最后一列会把换行符包含进去,需要用replace替换掉。 
不知道为什么,用了这个操作之后,还是出现了Memory error的问题。基于这些缺点以及遗留问题,考虑第二种解决方案。 

二、巧用pandas中read_csv的块读取功能

pandas设计时应该是早就考虑到了这些可能存在的问题,所以在read功能中设计了块读取的功能,也就是不会一次性把所有的数据都放到内存中来,而是分块读到内存中,最后再将块合并到一起,形成一个完整的DataFrame。
f = open(path)
data = pd.read_csv(path, sep=',',engine = 'python',iterator=True)
loop = True
chunkSize = 1000
chunks = []
index=0
while loop:
    try:
        print(index)
        chunk = data.get_chunk(chunkSize)
        chunks.append(chunk)
        index+=1
    except StopIteration:
        loop = False
        print("Iteration is stopped.")
        print('开始合并')
        data = pd.concat(chunks, ignore_index= True)

以上代码规定用迭代器分块读取,并规定了每一块的大小,即chunkSize,这是指定每个块包含的行数。
这个方法能够保持数据的类型,也不需要自己费心思去调整列名和index,比较方便。但不幸的是,我的还是出现了这个问题,如果你的用了这种方法还是出现memory error,你可以继续往下看。 

三、扩充虚拟内存

我在运行代码的过程中发现,出现memory error错误的时候,其实我的内存只用到了40+%,
所以其实不太可能会出现这个错误啊,所以我查了下,发现有说是内存被限制了,
考虑关掉一些可能限制内存的软件啦,扩大虚拟内存啦,这些的。
扩大虚拟内存的方法(我的系统是win8,不过应该都大同小异):
1、打开 控制面板;
2、找到 系统 这一项;
3、找到 高级系统设置 这一项;
4、点击 性能 模块的 设置 按钮;
5、选择 高级面板,在 虚拟内存 模块点击更改;
6、记得 不要 选中“自动管理所有驱动器的分页文件大小”,然后选择一个驱动器,也就是一个盘,选中自定义大小,手动输入初始大小和最大值,当然,最好不要太大,更改之后能在查看盘的使用情况,不要丢掉太多空间。
7、都设置好之后,记得点击 “设置”, 然后再确定,否则无效,最后 重启电脑 就可以了。
悲剧的是我在设置完这一步之后还是出现了内存错误,到这一步就没有问题了的朋友就可以不用看下面一种解法了,如果还是有问题,可以接下来看。

四、更新Pandas和Numpy库为64位

如果你的Python用的是32位的,那么你的pandas和Numpy也只能是32位的,那么当你的内存使用超过2G时,就会自动终止内存。发现这个错误也是因为我察觉到报内存溢出的错误的时候,我的内存明明显示只用了40+%,然后错误提示是在pandas的core中,所以查了一下,发现原来还有这么个大坑。 
解决方法就是:先检查一下你的python是多少位的,在shell中输入python,查看位数,如果是32位,那么就重装Python,装一个64位的,但同时你的库也需要重新装了。不过我执行完这一步之后,问题就完美解决了!

五、如果还有内存溢出的错

    以上四种方法,按顺序逐一使用,到哪一步错误消失了就可以停止啦。
当然了,如果你的内存显示使用达到了99%+,那么就是内存真的不够用,
不是别的问题,如果不是数据量特别大,那就是写代码的时候的习惯问题,
虽然Python有垃圾回收机制,但是有时候可能来不及回收,尤其是在循环迭代这些过程中,
往往会循环完毕了才来得及收拾垃圾,所以记得及时把不要的变量del掉,
或者用gc这个垃圾回收库,这样内存自然就一直清清爽爽啦~

字典中先判断变量是否定义,没有的话则定义

1、引出问题

因为自己负责的python代码崩溃,通过添加打印,终于找到死因:
访问了没有定义的字典元素。
将故障演示如下

##2、故障演示

a={"a1":(39,40,41,42),
   "a2":(49,50,51),
  };
print(a); print(a["a1"]); print(a["a2"])

if 50 in a["a1"]:
    print "good-1"

if 50 in a["a2"]:
    print "good-2"

# 这里就是故障发生的地方,我用try规避了一下
try:
    print a["a3"]
except:
    a["a3"]={}

# 换一种更加科学的写法
if "a3" in a.keys():
    print ("a3 in in a dictionary!")
    1; #如果数据量太大,打印会严重影响速度,直接放个1什么事情都不做
else:
    a["a3"]={}

pip 安装自己的库文件
1、用法
pip install pywin32 --trusted-host mirrors.my.com.cn -i http://mirrors.my.com.cn/pypi/simple

pip install pywin32 --trusted-host 192.168.1.9 -i http://192.168.1.9/pypi/simple

2、怎样制作自己的服务器

来源
https://www.cnblogs.com/special-li/p/9149573.html

具体操作
应用场景:  Windows10
安装 : pip install pypiserver
使用 :服务器端
创建包仓库,eg D:/packages
把下载好的python包放到创建好的仓库里
启动pypi-server服务器,并指定仓库目录
## Will listen to all IPs.
pypi-server -p 8080 D:/packages

客户端
配置pip.ini文件
[global]
index-url=http://<server_ip>:8080/simple
trusted-host=<server_ip>
no-warn-script-location=False

从服务器下载packages
pip install <package>

搜索包
pip search --index http://<server_ip>:8080

值得注意的是: 想要search正常工作,url后面不能以 simple 结尾

获取帮助信息
pypi-server --help

满足条件时进入断点
import pdb
if (isValidCondition(3)):
    print("something error happens")
    pdb.set_trace

ModuleNotFoundError: No module named 'setuptools'
执行python安装命令时报错"ModuleNotFoundError: No module named 'setuptools'"如何处理?

答: 安装python-setuptools/python3-setuptools
$ sudo apt-get install python-setuptools python3-setuptools

python unitTest

https:/www.cnblogs.com/coderzh/archive/2009/12/01/pythoncoverage.html
仅仅四步即实现代码覆盖率的统计功能

python2.7 -m pip install coverage
unittest相关
https://docs.python.org/zh-cn/3.7/library/unittest.html

yield函数

import  re
import  pdb
def yield_test(n):
    for i in range(n):
        yield call(i)
        print("step_3:i=%d\n"%i)
    print("do something else..")
    print("end."

def call(i):
    print("step_1: input %d and call() returns %d"%(i,i*2))
    return i*2

for result in yield_test(5):
    print("step_2:result = %d"%(result))


https://www.cnblogs.com/ethancui/p/5656757.html
这个实践收获很不错,特别爽,人家写的也好。

powershell

删除一个文件或文件夹(或其它输入的目标)

Remove-Item cmdlet 正好顾名思义:它能使你清除一个东西和所有东西。清除文件C:/Script/test.txt ?那就删除它:
Remove - Item c:/scripts test.txt 
你也可以使用通配字符删除多个项目。举个例子,这个命令会删除所有在 C:/Scripts 里的文件 :
Remove - Item c:/scripts/ * 
这里是一个捕捉,当然。假设C:/Script包含替代的文件夹。在这种情况下,你可以提示是否要真的想要删除在Scripts文件夹里的任何东西。
Confirm
The item at C:/test/scripts has children and the  - recurse parameter was not specified. 
If you  continue , all children will be removed with the item. Are you sure you want to  continue ?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [ ? ] Help
( default   is   " Y " ): 
有快速绕过这个的方法吗?对;只要在你的命令结尾处附加 -recurse 参数:
Remove - Item c:/scripts/ *   - recurse 
这是一个有趣的变化。假设这个Scripts文件夹包含了一大堆文件和你想要删除的所有东西。等等:也许不是所有的东西,也许想要留下什么 .wav文件。 没问题;只要使用 -exclude 参数并打入要说明的文件应该把它排出删除:
Remove - Item c:/scripts/ *   - exclude  * .wav 
那是什么?现在你仅仅想要删除 .wav 和 .mp3 文件,保留其它所有类型?你不得不要求(使用 -include 参数):
Remove - Item c:/scripts/ *   - include .wav,.mp3 
当你想通后,如果你使用 -include 参数 cmdlet 将运行在那些指定项目的一部分参数上(不错,你可以指定多个项目;只要分开时用逗号)。相比之下,如果你使用 -exclude 参数排除这些项目将免除cmdlet的行动。 
是的,如果你想得到真正喜欢的,你可以使用 -include 与 -exclude 在同一个命令中。你认为在运行这个命令的时候会发生什么?
Remove - Item c:/scripts/ *   - include  * .txt –exclude  * test * 
你懂得:在C:/Scripts文件夹里所有的 .txt 文件(当用 -include 参数标明时)都将被删除,除了一些在文件名为test字符值的任何文件名(当用 -exclude 参数标明时)。尝试一些不同的变化,不久它将变的很完美。 
顺便说一下,Remove-Item cmdlet 有一个 -whatif 参数,这实际上并不能删除任何东西,但能告诉你会发生什么,如果你使用 Remove-Item。没有任何有用的意义那你是什么意思?这里,你先看看这个命令:
Remove - Item c:/scripts/ * .vbs  - whatif 
如果我们运行这个命令,在文件夹C:/Scripts里所有 .vbs 类型的文件将会删除;当然我们会得到像这样返回的如下信息,让我们知道哪个文件被删除,如果你使用 Remove-Item 外部的 -whatif 参数:
What  if : Performing operation  " Remove File "  on Target  " C:/scripts/imapi.vbs " .
What  if : Performing operation  " Remove File "  on Target  " C:/scripts/imapi2.vbs " .
What  if : Performing operation  " Remove File "  on Target  " C:/scripts/methods.vbs " .
What  if : Performing operation  " Remove File "  on Target  " C:/scripts/read-write.vbs
" .
What  if : Performing operation  " Remove File "  on Target  " C:/scripts test.vbs " .
What  if : Performing operation  " Remove File "  on Target  " C:/scripts/winsat.vbs " . 
除此之外,你可以删除其它的文件和文件夹。举个例子,任命一个show别名来获取这个清除命令:
Remove - Item alias:/show 
做一个说明,如这个具体位置:alias:/ 。这是 Windows PowerShell 驱动的标准记号法。驱动字母,然后冒号,然后由一个"/" 。
Set - Location env:    
Remove-Item 别名      ri     rd     erase     rm     rmdir     del

统计二级目录大小

分享一个自己写的项目里用到的PowerShell脚本,
这个脚本写的很简单,功能也不复杂,
主要作用就是统计一个文件夹下的所有子文件夹的大小,
这是为了配合统计之前从各个用户计算机收集的信息,
每个收集到的信息都会被存档到以这台计算机名称命名的
文件夹里,但是哪台计算上收集失败了呢?
每个人收集上来的数据大小是多少呢?这个就需要再统计了。
这种功能的软件其实网上有很多,但是对于一个IT Pro来说,
什么事都问百度可不是个好习惯,自己动手丰衣足食,
反正这也是个很简单的功能不需要太复杂的逻辑,
直接上手用PowerShell就搞定了
下边来看看代码
function filesize ([string]$filepath)
{
    if ($filepath -eq $null)
    {
        throw "路径不能为空"
    }
    dir -Path $filepath |   ForEach-Object -Process {
        if ($_.psiscontainer -eq $true) 
        {
            $length = 0 
            dir -Path $_.fullname -Recurse | ForEach-Object {
                $length += $_.Length
            }
            $l = $length/1KB    $_.name + "文件夹的大小为: {0:n1} KB" -f $l
        }
    }
}
filesize -filepath "E:\系统文件转储\桌面\test"  
就是一个很简单的函数而已,来看看测试用的文件夹结构,test是父目录,在这个目录下会有很多子目录,每个子目录里可能还会嵌套子目录 
wKioL1VTTZuRtxIMAAJv0W-fTJ8698.jpg   
另外这些文件夹里也会包含很多文件 
wKiom1VTTCHBNTmMAAC2mzHXofE576.jpg     
执行这个函数之后,可以看到统计出来的结果如下,为了观看方便这里统计转换成了kb的形式 
filesize -filepath "E:\系统文件转储\桌面\test"
wKiom1VTTCHAPqQ9AAET2oq6s_U019.jpg
---over

shell数组倒序打印

一、方法一:使用字符串切片

#! /bin/bash
read -p "请输入倒序内容:" str
len=${#str} # 获取字符串长度
for((i=$len;i>=0;i--))
do
        echo -e "${str:$i:1}\c"  # 其中 -e 是开启转义 \c 取消echo的换行
done
echo ""

二、第二种:利用shell中的数组

#! /bin/bash
read -p "请输入倒序内容:" s
str=`echo $s | sed 's/./& /g'` # 这里将字符串转化为数组格式 h e l l e v e r y o n e
array=($str)    # 将字符串转化为数组(h e l l e v e r y o n e)
len=${#array[@]}    # 获取数组长度 还有一种方式 len=${#array[*]}
for ((i=$len - 1;i>=0;i--))
do
        echo -e "${array[$i]}\c" # 其中 -e 是开启转义 \c 取消echo的换行
done
echo ""

nodejs

一、一个nodejs生成excel的demo

https://www.jianshu.com/p/56d91006110f

https://www.jianshu.com/p/56d91006110f

#nodejs在没有网络的情况下如何离线安装

https://www.jianshu.com/p/dc282bd720ef

一个nodejs做后台的完事业务,nodejs全栈

https://www.cnblogs.com/adouwt/p/8047304.html