首页 文章 精选 留言 我的

精选列表

搜索[零点击],共10000篇文章
优秀的个人博客,低调大师

Linux零碎笔记, 及一些命令

001.gui与tui gui, 完全的图形界面. tui, 终端下的图形界面. 002.补全命令 输入前缀, 按一次Tab. 若前缀不唯一, 按2次Tab, 出现相关命令列表. 003.RHEL7.2实现上网功能 1.固定的可用联网IP地址 2.关闭防火墙 3.关闭selinux 4.光盘自动挂载 5.配置好本地yum源 004.linux系统安装分区(标准分区) 1.boot分区:引导分区(启动系统用的), grub(引导器), 内核文件 200M 2.swap分区:内存扩展分区, 一般最多8G或16G 1000M 3./ 根:所有文件的根 10G 4.sda:linux下的第一个磁盘 5.RHEL7使用xfs文件系统, RHEL6使用ext4文件系统, Win7/10使用NTFS文件系统 005.手动配置以太网_IPv4设置 1.ip地址:192.168.0.71(网段192.168一样, 且是没用过的ip) 2.子网掩码:24 3.网关:192.168.0.1 4.DNS服务器:8.8.8.8(或114.114.114.114) 006.ubuntu第一次切换到root用户失败 1.为root设置一个root密码 sudo passwd root // 之后会提示要输入root用户的密码, 连续输入root密码 2.使用 su,并按照提示输入root密码, 就可以在终端中切换成超级管理员用户身份了! 3.设置后,以后就可以直接root登录了 007.ubuntu安装yum 1.安装了build-essential: apt-get install build-essential 2.安装yum: apt-get install yum 008.Xshell由于权限问题无法上传文件到linux 给lunux的文件夹设置权限, 例: 给/usr下的java文件夹添加上传权限 chmod -R 777 /usr/java // -R表示包括子文件夹 添加权限后,在/usr目录下输入: ll // 显示/usr/java这一个文件夹drwxrwxrwx(之前为drwxr-xr-x),并且有绿色阴影 Ubuntu chmod 命令可以用来修改文件或文件夹的读写权限, 命令有两种使用方式: (1)chmod [ u / g / o / a ] [ + / - / = ] [ r / w / x ] file, 其中: u表示User, 是文件的所有者 g表示跟User同Group的用户 o表示Other, 即其他用户 a表示ALL, 所有用户 +表示增加权限 -表示取消权限 =表示取消之前的权限, 并给予唯一的权限 r表示Read, 即读文件 w表示Write, 即写文件 x表示运行文件 file表示文件的路径, 如ubandy-rest/job/views.py For example: chmod u+rw ubandy-rest/job/views.py 2)chmod [xyz] file 其中, x, y, z分别表示数字(最大不超过7), 并分别对应User、Group、Other x, y, z的值由r(r=4), w ( w=2 ), x ( x=1 )来确定 For example:chmod 765 ubandy-rest/authentication/models.py 当然, 你也可以使用通配符 ‘*’, 来设置当前路径下的所有文件的权限 For example: 假如, 当前你的路径下有文件:1.txt, 2.html, 3.py 使用命令:chmod 777 * 可以同时设置上述三个文件的权限为rwx 如果你要修改整个文件夹的权限, 比如你有一个文件夹WhoJoy, 你想修改这个文件夹(包括内部的所有文件)的权限, 那么 可以使用命令:chmod -R 777 WhoJoy/ 其中:-R表示以递归整个文件夹中的子文件 009.ubuntu中apt命令是什么的缩写 the Advanced Packaging Tool 010.Xshell命令行的锁定/解除 Ctrl + q 011.Xshell无法连接到虚拟机,可能原因 1.防火墙未打开22端口 2.未安装openssh-server 3.虚拟机无法联网 012.ubuntu标准磁盘分区:21.5GB primary /boot 2.0GB f ext4 primary swap 2.5GB f swap primary /home 7.0GB f ext4 logical / 10.0GB f ext4 013.ubuntu查看所有组和用户 cat /etc/group sudo cat /etc/shadow 014.查看ip网址 https://ip.cn 或者 https://ipinfo.io 015.ubuntu下载ping和ifconfig命令 apt install iputils-ping apt install net-tools 016.ubuntu16.04关闭/开启mysql开机启动 // 禁止启动 sudo systemctl disable mysql # 开机启动 sudo systemctl enable mysql 017.查看一个目录下所有文件的数量(包括子目录下的文件,只算文件,不算目录) ls -lR|grep "^-"|wc -l 018.ubuntu设置mysql不区分大小写 // 在/etc/mysql/mysql.conf.d/mysqld.cnf文件中加一行代码: lower_case_table_names=1 019.关机 init 0 020.虚拟机切换到主机 Ctrl + Alt 021.清屏 Ctrl + l 022.取消某一操作 Ctrl + c 023.虚拟机BIOS设置 开机按F2(或虚拟机_电源_打开电源进入固件) 024.查看ip ifconfig 025.编辑文件 vim 026.保存退出 :wq 027.不保存退出 :q! 028.撤销 Esc + u 029.进入插入模式 i 030.复制粘贴 插入模式下选中一段文本,按下鼠标滚轮 031.重启 reboot(或者sudo shutdown -r now) 032.查看当前登录用户 whoami 033.切换用户 su - root(用户名) 034.进入全屏 VMware进入全屏Ctrl + Alt + Enter Xshell进入全屏Alt + Enter 035.创建新的文件 touch a.txt 036.复制一个文件夹下所有文件(包括子文件夹)到另一个文件夹下: cp -r /fangjian/tomcat8_new/webapps/ROOT/* /fangjian/bak/oa_20170905_test/ROOT 037.删除一个文件夹下所有文件(包括子文件夹) rm -rf /fangjian/bak/oa_20170905_test/* // 不加/*则删父文件夹 038.查看Linux是32位还是64位 sudo uname -m // i686表示是32位,x86_64表示是64位 039.解压压缩文件 tar -zxvf test.tar.gz 040.创建文件夹 mkdir java 041.为过长的目录建立一个链接 ln -s /usr/java/jdk1.8.0_60/ /usr/jdk 042.查看某进程名的PID ps -ef | grep java 043.根据端口号查看该端口号被谁占用 lsof -i:8080 // 若命令用不了,则需: yum -y install lsof或者: netstat -apn | grep 8080 044.根据进程PID查看该进程占用的端口号 netstat -nap | grep 2703 // 若命令用不了,则需: yum -y install net-tools 045.根据进程PID杀掉该进程 kill -9 2703 046.纯文本形式访问网址 elinks -dump http://www.baidu.com // 若命令用不了,则需: yum -y install elinks 047.RHEL7查看已启动的服务列表 systemctl list-unit-files|grep enabled 048.关闭虚拟机 shutdown -h now 049.Xshell锁屏 Ctrl+s 解锁: Ctrl+q 050.登录mysql mysql -h localhost -u root -proot 051.查看jdk安装路径 which java 或者: echo $JAVA_HOME 052.查看tomcat版本 进入tomcat的bin下执行sh version.sh 053.zip压缩文件 zip -r fileName.zip 文件夹名 解压缩: unzip fileName.zip 054.查看ubuntu版本 sudo lsb_release -a 055.复制一个文件夹下所有文件(包括子文件夹的所有文件但不复制目录,不考虑文件重名)到另一个文件夹下: find /home/dailin/ -type f -exec cp {} /home/c1 ; 056.显示所有ufw应用的配置 sudo ufw app list 057.vim快捷键 01.光标跳转到页面第一行: gg02.光标跳转到页面最后一行: Shift + g03.删除光标所在行: dd04.删除光标所在的向下n行: ndd n表示数字 05.清空文本:先执行:gg 再执行:d + (Shift + g)06.复制光标所在的行: yy07.复制光标所在的向下n行: nyy n表示数字08.将已复制的数据粘贴在光标的下一行: 小p表示09.将已复制的数据粘贴在光标的上一行: 大P10.撤销上一步操作: u (相当于windws的Ctrl + z)11.与u相反, 回到后一步操作: ctrl+r (相当于windws的Ctrl + y)12.重复前一个操作: . 点13.跳转到某一指定行: :12 跳转到第12行14.键入/后, 光标进入VIM底部的命令行, 这时就可以输入以/为开始的/搜索命令,按n搜索下一个,按N搜索上一个 058. 查看文件占用空间大小 du -ah -d 0 -a代表所有文件-h代表加单位-d 0代表: 只深入到第n层目录,若无此属性,则包含所有子目录 059.ubuntu查看磁盘空间 df -h 060.ubuntu永久修改主机名 1、查看主机名在Ubuntu系统中, 快速查看主机名有多种方法:其一, 打开一个GNOME终端窗口, 在命令提示符中可以看到主机名, 主机名通常位于“@”符号后;其二, 在终端窗口中输入命令:hostname或uname –n, 均可以查看到当前主机的主机名. 2、临时修改主机名命令行下运行命令:“hostname 新主机名”其中“新主机名”可以用任何合法字符串来表示. 不过采用这种方式, 新主机名并不保存在系统中, 重启系统后主机名将恢复为原先的主机名称. 例子:hostname ubuntu-temp这样主机名字就临时被修改为ubuntu-temp, 但是终端下不会立即显示生效后的主机名, 重开一个终端窗口(通过ssh连接的终端需要重新连接才可以); 3、永久修改主机名在Ubuntu系统中永久修改主机名也比较简单. 主机名存放在/etc/hostname文件中, 修改主机名时, 编辑hostname文件, 在文件中输入新的主机名并保存该文件即可. 重启系统后, 参照上面介绍的快速查看主机名的办法来确认主机名有没有修改成功. 值得指出的是, 在其它Linux发行版中, 并非都存在/etc/hostname文件. 如Fedora发行版将主机名存放在/etc/sysconfig/network文件中. 所以, 修改主机名时应注意区分是哪种Linux发行版. 4、/etc/hostname与/etc/hosts的区别/etc/hostname中存放的是主机名, hostname文件的一个例子:paulandcode /etc/hosts存放的是域名与ip的对应关系, 域名与主机名没有任何关系, 你可以为任何一个IP指定任意一个或多个名字, hosts文件的一个例子:(IP地址 hostname aliases) aliases可选127.0.0.1 localhost paulandcode127.0.1.1 v-jiwan-ubuntu 061.linux的bash命令一般存放在/sbin, /bin, /usr/bin,这几个目录中 062.ubuntu 显示相对路径 打开 home/paul/.bashrc 找到(可能有多处): PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' 修改将小写w改为大写W保存 执行source home/paul/.bashrc 063.Ubuntu的add-apt-repository: command not found sudo apt-get install software-properties-common python-software-properties 064.创建用户 adduser paul 创建用户 passwd paul 给已创建的用户testuser设置密码 userdel paul 用户名删除用户 给paul用户增加所有权限: vim /etc/sudoers 在root ALL=(ALL:ALL) ALL这一行的下面增加如下代码: paul ALL=(ALL:ALL) ALL 065.给用户增加sudu权限 1) 进入到root用户下. 2)添加文件的写权限. 也就是输入命令"chmod u+w /etc/sudoers". 3)编辑该文件,找到这一 行:"root ALL=(ALL) ALL"在起下面添加"yourName ALL=(ALL) ALL" 4)撤销文件的写权限. 也就是输入命令"chmod u-w /etc/sudoers" 066.删除除了某几个文件之外的所有文件 例:删除A文件夹下除了a文件夹和b.txt文件的其他所有文件和文件夹 rm -rf A/!(a|b.txt) 不过一般bash中运行后会提示 “-bash: !: event not found ” 可以通过运行shopt -s extgolb来解决. 如下: [root@localhost abc]# rm -f !(a) -bash: !: event not found [root@localhost abc]# shopt -s extglob [root@localhost abc]# rm -f !(a) [root@localhost abc]# ls a 067.linux脚本加入延时等待 默认以秒为单位,以后接时间的单位, 可以以m表示分钟, h表示小时, d表示天数 sleep 5 sleep 0.005 sleep 3m 068.awk -F ':' '{print $1"\t"$3}', 以冒号为分隔符后把第1,3列,以t分隔输出 例: kill掉第一个java进程id netstat -apn |grep java |awk '{print $7}' |xargs |awk -F '/' '{print $1}' |xargs kill -9 069.查看文件夹的目录结构 sudo tree /etc/nginx 070. Linux上的MySQL设置区分大小写 在/etc/mysql/mysql.conf.d/mysqld.cnf中最后一行加入如下代码: lower_case_table_names=1 071.Ubuntu安装MySQL sudo apt update sudo apt install mysql-server mysql-client 072. Linux下使用命令行导入, 导出MySQL数据库 (1) 导出数据库1> 只导出表结构, 格式: mysqldump -u用户名 -p密码 -d 数据库名 > 文件名.sql /usr/local/mysql/bin/mysqldump -uroot -p -d abc > file.sql 若-p后不加密码, 则敲回车后会提示输入密码 2> 导出表结构和数据, 格式: mysqldump -u用户名 -p密码 数据库名 > 文件名.sql /usr/local/mysql/bin/mysqldump -uroot -p abc > file.sql (2) 导入数据库1> 使用MySQL的Bash命令, 格式: mysql -u用户名 -p密码 数据库名 < 文件名.sql mysql -uroot -p abc < file.sql 2> 进入MySQL执行命令a.进入MySQL mysql -uroot -p b.选择数据库 use abc; c.设置数据库编码, 这个很关键, 否则会乱码 set names utf8; d.导入数据 source /home/abc/file.sql; 073. Linux重启后Tomcat自动启动 只需更改一个文件后重启即可: /etc/rc.local在文件结尾加入如下代码 export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export CATALINA_HOME=/home/paul/apache-tomcat-9.0.0.M26 # tomcat自启动 /home/paul/apache-tomcat-9.0.0.M26/bin/startup.sh 074. 虚拟机上的Tomcat无法被主机访问 防火墙原因, 允许访问8080端口: sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent sudo firewall-cmd --reload 如果不使用“--permanent”标记, 把么防火墙规则在重启后会失效. 075. Linux上的MySQL设置区分大小写 在/etc/mysql/mysql.conf.d/mysqld.cnf中最后一行加入如下代码: lower_case_table_names=1 076. Linux虚拟机桥接联网的配置文件 Linux虚拟机桥接联网时需要如下两个配置文件: 1. /etc/resolv.conf nameserver 8.8.8.8 2. /etc/sysconfig/network-scripts/ifcfg-eno16777736 TYPE="Ethernet" BOOTPROTO="static" IPADDR="192.168.0.66" NETWORK="255.255.255.0" GATEWAY="192.168.0.1" DNS1="8.8.8.8" DEFROUTE="yes" PEERDNS="yes" PEERROUTES="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_PEERDNS="yes" IPV6_PEERROUTES="yes" IPV6_FAILURE_FATAL="no" NAME="eno16777736" UUID="96aa40e3-de9e-4074-b4ad-760d28ae2b66" DEVICE="eno16777736" ONBOOT="yes" 077. 如何Ping固定端口号 1. Windows 需要选择: 控制面板 --> 程序 --> 启动或关闭Windows功能, 在Telnet客户端和Telnet服务端打勾. 被Ping的机器需要服务端, 要Ping的机器需要客户端. 2. Linux若没有自带telnet, 需要安装客户端和服务端 3. 连接命令: telnet 127.0.0.1 8080 注意: IP和端口号之间是空格, 不是冒号.

