⑴ python pandas 統計某一數據出現多少次
輸入:
import pandas as pd
data0 = [0,1,2,0,1,0,2,0]
pd.value_counts(data0)
輸出每個數出現的頻數:
0 4
2 2
1 2
(0出現4次,2出現2次,1出現兩次)
⑵ 如何利用Python嗅探數據包
一提到Python獲取數據包的方式,相信很多Python愛好者會利用Linux的libpcap軟體包或利用Windows下的WinPcap可移植版的方式進行抓取數據包,然後再利用dpkt軟體包進行協議分析,我們這里想換一個角度去思考:
1. Python版本的pcap存儲內存數據過小,也就是說緩存不夠,在高並發下容易發生丟包現象,其實C版本的也同樣存在這樣的問題,只不過Python版本的緩存實在是過低,讓人很郁悶。
2. dpkt協議分析並非必須,如果你對RFC 791和RFC 793等協議熟悉的話,完全可以使用struct.unpack的方式進行分析。
如果你平常習慣使用tcpmp抓取數據包的話,完全可以使用它來代替pcap軟體包,只不過我們需要利用tcpmp將抓取的數據以pcap格式進行保存,說道這里大家一定會想到Wireshark工具,具體命令如下:
1. tcpmp dst 10.13.202.116 and tcp dst port 80 -s 0 -i eth1 -w ../pcap/tcpmp.pcap -C 1k -W 5
我們首先需要對pcap文件格式有所了解,具體信息大家可以參考其他資料文檔,我這里只說其重要的結構體組成,如下:
1. sturct pcap_file_header
2. {
3. DWORD magic;
4. WORD version_major;
5. WORD version_minor;
6. DWORD thiszone;
7. DWORD sigfigs;
8. DWORD snaplen;
9. DWORD linktype;
10. }
11.
12. struct pcap_pkthdr
13. {
14. struct timeval ts;
15. DWORD caplen;
16. DWORD len;
17. }
18.
19. struct timeval
20. {
21. DWORD GMTtime;
22. DWORD microTime;
23. }
這里需要說明的一點是,因為在Python的世界裡一切都是對象,所以往往Python在處理數據包的時候感覺讓人比較麻煩。
至於對於如何監控tcpmp生成的pcap文件數據,大家可以通過pyinotify軟體包來實現(相信大家一定對於rsync+inotify的組合比較熟悉),如下:
1. class Packer(pyinotify.ProcessEvent):
2. def __init__(self, proct):
3. self.proct = proct
4. self.process = None
5.
6. def process_IN_CREATE(self, event):
7. logger.debug("create file: %s in queue" % self.process_IF_START_THREAD(event))
8.
9. def process_IN_MODIFY(self, event):
10. self.process_IF_START_THREAD(event)
11. logger.debug("modify file: %s in queue" % self.process_IF_START_THREAD(event))
12.
13. def process_IN_DELETE(self, event):
14. filename = os.path.join(event.path, event.name)
15. logger.debug("delete file: %s" % filename)
16.
17. def process_IF_START_THREAD(self, event):
18. filename = os.path.join(event.path, event.name)
19.
20. if filename != self.process:
21. self.process = filename
22. self.proct.put(filename)
23.
24. if self.proct.qsize() > 1:
25. try:
26. logger.debug("create consumer proct.qsize: %s" % self.proct.qsize())
27. consumer = Consumer(self.proct)
28. consumer.start()
29. except Exception, errmsg:
30. logger.error("create consumer failed: %s" % errmsg)
31.
32. return filename
33.
34. class Factory(object):
35. def __init__(self, proct):
36. self.proct = proct
37. self.manager = pyinotify.WatchManager()
38. self.mask = pyinotify.IN_CREATE | pyinotify.IN_DELETE | pyinotify.IN_MODIFY
39.
40. def work(self):
41. try:
42. try:
43. notifier = pyinotify.ThreadedNotifier(self.manager, Packer(self.proct))
44. notifier.start()
45. self.manager.add_watch("../pcap", self.mask, rec = True)
46. notifier.join()
47. except Exception, errmsg:
48. logger.error("create notifier failed: %s" % errmsg)
49. except KeyboardInterrupt, errmsg:
50. logger.error("factory has been terminated: %s" % errmsg)
在獲得要分析的pcap文件數據之後,就要對其分析了,只要你足夠了解pcap文件格式就可以了,對於我們來講只需要獲得TCP數據段的數據即可,如下:
1. class Writer(threading.Thread):
2. def __init__(self, proct, stack):
3. threading.Thread.__init__(self)
4. self.proct = proct
5. self.stack = stack
6.
7. self.pcap_pkthdr = {}
8.
9. def run(self):
10. while True:
11. filename = self.proct.get()
12. try:
13. f = open(filename, "rb")
14. readlines = f.read()
15. f.close()
16. offset = 24
17. while len(readlines) > offset:
18. self.pcap_pkthdr["len"] = readlines[offset+12:offset+16]
19. try:
20. length = struct.unpack("I", self.pcap_pkthdr["len"])[0]
21. self.stack.put(readlines[offset+16:offset+16+length])
22. offset += length + 16
23. except Exception, errmsg:
24. logger.error("unpack pcap_pkthdr failed: %s" % errmsg)
25. except IOError, errmsg:
26. logger.error("open file failed: %s" % errmsg)
在獲得TCP數據段的數據包之後,問題就簡單多了,根據大家的具體需求就可以進行相應的分析了,我這里是想分析其HTTP協議數據,同樣也藉助了dpkt軟體包進行分析,如下:
1. def worker(memcache, packet, local_address, remote_address):
2. try:
3. p = dpkt.ethernet.Ethernet(packet)
4. if p.data.__class__.__name__ == "IP":
5. srcip = "%d.%d.%d.%d" % tuple(map(ord, list(p.data.src)))
6. dstip = "%d.%d.%d.%d" % tuple(map(ord, list(p.data.dst)))
7. if p.data.data.__class__.__name__ == "TCP":
8. tcpacket = p.data.data
9. if tcpacket.dport == 80 and dstip == local_address:
10. srcport = tcpacket.sport
11. key = srcip + ":" + str(srcport)
12. if tcpacket.data:
13. if not memcache.has_key(key):
14. memcache[key] = {}
15.
16. if not memcache[key].has_key("response"):
17. memcache[key]["response"] = None
18.
19. if memcache[key].has_key("data"):
20. memcache[key]["data"] += tcpacket.data
21. else:
22. memcache[key]["data"] = tcpacket.data
23. else:
24. if memcache.has_key(key):
25. memcache[key]["response"] = dpkt.http.Request(memcache[key]["data"])
26. try:
27. stackless.tasklet(connection)(memcache[key]["response"], local_address, remote_address)
28. stackless.run()
29. except Exception, errmsg:
30. logger.error("connect remote remote_address failed: %s", errmsg)
31. logger.debug("old headers(none content-length): %s", memcache[key]["response"])
32. memcache.pop(key)
33. except Exception, errmsg:
34. logger.error("dpkt.ethernet.Ethernet failed in worker: %s", errmsg)
如果大家只是想單純的獲取IP地址、埠、流量信息,那麼問題就更簡單了,這里只是拋磚引玉。
⑶ python中如何查找數組中的唯一值的數量
rec = collections.defaultdict(int)
for i in arr:
rec[i] += 1
count = 0
for k, v in rec.items():
if v == 1:
count += 1
print(count)
⑷ rec['tz']在Python中什麼意思
兄台你這斷章取義的提問讓諸位老司機措手不及啊,不過有一點是可以確定的:你一定在看用Python做數據分析這本書,rec是定義的變數,rec【'tz'】是去json中value值
⑸ python 判斷字元串是否循環
executeRecord="niu"
rec = open('py.txt', 'r+')
lineInfos = rec.readlines()
recordFlag = True
for row in lineInfos:
print(row.strip().find(executeRecord))
# find函數-1表示找不到匹配內容,其他輸出結果為找到的索引值
if row.strip().find(executeRecord) != -1:
print("%s 已經存在!" % (executeRecord))
# 記錄過即不再記錄
recordFlag = False
break
if recordFlag:
executeRecord = '%s\n' % executeRecord
rec.write(executeRecord)
rec.close()
⑹ python中如何判斷指定字元串是否在文件中
#-*-coding:utf-8-*-
__author__='JipuFANG'
importrequests
f=open('123.txt','r+')
a=f.readlines()
b='115'
if[c.strip().find(b)forcina]:
print("%s已經存在!"%(b))
else:
f.write(b)
f.close()
# 自己去完善吧!也是一種學習!
⑺ python如何跳出無限循環並執行下一個函數
importtime
importos
importschele
importpyautogui
defRec():
record=os.startfile("C:ProgramFiles(x86)EVCaptureEVCapture.exe")
schele.every().day.at("16:40").do(Rec)
whileTrue:
ifpyautogui.hotkey('ctrl','f2'):
break
schele.run_pending()
time.sleep(1)
defStar_t():
St=pyautogui.hotkey('ctrl','f1')
Star_t()
⑻ Python數據類型出現的問題
>>>test='x02'
>>>ord(test)
2
>>>type(ord(test))
<type'int'>
>>>
將s1.data_rec改為ord(s1.data_rec)
⑼ python遞增( autoincrement公式)
賦值語句 AB = rec改為 AB= autoIncrement()
⑽ python 正則表達式,怎樣匹配以某個字元串開頭,以某個字元串結尾的情況
python正則匹配以xx開頭以xx結尾的單詞的步驟:
1、假設需要匹配的字元串為:site sea sue sweet see case sse ssee loses需要匹配的為以s開頭以e結尾的單詞。正確的正則式為:sS*?e
2、使用python中re.findall函數表示匹配字元串中所有的可能選項,re是python里的正則表達式模塊。findall是其中一個方法,用來按照提供的正則表達式,去匹配文本中的所有符合條件的字元串。
3、代碼和結果如下:
text ='site sea sue sweet see case sse ssee loses'
re.findall(r'sS*?e',text)
結果為:['site', 'sue', 'see', 'sse', 'ssee']
(10)recpython擴展閱讀:
python正則匹配,以某某開頭某某結尾的最長子串匹配
代碼如下:
regVersions = re.search(r'(V|v)[0-9].*[0-9]', filename)
if regVersions:
print regVersions.group()