DAY 148 2017.10.28
Python逐行读取
读取文件时,常常需要检查其中的每一行:你可能要在文件中查找特定的信息,或者要以某种方式修改文件中的文本。例如,你可能要遍历一个包含天气数据的文件,并使用天气描述中包含字样sunny的行。在新闻报道中,你可能会查找包含标签<headline> 的行,并按特定的格式设置它。要以每次一行的方式检查文件,可对文件对象使用for 循环。
现在我们读取服务器的口令文件:
![](https://img.haomeiwen.com/i6395337/9851ca247403946b.jpg)
![](https://img.haomeiwen.com/i6395337/c2aab2fd986d35e8.jpg)
![](https://img.haomeiwen.com/i6395337/b0475607a3d04d85.jpg)
filename = '/etc/passwd'
with open(filename) as file_object:
for line in file_object:
print(line)
/etc/passwd
通常在Linux系统中,用户的关键信息被存放在系统的/etc/passwd文件中,系统的每一个合法用户账号对应于该文件中的一行记录,所以直接数passwd文件的行数就可以知道本机有多少个账号了(本机有30个账号)。部分摘录如下:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
每条记录占一行,记录了一个用户帐号的所有信息。每条记录由7个字段组成,并且字段间用六个冒号“:”隔开,其格式如下:
username:password:User ID:Group ID:comment:home directory:shell
注册名:口令:用户标识号:组标识号:用户名:用户主目录:命令解释程序
(1)注册名:用于区分不同的用户。
(2)口令:系统用口令来验证用户的合法性。
(3)用户标识号:UID是一个数值,是Linux系统中惟一的用户标识,用于区别不同的用户。
(4)组标识号:这是当前用户的缺省工作组标识。
(5)用户名:包含有关用户的一些信息,如用户的真实姓名、办公室地址、联系电话等。在Linux系统中,mail和finger等程序利用这些信息来标识系统的用户。
(6)用户主目录:该字段定义了个人用户的主目录,当用户登录后,他的Shell将把该目录作为用户的工作目录。
(7)命令解释程序(Shell):Shell是当用户登录系统时运行的程序名称,通常是一个Shell程序的全路径名,如/bin/bash。(之后还要提到shell,重点标注一下)
每个字段的具体含义可以看看这篇文章:LINUX用户管理——/etc/passwd文件详解
DAY 149 2017.10.29
Python读取服务器密码文件,并获得shell路径
使用关键字with 时,open() 返回的文件对象只在with 代码块内可用。如果要在with 代码块外访问文件的内容,可在with 代码块内将文件的各行存储在一个列表中,并在with 代码块外使用该列表:你可以立即处理文件的各个部分,也可推迟到程序后面再处理。下面的示例在with 代码块中将文件passwd的各行存储在一个列表中,再在with 代码块外打印它们:
![](https://img.haomeiwen.com/i6395337/e704a6311cac2473.jpg)
![](https://img.haomeiwen.com/i6395337/a3cec8c5f532107e.jpg)
![](https://img.haomeiwen.com/i6395337/9f44dbd185e15818.jpg)
filename = '/etc/passwd'
with open(filename) as file_object:
lines = file_object.readlines()
for line in lines:
print(line.rstrip())
if ":" in line:
print line.split(":")[-1].rstrip()
Shell
命令解释程序(Shell):Shell是当用户登录系统时运行的程序名称,通常是一个Shell程序的全路径名,如/bin/bash。
![](https://img.haomeiwen.com/i6395337/d2a8ff7fad82b8ac.jpg)
restrip()
Python rstrip() 删除 string 字符串末尾的指定字符(默认为空格)
语法及参数:
str.rstrip(chars)
chars——指定删除的字符(默认为空格)
示例:
# -- coding: utf-8 --
str = " Have a nice day ";
print str.rstrip();
str = "ccccccWhat's your name?ccccccc";
print str.rstrip('c')
![](https://img.haomeiwen.com/i6395337/859f9bb04b4bb6ef.jpg)
split()
Python split()通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串。
语法及参数:
str.split(str="", num=string.count(str))[n]
str——分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
num——分割次数。如果存在参数num,则仅分隔成 num+1 个子字符串,并且每一个子字符串可以赋给新的变量。
[n]——表示选取第n个分片。
示例:
# -- coding: utf-8 --
str = "www.tutorialspoint.com";
#以'.'为分隔符
print str.split('.')
#以'.'为分隔符,分隔1次
print str.split('.', 1 )
#以'.'为分隔符,分隔2次
print str.split('.', 2 )
#以'.'为分隔符,分隔2次,并取序列为0的项
print str.split('.', 2)[0]
#以'.'为分隔符,分隔2次,并取序列为1的项
print str.split('.', 2)[1]
#以'.'为分隔符,分隔2次,并取序列为2的项
print str.split('.', 2)[2]
#以'.'为分隔符,分隔2次,并取序列为-1的项
print str.split('.', 2)[-1]
#以'.'为分隔符,分隔2次,并取序列为-2的项
print str.split('.', 2)[-2]
![](https://img.haomeiwen.com/i6395337/85e4d00aab14d68d.jpg)
DAY 150 2017.10.30
使用python获取并处理系统密码文件的内容
将文件读取到内存中后,就可以以任何方式使用这些数据了。下面以简单的方式使用系统密码文件的值。首先,我们将创建一个字符串,它包含文件中存储的所有数字,且没有任何空格:
读取passwd文件每一行,添加到pi_string并且打印出来,然后打印pi_string长度。可以看到pi_string越来越长。
![](https://img.haomeiwen.com/i6395337/bbd388f40a087223.jpg)
![](https://img.haomeiwen.com/i6395337/577763e79106a0ef.jpg)
![](https://img.haomeiwen.com/i6395337/a5f20462a0c43510.jpg)
filename = '/etc/passwd'
with open(filename) as file_object:
lines = file_object.readlines()
pi_string = ''
for line in lines:
pi_string += line.rstrip()
print(pi_string)
print(len(pi_string))
DAY 151 2017.10.31
python向服务器写入空文件
保存数据的最简单的方式之一是将其写入到文件中。通过将输出写入文件,即便关闭包含程序输出的终端窗口,这些输出也依然存在:你可以在程序结束运行后查看这些输出,可与别人分享输出文件,还可编写程序来将这些输出读取到内存中并进行处理。
要将文本写入文件,你在调用open() 时需要提供另一个实参,告诉Python你要写入打开的文件。为明白其中的工作原理,我们来将一条简单的消息存储到文件中,然后调用commands模块执行cat的命令,看我们写成功的文件内容。
当然可以写文件已经很牛了,但没权限的话,python最好写到/tmp目录下以保证能生成文件。
![](https://img.haomeiwen.com/i6395337/11c5082c2df326e2.jpeg)
import commands
filename = '/tmp/hack.txt'
with open(filename, 'w') as file_object:
file_object.write("I love programming.")
print commands.getstatusoutput("cat /tmp/hack.txt")
DAY 152 2017.11.1
python写入多行
函数write() 不会在你写入的文本末尾添加换行符,因此如果你写入多行时没有指定换行符,文件看起来可能不是你希望的那样:
所以,写入多行需要加入换行符。
![](https://img.haomeiwen.com/i6395337/3012dafd764952b8.jpg)
import commands
filename = '/tmp/hk.txt'
with open(filename, 'w') as file_object:
file_object.write("I love programming.")
commands.getstatusoutput("cat /tmp/hk.txt")
with open(filename,'r') as file_object:
contents=file_object.read()
print contents
![](https://img.haomeiwen.com/i6395337/7222ce5e67a3fbeb.jpg)
import commands
filename = '/tmp/hk.txt'
with open(filename, 'w') as file_object:
file_object.write("I love programming.\n")
file_object.write("I love creating new games.\n")
commands.getstatusoutput("cat /tmp/hk.txt")
with open(filename,'r') as file_object:
contents=file_object.read()
print contents
DAY 153 2017.11.2
python文件附加写导致的迷案
如果你要给文件添加内容,而不是覆盖原有的内容,可以附加模式 打开文件。你以附加模式打开文件时,Python不会在返回文件对象前清空文件,而你写入到文件的行都将添加到文件末尾。如果指定的文件不存在,Python将为你创建一个空文件。 下面来修改程序,在既有文件pp.txt中再添加一些你酷爱编程的原因: main.py
![](https://img.haomeiwen.com/i6395337/fc86b853ebcbc8ea.jpg)
![](https://img.haomeiwen.com/i6395337/9a6391d635787d6e.jpg)
import commands
filename = "./pp.txt"
with open(filename, 'a') as fo:
fo.write("I also love finding meaning in large datasets. ")
print commands.getstatusoutput("cat ./pp.txt")
fo.write("I love creating apps that can run in a browser. ")
print commands.getstatusoutput("cat ./pp.txt")
DAY 154 2017.11.3
异常
Python使用被称为异常 的特殊对象来管理程序执行期间发生的错误。每当发生让Python不知所措的错误时,它都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继 续运行;如果你未对异常进行处理,程序将停止,并显示一个traceback,其中包含有关异常的报告。
异常是使用try-except 代码块处理的。try-except 代码块让Python执行指定的操作,同时告诉Python发生异常时怎么办。使用了try-except 代码块时,即便出现异常, 程序也将继续运行:显示你编写的友好的错误消息,而不是令用户迷惑的traceback。(错误堆栈)
处理ZeroDivisionError 异常
使用try-except 代码块
当你认为可能发生了错误时,可编写一个try-except 代码块来处理可能引发的异常。你让Python尝试运行一些代码,并告诉它如果这些代码引发了指定的异常,该怎么办。 处理ZeroDivisionError 异常的try-except 代码块类似于下面这样:
![](https://img.haomeiwen.com/i6395337/2f239771f40a00ee.jpg)
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
try:
print(5/0)
except ZeroDivisionError:
print("You can't divide by zero!")
Markdown实在太好用了,作业一直在做但没有时间整理,周末加油整理好(๑• . •๑)
2017.11.11更新
网友评论