优秀的个人博客,低调大师

Python零基础学习笔记(四十)—— datetime和Calendar

import datetime import time ''' datetime比time高级了不少,可以理解为date time基于time进行了封装, 提供了各种实用的函数,date time模块的接口更为直观,更容易调用 模块中的类: datetime 同时有时间和日期 timedelta 主要用于计算时间跨度 tzinfo 时区相关 time 只关注时间 date 只关注日期 ''' #获取当前时间 d1 = datetime.datetime.now() print(d1) # d2 = datetime.datetime(1995, 4, 28,10,23,34,123355) print(d2) # d3 = datetime.datetime.time(d1) print(d3) #将时间转换为字符串 #d4 = d1.strptime("%Y-%m-%d %X") #print(d4) #时间加减 d5 = d1 - d2 print(d5) #间隔的天数 print(d5.days) #间隔天数除外的秒数 print(d5.seconds) import calendar ''' 日历 ''' #使用 print(calendar.month(2019, 7)) #返回指定年的日历 print(calendar.calendar(2019)) #判断闰年,返回True print(calendar.isleap(2000)) #返回某个月的weekday的第一天和这个月的天数 print(calendar.monthrange(2018, 12)) #返回某个月以每一周为元素的列表 print(calendar.monthcalendar(2017, 12))

