初學者,寫的不好請指出。 #第一步以insertTime為條件查詢時間段內的數據 #第二部步可以選擇是否再以通話Id為條件篩選第一步所查詢出來的數據 #因為使用的是配置文件,所以首先在代碼當前目錄下創建一個配置文件,db.conf 代碼: ...
初學者,寫的不好請指出。
#第一步以insertTime為條件查詢時間段內的數據
#第二部步可以選擇是否再以通話Id為條件篩選第一步所查詢出來的數據
#因為使用的是配置文件,所以首先在代碼當前目錄下創建一個配置文件,db.conf
代碼:
1 import configparser 2 import pymongo 3 from pymongo import MongoClient 4 import time 5 6 print('以insertTime為條件查詢;可以按通話id篩選數據') 7 count = 0 8 f = open('獲取數據.txt', 'w',encoding='utf-8') #在寫入文件夾是會報編碼格式錯誤,所以增加encoding='utf-8'解決 9 cf =configparser.ConfigParser() 10 #讀取當前目錄下的配置文件db.conf 11 cf.read('db.conf') 12 get_start_time = cf.getint('mongodb','start_time') 13 get_end_time = cf.getint('mongodb','end_time') 14 get_call_id = cf.get('mongodb','call_id') 15 #將時間戳毫秒轉換為秒,db內的時間戳為毫秒單位,python的time為秒單位,所以除以1000 16 s_local_time = time.localtime(get_start_time/1000) 17 e_local_time = time.localtime(get_end_time/1000) 18 #將秒轉換為日期格式2017-01-01 12:00:00 19 s_time = time.strftime('%Y-%m-%d %H:%M:%S',s_local_time) 20 e_time = time.strftime('%Y-%m-%d %H:%M:%S',e_local_time) 21 22 print('資料庫IP:',cf.get('mongodb','db_ip'),'\n資料庫Port:',cf.getint('mongodb','db_port')) 23 print('查詢開始時間:',s_time,'\n查詢結束時間:',e_time) 24 print('通話ID:',get_call_id) 25 client = MongoClient(cf.get('mongodb','db_ip'),cf.getint('mongodb','db_port')) 26 print('****************************************************') 27 28 #異常處理,連接失敗走except pymongo.errors.ServerSelectionTimeoutError並退出,成功走else路徑。 29 try: 30 print('正在連接...') 31 client.database_names() #檢查是否能獲取到資料庫列表,獲取不到說明連接失敗。 32 print('連接成功...') 33 print('****************************************************') 34 except pymongo.errors.ServerSelectionTimeoutError: 35 print('無法連接,請查看資料庫是否啟成功,或資料庫IP和Port是否配置正確。') 36 print('****************************************************') 37 else: 38 # 輸出資料庫列表,迴圈輸出 39 print('資料庫名稱列表:') 40 database_names_num = 1 #為資料庫編號,從1開始,迴圈一次+1 41 for d_list in client.database_names(): 42 print(database_names_num,':',d_list) 43 database_names_num += 1 44 print('****************************************************') 45 while True: 46 #異常處理,如輸入非整數走下一步except ValueError,重新開始迴圈。否則走else路徑。 47 try: 48 num_1 = int(input('請以編號選擇資料庫:')) 49 except ValueError: 50 print('輸入類型錯誤,請重新輸入。') 51 print('****************************************************') 52 else : 53 #判斷輸入的編號是否大於資料庫的數量,或小於1 54 if num_1 > len(client.database_names()) or num_1 < 1 : 55 print('沒有找到這個資料庫,請重新輸入。') 56 print('****************************************************') 57 else: 58 #因資料庫實際全部存在為一個列表內,索引從0開始,我們為資料庫設置的編號為從1開始,所以需要-1 59 db = client[client.database_names()[num_1-1]] #資料庫名稱 60 print('****************************************************') 61 #print(db) 62 63 #列出資料庫內集合列表,迴圈輸出 64 print('資料庫內集合列表:') 65 collection_names_num = 1 #為集合編號,從1開始,迴圈一次+1 66 for c_list in db.collection_names(): 67 print(collection_names_num, ':',c_list ) 68 collection_names_num += 1 69 print('****************************************************') 70 71 while True: 72 # 異常處理,如輸入非整數走下一步except ValueError,重新開始迴圈。否則走else路徑。 73 try: 74 num_2 = int(input('請以編號選擇資料庫集合:')) 75 print('****************************************************') 76 except ValueError: 77 print('輸入類型錯誤,請重新輸入。') 78 print('****************************************************') 79 else: 80 # 判斷輸入的編號是否大於資料庫內集合的數量,或小於1 81 if num_2 > int(len(db.collection_names())) or num_2 < 1: 82 print('沒有找到這個集合,請重新輸入。') 83 print('****************************************************') 84 #print(db.collection_names()) 85 else: 86 # 因資料庫集合實際全部存在為一個列表內,索引從0開始,我們為資料庫集合設置的編號為從1開始,所以需要-1 87 my_db = db[db.collection_names()[num_2-1]] 88 #print(my_db) 89 n = input('是否需要篩選通話id,輸入“Y”或“N”:') 90 print('****************************************************') 91 print('開始運行...') 92 93 #這個迴圈分為3條路徑,輸入n,y個一條,然後輸入別的任何字元走else路徑,並重新迴圈 94 while True: 95 if n == 'n' or n == 'N': 96 s__time = time.clock() # 本地開始查詢時間 97 #find查詢條件,查詢到符合條件的數據存到變數data 98 for data in my_db.find({"insertTime": {'$gte': get_start_time, '$lte': get_end_time}}): 99 #print(data) 100 f.write(str(data) + '\n') #寫入文件內 101 count += 1 #統計共輸出數據的條數,初始為0,迴圈一次+1 102 e__time = time.clock() #本地結束查詢時間 103 #耗時等於結束時間減去開始時間 104 print('運行結束,共查詢到', count, '條數據,共耗時',int(e__time - s__time), '秒。') 105 break 106 107 elif n == 'y' or n =='Y': 108 # 開始運行時間 109 s__time = time.clock() # 本地開始查詢時間 110 # find查詢條件,查詢到符合條件的數據存到變數data 111 for data in my_db.find({"insertTime": {'$gte': get_start_time, '$lte': get_end_time}}): 112 #k為key,v為value,迴圈遍歷data,查詢value內含有通話ID的數據寫入到文件 113 for k, v in data.items(): 114 if get_call_id in str(v): 115 #print(data) 116 f.write(str(data) + '\n') 117 count += 1 #統計共輸出數據的條數,初始為0,迴圈一次+1 118 e__time = time.clock() #本地結束查詢時間 119 # 耗時等於結束時間減去開始時間 120 print('運行結束,共查詢到', count, '條數據,共耗時', int(e__time - s__time), '秒。') 121 break 122 break 123 break 124 input('按回車鍵結束...')