1.获得用户和组信息
#! /usr/bin/env python
#-*- coding: utf-8 -*-
'''获得用户和组信息'''
import os, stat
def WalkDir(dir, file_callback=None):
for root, dirs, files in os.walk(dir):
for d in dirs:
#print d
if(not d[0] == "."):
file_path = os.path.join(root, d)
if file_callback: file_callback(file_path)
for root, dirs, files in os.walk(dir):
for f in files:
#print f
if(not f[0] == "."):
file_path = os.path.join(root, f)
if file_callback: file_callback(file_path)
def LogFile(file):
try:
fileStats = os.stat(file)
#print file
#print fileStats.st_mode
#print oct(stat.S_IMODE(fileStats.st_mode))
#print fileStats.st_uid
#print fileStats.st_gid
fileInfo = 'chown ' + str(fileStats.st_uid) +':' + str(fileStats.st_gid) + ' ' + file
print fileInfo
except:
pass
if __name__ == "__main__":
path = raw_input('Please input a path to do the test: ')
WalkDir(path, LogFile)
2.获得文件或者文件夹权限
#! /usr/bin/env python
#-*- coding: utf-8 -*-
'''获得文件或者文件夹权限 '''
import os, stat
def WalkDir(dir, file_callback=None):
for root, dirs, files in os.walk(dir):
for d in dirs:
#print d
if(not d[0] == "."):
file_path = os.path.join(root, d)
if file_callback: file_callback(file_path)
for root, dirs, files in os.walk(dir):
for f in files:
#print f
if(not f[0] == "."):
file_path = os.path.join(root, f)
if file_callback: file_callback(file_path)
def LogFile(file):
try:
fileStats = os.stat(file)
#print file
#print fileStats.st_mode
#print oct(stat.S_IMODE(fileStats.st_mode))
#print fileStats.st_uid
#print fileStats.st_gid
fileInfo = 'chmod ' + oct(stat.S_IMODE(fileStats.st_mode)) + ' ' + file
print fileInfo
except:
pass
if __name__ == "__main__":
path = raw_input('Please input a path to do the test: ')
WalkDir(path, LogFile)
3.查找大文件
#!/usr/bin/env python
# coding=utf-8
import os
import os.path
import stat
import sys
def new_queue():
#the dummy head
h = { "item": None,
"prev": None,
"next": None
}
h["prev"] = h;
h["next"] = h;
return h
def queue_put(h, item):
p = h["prev"]
node = {
"item": item,
"prev": p,
"next": h
}
p["next"] = node
h["prev"] = node
def queue_get(h):
if h["next"] == h:
return
p = h["next"]
h["next"] = p["next"]
h["next"]["prev"] = h
return p["item"]
def queue_isempty(h):
if h["next"] == h:
return True
else:
return False
def travfs_level_order(d):
if d.startswith("."):
return
s = []
q = new_queue()
queue_put(q, d)
while not queue_isempty(q):
fi = queue_get(q)
try:
st = os.stat(fi)
except:
continue
if stat.S_ISDIR(st.st_mode):
s.append((fi, st.st_size))
try:
sub = os.listdir(fi)
except:
continue
for i in sub:
queue_put(q, os.path.join(fi, i))
else:
try:
size = os.stat(fi).st_size
except:
continue
s.append((fi, size))
return s
K = 1024
M = K * K
G = M * K
def pretty_size(size):
if size / G:
return str(size / G) + "G"
elif size / M:
return str(size / M) + "M"
elif size / K:
return str(size / K) + "K"
else:
return str(size) + "B"
def sort_files(s):
s.sort(key = lambda x: x[1], reverse=True)
def top_k_size(files, k):
of = "{:<10}{:<20}"
for i in range(k):
try:
fi = files[i]
except:
break
print of.format(pretty_size(fi[1]), fi[0])
def print_usage():
print "python travfs.py path nnfind the top n biggest file in a path"
if __name__ == "__main__":
vlen = len(sys.argv)
if vlen == 2:
path = sys.argv[1]
k = 10
elif vlen == 3:
path = sys.argv[1]
k = int(sys.argv[2])
else:
print_usage()
exit()
files = travfs_level_order(os.path.abspath(path))
sort_files(files)
top_k_size(files, k)
在之前的一篇文章中其实有介绍另一个多线程查找Top10大文件的Python代码,非常值得学习。
4.查看端口情况
import os
import struct
import socket
state_table = (
"EMPTY SLOT",
"ESTABLISHED",
"SENT",
"RECV",
"WAIT1",
"WAIT2",
"WAIT",
"CLOSE",
"CLOSE_WAIT",
"LAST_ACK",
"LISTEN",
"CLOSING"
)
ESTABLISHED = 1
SENT = 2
RECV = 3
WAIT1 = 4
WAIT2 = 5
WAIT = 6
CLOSE = 7
CLOSE_WAIT = 8
LAST_ACK = 9
LISTEN = 10
CLOSING = 11
def decode_addr(name):
return (socket.inet_ntoa(name[0].decode("hex")[::-1]),
struct.unpack(">H", name[1].decode("hex"))[0])
def get_tcp():
f = open("/proc/net/tcp", "r")
lines = f.readlines()[1:]
f.close()
l = []
for i in lines:
k = i.strip(" ").split(" ")
srcall = k[1].split(":")
src, srcp = decode_addr(srcall)
dstall = k[2].split(":")
dst, dstp = decode_addr(dstall)
tx, rx = k[4].split(":")
info = {
"num": k[0],
"src": src,
"srcp": srcp,
"dst": dst,
"dstp": dstp,
"state": ord(k[3].decode("hex")),
"tx": struct.unpack("I", tx.decode("hex"))[0],
"rx": struct.unpack("I", rx.decode("hex"))[0]
}
if k[8]:
info["uid"] = int(k[8])
if k[16]:
info["timeout"] = int(k[16])
if k[17]:
info["inode"] = int(k[17])
l.append(info)
return l
def pid_fds():
table = {}
for i in os.listdir("/proc"):
try:
pid = int(i)
except:
continue
basej = "/proc/%s/fd" % i
fdtable = {}
try:
subs = os.listdir(basej)
except:
continue
for j in subs:
try:
k = os.readlink("%s/%s" % (basej, j))
except:
continue
fdtable[int(j)] = k
table[pid] = fdtable
return table
def inode_to_pid(inode, pid_fds_table):
for k,v in pid_fds_table.items():
for i in v.values():
if inode == i:
return k
return None
def port_to_pid(port):
tcpinfo = get_tcp()
pids_table = pid_fds()
pid = None
for i in tcpinfo:
if "inode" not in i:
continue
if i["srcp"] != port:
continue
pid = inode_to_pid("socket:[%s]" % str(i["inode"]), pids_table)
if pid:
break
return pid
def pid_to_loc(pid):
f = open("/proc/%d/cmdline" % pid, "r")
cmdline = f.read().replace("x00", " ")
f.close()
return {
"cwd": os.readlink("/proc/%d/cwd" % pid),
"exe": os.readlink("/proc/%d/exe" % pid),
"cmdline": cmdline
}
def do_tcp():
of = "{:<5}{:<30}{:<30}{:<20}"
print of.format("NUM", "SRC", "DST", "STATE")
for k in get_tcp():
print of.format(k["num"],
":".join((k["src"], str(k["srcp"]))),
":".join((k["dst"], str(k["dstp"]))),
state_table[k["state"]])
def do_port(port):
pid = port_to_pid(int(port))
if not pid:
print "nothing found"
return
print "pid: ", pid
loc = pid_to_loc(pid)
print "exe: %sncwd: %sncmdline: %s" % (loc["exe"], loc["cwd"], loc["cmdline"])
def print_usage():
print "-p portt find out which process is binded to this portn-t Display all tcp connections"
if __name__ == "__main__":
import sys
if len(sys.argv) < 2:
print_usage()
exit(0)
if sys.argv[1] == "-t":
do_tcp()
elif sys.argv[1] == "-p":
if len(sys.argv) < 3:
print_usage()
exit(0)
do_port(sys.argv[2])
else:
print_usage()
5.Python 中如何删除一个列表 List 中多个符合条件的元素?
假设有一个列表:
a = [1, 1, 0, 2, 0, 0, 8, 3, 0, 2, 5, 0, 2, 6]
判断如果a列表中元素’2’前面的一个元素是’0’,那么删除这个元素’0’,请问该如何操作?
========
@刘缙
[x[0] for x in zip(a,a[1:]+[None]) if x!=(0,2)]
又:注意其他答案有些不能处理len(a) in [0,1]的情形
===
@tonic
如果真的是你这样的数据…变字符串join起来把所有的02变成2不就好了?
====
@Simon Luo
for i in range(len(a)-1,-1,-1):
if a[i]==0 and a[i+1]==2:
a.pop(i)
参考了python帮助文档里去除list中重复字符的代码。
===
@郭一凡
a = [1, 1, 0, 2, 0, 0, 8, 3, 0, 2, 5, 0, 2, 6] for i in range(0,len(a)-2): if(a[i]==0 and a[i+1]==2): del(a[i]) i=i-1 print a
[1, 1, 2, 0, 0, 8, 3, 2, 5, 2, 6]
===
@绅士提督与不笑船
import json
a = json.loads(json.dumps(a).replace('0, 2', '2'))
稍微实现了一下楼上 @tonic 的说法。
===
@玖道
功能应该能实现,但是如果考虑代码简洁程度或者效率,还是坐等更高明的答案了。
def remove_1(lst): ans = [] for i in range(len(lst)): if lst[i] == 0: try: if lst[i+1] == 2: pass else: ans.append(lst[i]) except: ans.append(lst[i]) else: ans.append(lst[i]) return ans
===
@匿名用户
l = [l[i] for i in filter(lambda i: l[i] !=0 or i == len(l) or l[i+1] != 2, range(len(l)))]
@范子逸
[a[i] for i in range(len(a)) if a[i]!= 0 or i+1==len(a) or a[i+1] != 2]
@小生境
a = [1, 1, 0, 2, 0, 0, 8, 3, 0, 2, 5, 0, 2, 6] a = [x for i, x in enumerate(a[:-1]) if not x and a[i+1] == 2]
用numpy的话比较炫酷:
import numpy a = numpy.array([1, 1, 0, 2, 0, 0, 8, 3, 0, 2, 5, 0, 2, 6]) b = numpy.lib.stride_tricks.as_strided(a, (len(a)-1, 2), (4, 4)) idx = ~(b == [0, 2]).all(axis=1) a = a[idx]
最后都要append(a[-1])
a=[a[i] for i in range(len(a)) if not(a[i]==0 and a[i+1]==2)]
原文地址:Python 中如何删除一个列表 List 中多个符合条件的元素?
注意可能出现的在进行了一次替代/pop之后可能会再次出现的“0 2”序列,第一种方法我可想不到,唉,o(╯□╰)o
6.自打印的Python脚本
import sys print __file__ print sys.argv[0] text = open(__file__).read() print text[:-1] # text2 = open(sys.argv[0]).read() print text2[:-1]
=================
zip、filter、map、reduce、lambda
==Python中zip()函数用法举例 | 南柯一梦
定义:zip([iterable, …])
zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表)。若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同。利用*号操作符,可以将list unzip(解压),看下面的例子就明白了:
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b)
[(1, 4), (2, 5), (3, 6)]
>>> zip(a,c)
[(1, 4), (2, 5), (3, 6)]
>>> zip(*zipped)
[(1, 2, 3), (4, 5, 6)]
==Python 并行遍历zip()函数使用方法
zip()函数在运算时,会以一个或多个序列做为参数,返回一个元组的列表。同时将这些序列中并排的元素配对。
==Python中的map函数、zip函数、filter函数和reduce函数
在本文最上面刘缙的例子中之所以最后可以得到结果,是因为zip()函数本身就是一个迭代对象,会不停的往后进行迭代,所以才有用,唉,无知真可怕!
In [15]: zip?
Type: builtin_function_or_method
String form: <built-in function zip>
Namespace: Python builtin
Docstring:
zip(seq1 [, seq2 […]]) -> [(seq1[0], seq2[0] …), (…)]
Return a list of tuples, where each tuple contains the i-th element from each of the argument sequences. The returned list is truncated in length to the length of the shortest argument sequence.