优秀的个人博客,低调大师

Python零基础学习笔记(三十五)—— 内存修改

今天利用这个小功能做了个植物大战僵尸的外挂,哈哈哈 等以后学了GUI编程的时候做成图形化界面 #进程模块 import win32process #系统 import win32api import win32con import win32gui import ctypes #获取最高权限,\位运算 PROCESS_ALL_ACCESS = (0x000F000|0x00100000|0xFFF) #找窗体 win = win32gui.FindWindow("MainWindow","植物大战僵尸中文版") #根据窗体找到进程号 hid, pid = win32process.GetWindowThreadProcessId(win) #以最高权限打开进程 p = win32api.OpenProcess(PROCESS_ALL_ACCESS, False, pid) data = ctypes.c_long() #c语言中的长整形 #加载内核模块 md = ctypes.windll.LoadLibrary("C:\\Windows\\System32\\kernel32") #读取内存 md.ReadProcessMemory(int(p),0x12508678, ctypes.byref(data), 4, None) print("data =", data) #设置新值 newData = ctypes.c_long(1000) #修改 md.WriteProcessMemory(int(p), 0x12508678, ctypes.byref(newData), 4, None)

优秀的个人博客,低调大师

Python零基础学习笔记(三十一)—— 写文件

import time path = r"C:\Users\Administrator\PycharmProjects\untitled\day011\文件读写\file1" f = open(path,"w") ''' #写文件 #1、 f.write("Hello !!!") f.write("and") #2、刷新缓冲区 #直接把内部缓冲区数据立刻写入文件,而不是被动等待自动刷新缓冲区写入 f.flush() while True: f.write("Hello!\n") f.flush() time.sleep(1) f.close() #写文件 with open(path,"a") as f2: f2.write("aaa$$%##%##%") ''' #编码 with open(path, "wb") as f3: str = "My name is jjking.你好" f3.write(str.encode("utf-8")) with open(path, "rb") as f4: data = f4.read() print(data) print(type(data)) newData = data.decode("utf-8") print(newData) print(type(newData))

优秀的个人博客,低调大师

Python零基础学习笔记(二十四)—— 函数

''' 认识函数:在以恶完整的项目中,某些功能会反复的使用,那么 会将功能封装成函数,当我们要使用这些功能的时候 直接调用函数即可 本质:函数就是对功能的封装 优点: 1、简化代码结构,增加了代码的复用度(重复使用的程度) 2、如果想修改某些功能或修改某个bug只需要修改相应的函数即可 ''' ''' 定义函数: 格式: def 函数名(参数列表): 语句 return 表达式 def:函数代码块从def关键字开始 函数名:遵循标识符规则 参数列表(参数1, 参数2,……参数n):任何传入函数的参数和变量 必须放在圆括号之间 语句:执行的功能 return:以return为结束 ''' ''' 函数的调用 格式:函数名(参数列表) 函数名:是要使用的功能的函数 '''

优秀的个人博客,低调大师

Python零基础学习笔记(二十二)—— set

''' set:类似dict,是一组key的集合,不存储value 本质:无序和无重复元素的集合 用途:经常用于去除list和tuple中的重复元素 ''' #创建 #创建set 需要一个list或者tuple或者dict作为输入集合 #重复元素在set中会自动被过滤 set1 = set([1, 2, 2, 2, 3, 4, 5]) print(set1) set2 = set((1, 2, 3, 1, 2, 3)) print(set2) set3 = set({1:"2" , 3: "4", 5: "2"}) print(set3) #添加 注意;列表不能作为key,而set里面存的就是key,所以不能添加list[] set1.add(5) print(set1) set2.add((1,2,1,5)) print(set2) #set3.add({1,2}) #会报错 #插入整个list tuple 字符串,打碎插入 set1.update([12,3]) print(set1) set1.update((22,23,24,24)) print(set1) set1.update("name") print(set1) #删除 set1.remove("n") print(set1) set1.remove(2) print(set1) #遍历 for i in set1: print(i) #注意:set没有索引 for index, data in enumerate(set1): print(index,data) s1 = set([1, 2, 3]) s2 = set([2, 3, 4]) #交集 a1 = s1 & s2 print(a1) print(type(a1)) #并集 a2 = s1 | s2 print(a2) print(type(a2)) #list -> set l1 = [1, 2, 3, 4] set3 = set(l1) #tuple -> set t1 = (1, 2, 3) s4 =set(t1) print(s4) #去重 list5 =[1, 1, 2, 3, 4, 3, 4] print(list5) list6 = list(set(list5)) print(list6)

优秀的个人博客,低调大师

Python零基础学习笔记(九)—— 随机数

话不多说,直接上代码 import random #随机数 #1.从序列的元素中随机取出一个数 print(random.choice([1,3,5,7,9])) print(random.choice(["c","a", "b"])) print(random.choice(range(6))) print(random.choice("jjking")) #取字符串之中的一个字母 #生成1-100之间的随机数 r1 = random.choice(range(100))+1 print(r1) #random.randrange([start,] stop[, step]) #start——指定范围开始,包含在范围内,默认是0 #stop——指定范围结束,不包含在范围内 #step——指定的递增基数,默认是1 print(random.randrange(1, 100, 2)) print(random.randrange(1, 100, 3)) #随机生成[0,1)之间的数(浮点数) print(random.random()) list = [1,2,3,4,5] #将list中的所有元素随机排序 random.shuffle(list) print(list) #随机生成一个实数(可能是小数也可能是整数)uniform里面是范围 print(random.uniform(2,7)) 执行结果 C:\Users\Administrator\AppData\Local\Programs\Python\Python37-32\python.exe C:/Users/Administrator/PycharmProjects/untitled/day02/随机数.py 7 b 3 j 49 75 73 0.11410964627603948 [4, 3, 1, 2, 5] 2.1147715056040295 Process finished with exit code 0

优秀的个人博客,低调大师

Python零基础学习代码实践 —— 打印回文数

#打印回文数 num = int(input("请输入一个五位数:")) wanwei = num // 10000 qianwei = (num - wanwei * 10000) // 1000 baiwei = (num - wanwei * 10000 - qianwei *1000) // 100 shiwei = (num - wanwei * 10000 - qianwei *1000 - baiwei * 100) // 10 gewei = (num - wanwei * 10000 - qianwei *1000 - baiwei * 100 - shiwei * 10) if wanwei == gewei: if qianwei == shiwei: print("这是一个回文数") else: print("这个数不是回文数")

优秀的个人博客,低调大师

Python零基础学习笔记(五)—— 标识符

简单的说就是一串字符串(但字符串未必是标识符) 规则: 只能由子母/数字/下划线组成 开头不能是数字 不能是关键字['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield'] import keywordprint(keyword.kwlist)以上两行为查看关键字的代码 区分大小写 见名知意 遵循驼峰原则(从第二个单词开始首字母大写 例如:makeFile) 作用;:给函数/变量命名的 注意: 在python3中,非ascii码也可以做标识符

优秀的个人博客,低调大师

Python零基础学习笔记(六)—— 变量和常量

变量: 程序可操作的存储空间的名称 程序运行期间可改变的数据 每个变量都有特定的类型 作用:将不同类型的数据存储到内存 定义变量:变量名 = 初始值(为了确定变量的类型,python里面可以直接识别数据类型 例如:age = 10) 数据的存储:变量名 = 数据值 特别注意:变量在使用前必须定义,否则会报错 删除变量:del 变量名(删除后变量名无法使用,再次调用会报错) 小技巧: 查看age变量类型 print(type(age)) 查看age变量地址 print(id(age)) 常量:程序运行期间不能改变的数据

优秀的个人博客,低调大师

Python零基础学习笔记(二)——数据的存储

计算机用来存储数据,计算数据 数据存放在内存里 bit中文名称是位,音译“比特”,是用以描述电脑数据量的最小单位。二进制数系统中,每个0或1就是一个位(bit)。 单位换算1Byte=8bit1Kb=1024bit=2^10bit=1/8KB1Mb=1024Kb=2^20bit=1/8MB1Gb=1024Mb=2^30bit=1/8GB1Tb=1024Gb=2^40bit=1/8TB 数据存储最基本的单位是字节,存储数据时高位补0,最高位表示符号位,负数为1,正数为0 源码/反码/补码之间的关系正整数的原码、反码和补码都一样;负数部分:原码和反码的相互转换:符号位不变,数值位按位取反原码和补码的相互转换:符号位不变,数值位按位取反,末位再加1已知补码,求原码的负数的补码:符号位和数值位都取反,末位再加1 绝对路径就是文件的真正存在的路径,是指从硬盘的根目录(盘符)开始,进行一级级目录指向文件。相对路径就是以当前文件为基准进行一级级目录指向被引用的资源文件。

优秀的个人博客,低调大师

技术 | Python的从零开始系列连载(三十五)

大家好,本次为大家带来的是抓取爱问知识人的问题并将问题和答案保存到数据库的方法,涉及的内容包括: Urllib的用法及异常处理 Beautiful Soup的简单应用 MySQLdb的基础用法 正则表达式的简单应用 环境配置在这之前,我们需要先配置一下环境,我的Python的版本为2.7,需要额外安装的库有两个,一个是Beautiful Soup,一个是MySQLdb,在这里附上两个库的下载地址, Beautiful Soup:https://pypi.python.org/pypi/beautifulsoup4/4.3.2 MySQLdb:https://sourceforge.net/projects/mysql-python/ 大家可以下载之后通过如下命令安装 python setup.py install环境配置好之后,我们便可以开心地撸爬虫了 框架思路首先我们随便找一个分类地址,外语学习 – 爱问知识人:http://iask.sina.com.cn/c/978-all-1.html,打开之后可以看到一系列的问题列表。 我们在这个页面需要获取的东西有: 总的页码数,每一页的所有问题链接。 接下来我们需要遍历所有的问题,来抓取每一个详情页面,提取问题,问题内容,回答者,回答时间,回答内容。 最后,我们需要把这些内容存储到数据库中。 要点简析其实大部分内容相信大家会了前面的内容,这里的爬虫思路已经融汇贯通了,这里就说一下一些扩展的功能 1.日志输出日志输出,我们要输出时间和爬取的状态,比如像下面这样: [2015-08-10 03:05:20] 113011 号问题存在其他答案 我个人认为应该是樱桃沟很美的 [2015-08-10 03:05:20] 保存到数据库,此问题的ID为 113011 [2015-08-10 03:05:20] 当前爬取第 2 的内容,发现一个问题 百度有一个地方,花儿带着芳香,水儿流淌奔腾是什么意思 多多帮忙哦 回答数量 1 [2015-08-10 03:05:19] 保存到数据库,此问题的ID为 113010 所以,我们需要引入时间函数,然后写一个获取当前时间的函数 import time #获取当前时间 def getCurrentTime(self): return time.strftime('[%Y-%m-%d %H:%M:%S]',time.localtime(time.time())) #获取当前时间 def getCurrentDate(self): return time.strftime('%Y-%m-%d',time.localtime(time.time())) 以上分别是获取带具体时间和获取日期的函数,在输出时,我们可以在输出语句的前面调用这函数即可。 然后我们需要将缓冲区设置输出到log中,在程序的最前面加上这两句 f_handler=open('out.log', 'w') sys.stdout=f_handler 这样,所有的print语句输出的内容就会保存到out.log文件中了。 2.页码保存爬虫爬取过程中可能出现各种各样的错误,这样会导致爬虫的中断,如果我们重新运行爬虫,那么就会导致爬虫从头开始运行了,这样显然是不合理的。所以,我们需要把当前爬取的页面保存下来,比如可以保存到文本中,假如爬虫中断了,重新运行爬虫,读取文本文件的内容,接着爬取即可。 大家可以稍微参考一下函数的实现: #主函数 def main(self): f_handler=open('out.log', 'w') sys.stdout=f_handler page = open('page.txt', 'r') content = page.readline() start_page = int(content.strip()) - 1 page.close() print self.getCurrentTime(),"开始页码",start_page print self.getCurrentTime(),"爬虫正在启动,开始爬取爱问知识人问题" self.total_num = self.getTotalPageNum() print self.getCurrentTime(),"获取到目录页面个数",self.total_num,"个" if not start_page: start_page = self.total_num for x in range(1,start_page): print self.getCurrentTime(),"正在抓取第",start_page-x+1,"个页面" try: self.getQuestions(start_page-x+1) except urllib2.URLError, e: if hasattr(e, "reason"): print self.getCurrentTime(),"某总页面内抓取或提取失败,错误原因", e.reason except Exception,e: print self.getCurrentTime(),"某总页面内抓取或提取失败,错误原因:",e if start_page-x+1 < start_page: f=open('page.txt','w') f.write(str(start_page-x+1)) print self.getCurrentTime(),"写入新页码",start_page-x+1 f.close() 这样,不管我们爬虫中途遇到什么错误,妈妈也不会担心了 3.页面处理页面处理过程中,我们可能遇到各种各样奇葩的HTML代码,和上一节一样,我们沿用一个页面处理类即可。 import re #处理页面标签类 class Tool: #将超链接广告剔除 removeADLink = re.compile('<div class="link_layer.*?</div>') #去除img标签,1-7位空格,&nbsp; removeImg = re.compile('<img.*?>| {1,7}|&nbsp;') #删除超链接标签 removeAddr = re.compile('<a.*?>|</a>') #把换行的标签换为\n replaceLine = re.compile('<tr>|<div>|</div>|</p>') #将表格制表<td>替换为\t replaceTD= re.compile('<td>') #将换行符或双换行符替换为\n replaceBR = re.compile('<br><br>|<br>') #将其余标签剔除 removeExtraTag = re.compile('<.*?>') #将多行空行删除 removeNoneLine = re.compile('\n+') def replace(self,x): x = re.sub(self.removeADLink,"",x) x = re.sub(self.removeImg,"",x) x = re.sub(self.removeAddr,"",x) x = re.sub(self.replaceLine,"\n",x) x = re.sub(self.replaceTD,"\t",x) x = re.sub(self.replaceBR,"\n",x) x = re.sub(self.removeExtraTag,"",x) x = re.sub(self.removeNoneLine,"\n",x) #strip()将前后多余内容删除 return x.strip() 我们可以用一段含有HTML代码的文字,经过调用replace方法之后,各种冗余的HTML代码就会处理好了。 比如我们这么一段代码: <article class="article-content"> <h2>前言</h2> <p>最近发现MySQL服务隔三差五就会挂掉,导致我的网站和爬虫都无法正常运作。自己的网站是基于MySQL,在做爬虫存取一些资料的时候也是基于MySQL,数据量一大了,MySQL它就有点受不了了,时不时会崩掉,虽然我自己有网站监控和邮件通知,但是好多时候还是需要我来手动连接我的服务器重新启动一下我的MySQL,这样简直太不友好了,所以,我就觉定自己写个脚本,定时监控它,如果发现它挂掉了就重启它。</p> <p>好了,闲言碎语不多讲,开始我们的配置之旅。</p> <p>运行环境:<strong>Ubuntu Linux 14.04</strong></p> <h2>编写Shell脚本</h2> <p>首先,我们要编写一个shell脚本,脚本主要执行的逻辑如下:</p> <p>显示mysqld进程状态,如果判断进程未在运行,那么输出日志到文件,然后启动mysql服务,如果进程在运行,那么不执行任何操作,可以选择性输出监测结果。</p> <p>可能大家对于shell脚本比较陌生,在这里推荐官方的shell脚本文档来参考一下</p> <p><a href="http://wiki.ubuntu.org.cn/Shell%E7%BC%96%E7%A8%8B%E5%9F%BA%E7%A1%80" data-original-title="" title="">Ubuntu Shell 编程基础</a></p> <p>shell脚本的后缀为sh,在任何位置新建一个脚本文件,我选择在 /etc/mysql 目录下新建一个 listen.sh 文件。</p> <p>执行如下命令:</p> 经过处理后便会变成如下的样子: 前言 最近发现MySQL服务隔三差五就会挂掉,导致我的网站和爬虫都无法正常运作。自己的网站是基于MySQL,在做爬虫存取一些资料的时候也是基于MySQL,数据量一大了,MySQL它就有点受不了了,时不时会崩掉,虽然我自己有网站监控和邮件通知,但是好多时候还是需要我来手动连接我的服务器重新启动一下我的MySQL,这样简直太不友好了,所以,我就觉定自己写个脚本,定时监控它,如果发现它挂掉了就重启它。 好了,闲言碎语不多讲,开始我们的配置之旅。 运行环境:UbuntuLinux14.04 编写Shell脚本 首先,我们要编写一个shell脚本,脚本主要执行的逻辑如下: 显示mysqld进程状态,如果判断进程未在运行,那么输出日志到文件,然后启动mysql服务,如果进程在运行,那么不执行任何操作,可以选择性输出监测结果。 可能大家对于shell脚本比较陌生,在这里推荐官方的shell脚本文档来参考一下 UbuntuShell编程基础 shell脚本的后缀为sh,在任何位置新建一个脚本文件,我选择在/etc/mysql目录下新建一个listen.sh文件。 执行如下命令: 经过上面的处理,所有乱乱的代码都会被处理好了。 4.保存到数据库在这里,我们想实现一个通用的方法,就是把存储的一个个内容变成字典的形式,然后执行插入语句的时候,自动构建对应的sql语句,插入数据。 比如我们构造如下的字典: #构造最佳答案的字典 good_ans_dict = { "text": good_ans[0], "answerer": good_ans[1], "date": good_ans[2], "is_good": str(good_ans[3]), "question_id": str(insert_id) } 构造sql语句并插入到数据库的方法如下: #插入数据 def insertData(self, table, my_dict): try: self.db.set_character_set('utf8') cols = ', '.join(my_dict.keys()) values = '"," '.join(my_dict.values()) sql = "INSERT INTO %s (%s) VALUES (%s)" % (table, cols, '"'+values+'"') try: result = self.cur.execute(sql) insert_id = self.db.insert_id() self.db.commit() #判断是否执行成功 if result: return insert_id else: return 0 except MySQLdb.Error,e: #发生错误时回滚 self.db.rollback() #主键唯一,无法插入 if "key 'PRIMARY'" in e.args[1]: print self.getCurrentTime(),"数据已存在,未插入数据" else: print self.getCurrentTime(),"插入数据失败,原因 %d: %s" % (e.args[0], e.args[1]) except MySQLdb.Error,e: print self.getCurrentTime(),"数据库错误,原因%d: %s" % (e.args[0], e.args[1]) 这里我们只需要传入那个字典,便会构建出对应字典键值和键名的sql语句,完成插入。 5.PHP读取日志我们将运行结果输出到了日志里,那么怎么查看日志呢?很简单,在这里提供两种方法 方法一: PHP倒序输出所有日志内容 <html> <head> <meta charset="utf-8"> <meta http-equiv="refresh" content = "5"> </head> <body> <?php $fp = file("out.log"); if ($fp) { for($i = count($fp) - 1;$i >= 0; $i --) echo $fp[$i]."<br>"; } ?> </body> </html> 此方法可以看到所有的输入日志,但是如果日志太大了,那么就会报耗费内存太大,无法输出。为此我们就有了第二种方法,利用linux命令,输出后十行内容。 方法二: <html> <head> <meta charset="utf-8"> <meta http-equiv="refresh" content = "5"> </head> <body> <?php $ph = popen('tail -n 100 out.log','r'); while($r = fgets($ph)){ echo $r."<br>"; } pclose($ph); ?> </body> </html> 上面两种方法都是5秒刷新一次网页来查看最新的日志。 源代码放送好了,闲言碎语不多讲,直接上源码了 运行的时候执行如下命令即可 nohup python spider.py & 代码写的不好,仅供大家学习参考使用,如有问题,欢迎留言交流。 运行结果查看我们把PHP文件和log文件放在同一目录下,运行PHP文件,便可以看到如下的内容: 小伙伴们赶快试一下吧。 原文发布时间为:2019-1-4本文作者:灯塔大数据本文来自云栖社区合作伙伴“ 灯塔大数据”,了解相关信息可以关注“DTbigdata”微信公众号

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册