/*auto readmore*/ /*auto readmore*/ /* an hien script*/ // an hien password /*an hien ma chuong trinh cong tru */ /*Scrollbox thanh cuon*/ /***Nhung CODE***/ /* dòng xanh dòng trắng */ /* https://cdnjs.com/libraries/prism lay thu vien, can vao ten file ma goi 1. copy link vao vi du:prism-python.min.js 2. ten ngon nua la python */ /*=== New posts ===*/ /*header slider*/ /*=== bai viet lien quan===*/ /*===tabcode===*/

Học Python Qua Ví Dụ #017 Bài Tập - Convert Dictionary To List Trong Python

Ví dụ 1:

Code:
'''
cho Dict dùng for để lấy tất cả các keys, values đưa vào list
print ra màn hình
'''
#DMIP = {key:value}
DMIP = {"Devices" : "Management IP","R_HaNoi" :"10.0.0.1", "R_DaNang" : "172.16.1.2", "R_HoChiMinh" : "192.168.1.3"}

all_key = []
# hoac: for key in DMIP:
for key in DMIP.keys():
	all_key.append(key)

all_value =[]
for value in DMIP.values():
	all_value.append(value)

print(all_key)
print(all_value)


Kết quả:
C:\python>python Demo.py
['Devices', 'R_HaNoi', 'R_DaNang', 'R_HoChiMinh']
['Management IP', '10.0.0.1', '172.16.1.2', '192.168.1.3']

C:\python>

Ví dụ 2:
Code:
'''
cho Dict dùng for để lấy tất cả các keys, values đưa vào list
print ra màn hình
'''
#DMIP = {key:value}
DMIP = {"Devices" : "Management IP","R_HaNoi" :"10.0.0.1", "R_DaNang" : "172.16.1.2", "R_HoChiMinh" : "192.168.1.3"}

all_key = []
all_value =[]
for key, value in DMIP.items():
	all_key.append(key)
	all_value.append(value)

print(all_key)
print(all_value)

Ví dụ 3 (không dùng for):
Code:
#DMIP = {key:value}
DMIP = {"Devices" : "Management IP","R_HaNoi" :"10.0.0.1", "R_DaNang" : "172.16.1.2", "R_HoChiMinh" : "192.168.1.3"}
# lấy tất cả keys và values cho vào list
all_key = list(DMIP.keys())
all_value = list(DMIP.values())

hostname = all_key.copy()
ip_addr = all_value.copy()

# lấy ra phần tử đầu của list hostname và ip_addr đưa vào list mới item
item=[]
item.append(hostname.pop(0))
item.append(ip_addr.pop(0))
item.append("-")

#format
print()
print("{:^50}".format("=====USING FORMAT METHOD OF STRING CLASS====="))
print("{:^20} {:^20}".format(item[0], item[1]))
print("{:^20} {:^20}".format(item[2]*20,item[2]*20))
print("{:>20} {}".format(hostname[0],ip_addr[0]))
print("{:>20} {}".format(hostname[1],ip_addr[1]))
print("{:>20} {}".format(hostname[2],ip_addr[2]))

#f-string
print()
print(f"{'=====USING F-STRING=====':^50}")
print(f"{item[0]:^20}  {item[1]:^20}")
print(f"{item[2]*20:^20}  {item[2]*20:^20}")
print(f"{hostname[0]:>20}  {ip_addr[0]}")
print(f"{hostname[1]:>20}  {ip_addr[1]}")
print(f"{hostname[2]:>20}  {ip_addr[2]}")

Kết quả:


Xong!

Học Python Qua Ví Dụ #016 - Dictionary Trong Python

  • Dictionary là gì
Kiểu dữ liệu lưu trữ trong dictionary gồm các giá trị Key và Value.


Chúng lưu trữ không theo một trận tự hay thứ tự sắp xếp nào cả. Khai báo chúng được định nghĩa bởi cặp dấu {}

Ví dụ:
net_device = {
	"device_type": "ios",
	"ip_addr": "192.168.0.1"
}

  • Thêm/sửa/xóa phần tử trong dictionary
Code:
net_device = {
	"device_type": "ios",
	"ip_addr": "192.168.0.1"
}
print(net_device)

# thêm key vendor có giá trị juniper vào dictionary
net_device ["vendor"] = "juniper"
print(net_device)

# thay đổi giá trị của dict
net_device["ip_addr"] = "192.168.0.254"
print(net_device)

# lấy giá trị ra khỏi dict
net_device.pop("vendor")
print(net_device)


Kết quả
C:\python>python Demo.py

{'device_type': 'ios', 'ip_addr': '192.168.0.1'}

{'device_type': 'ios', 'ip_addr': '192.168.0.1', 'vendor': 'juniper'}

{'device_type': 'ios', 'ip_addr': '192.168.0.254', 'vendor': 'juniper'}

{'device_type': 'ios', 'ip_addr': '192.168.0.254'}

C:\python>

  • Phương thức update trong Dictionary
Code:
net_device = {
	"device_type": "ios",
	"ip_addr": "192.168.0.1",
	"vendor" : "cisco",
}
print(net_device)

net_device_2 = {"model" : "sxr", "vendor" : "juniper"}

# giá trị của net_device_2 sẽ thêm vào net_device
net_device.update(net_device_2)
print(net_device)

Kết quả:
C:\python>python Demo.py

{'device_type': 'ios', 'ip_addr': '192.168.0.1', 'vendor': 'cisco'}
{'device_type': 'ios', 'ip_addr': '192.168.0.1', 'vendor': 'juniper', 'model': 'sxr'}

C:\python>

Với ví dụ trên, giá trị của net_device_2 sẽ được thêm vào net_device, nếu trong net_device đã tồn tại key thì giá trị của net_device_2 sẽ ghi đè lên giá trị của net_device. Đó là lý do giá trị mới của key vendor trong net_device là juniper thay cho cisco

  • Lặp trong dictionary
Code:
net_device = {
	"device_type": "ios",
	"ip_addr": "192.168.0.1",
	"vendor" : "cisco",
	"mode": "881"
}

# in ra danh sách các key trong dictionary
for key in net_device.keys():
	print (key)

print("-" * 20)
# in ra danh sách các giá trong dictionary
for value in net_device.values():
	print (value)

print("-" * 20)
# in ra key, value thông qua items
for key, value in net_device.items():
	print (key)
	print (value)
	print("-" * 20)

Kết quả:
C:\python>python Demo.py
device_type
ip_addr
vendor
mode
--------------------
ios
192.168.0.1
cisco
881
--------------------
device_type
ios
--------------------
ip_addr
192.168.0.1
--------------------
vendor
cisco
--------------------
mode
881
--------------------

C:\python>

  • Merge two dictionary
Với phương thức update giúp chúng ta có thêm giá dictionary và nếu key đã tồn tại trước đó thì giá trị của key đó sẽ bị thay thế bởi giá trị cập nhật sau hay còn gọi là ghi đè. 

Bây giờ chúng ta xây dựng hàm để cập thật thêm giá trị vào dictionary mà không ghi đè (như phương thức update) nếu key đã tồn tại.

Code:
def mergeDict(dict1, dict2):
   
   dict3 = {**dict1, **dict2}						# thực hiện nối 2 dict, nếu trùng key thì giá trị sẽ là giá trị của dict đứng sau (trường hợp này dict2)
   for key, value in dict3.items():					
       if key in dict1 and key in dict2:			# 2 dict có key giống nhau
            dict3[key] = [value , dict1[key]]	    # thêm value của dict1 vào dict 3

   return dict3

dict1 = {'R1': {'Eth0/0': '192.168.11.1 255.255.255.0'}}
dict2 = {'R1': {'Eth0/1': '192.168.12.1 255.255.255.0'}}

dict3 = mergeDict(dict1, dict2)						# gọi hàm merge
print('Dictionary sau khi merge:')
print(dict3)


Kết quả:
C:\python>python Demo.py
Dictionary sau khi merge:
{'R1': [{'Eth0/1': '192.168.12.1 255.255.255.0'}, {'Eth0/0': '192.168.11.1 255.255.255.0'}]}

Để kết quả dễ nhìn hơn chúng ta import thư viện pprint để in ra kết quả.

Code:
def mergeDict(dict1, dict2):
   
   dict3 = {**dict1, **dict2}						# thực hiện nối 2 dict, nếu trùng key thì giá trị sẽ là giá trị của dict đứng sau (trường hợp này dict2)
   
   for key, value in dict3.items():					
       if key in dict1 and key in dict2:			# 2 dict có key giống nhau
            dict3[key] = [value , dict1[key]]	    # thêm value của dict1 vào dict 3

   return dict3


dict1 = {'R1': {'Eth0/0': '192.168.11.1 255.255.255.0'}}
dict2 = {'R1': {'Eth0/1': '192.168.12.1 255.255.255.0'}}

dict3 = mergeDict(dict1, dict2)						# gọi hàm merge
print('Dictionary sau khi merge:')

from pprint import pprint	# import thư viện pprint
pprint(dict3)


Kết quả:
C:\python>python Demo.py
Dictionary sau khi merge:
{'R1': [{'Eth0/1': '192.168.12.1 255.255.255.0'},
        {'Eth0/0': '192.168.11.1 255.255.255.0'}]}

Xong!

Windows, Remote Desktop Protocol (RDP) - Do Not Allow Drive/Clipboard Redirection Policies

Chúng ta điều khiển từ máy tính thông qua các chương trình remote trong đó có Remote Desktop của windows, thông qua đó chúng ta có thể chia sẽ tài nguyên qua lại giữa remote computer và client computer nhờ Remote Desktop Services session. Mặc định Remote Desktop Services session cho phép Drive/Clipboard Redirection.


Chúng ta có thể làm theo hướng như hình rồi remote desktop vào ỗ đĩa của máy chúng ta sẽ xuất hiện trên máy remote.


Với hình trên máy có tên VCK đang remote desktop vào và share 8 ổ đĩa nên trên máy đang bị remote hiện thị thêm các ổ đĩa của máy VCK nên chúng ta thấy chữ ... on VCK

Tham khảo cách mở Remote Destkop ở đây

Tuy nhiên vì lý do nào đó chúng ta muốn chặn việc Redirection Drive/Clipboard Redirection giữa remote computer và client computer.

Có nhiều cách để làm được điều này, tuy nhiên trong bài này chúng tôi hướng dẫn chặn thông qua policy.

Thực hiện chặn Redirection với máy tính bật RDP trên:
  • Win 8.1



  • Windows Server + domain controller:

đường dẫn khác, nhưng cách làm tương tự.
Group Policy Editor -> Computer Configuration\Policies\Administrative Templates\Windows Components\Remote Desktop Services\Remote Desktop Session Host\Device and Resource Redirection.

Làm xong bước này thử lại nhé các bạn, nếu gpupdate /force chưa ép-phê thì khởi động lại máy.

Xong!

Windows, Remote Desktop Protocol (RDP) - Do Not Allow Drive/Clipboard Redirection Policies

Chúng ta điều khiển từ máy tính thông qua các chương trình remote trong đó có Remote Desktop của windows, thông qua đó chúng ta có thể chia sẽ tài nguyên qua lại giữa remote computer và client computer nhờ Remote Desktop Services session. Mặc định Remote Desktop Services session cho phép Drive/Clipboard Redirection.


Chúng ta có thể làm theo hướng như hình rồi remote desktop vào ỗ đĩa của máy chúng ta sẽ xuất hiện trên máy remote.


Với hình trên máy có tên VCK đang remote desktop vào và share 8 ổ đĩa nên trên máy đang bị remote hiện thị thêm các ổ đĩa của máy VCK nên chúng ta thấy chữ ... on VCK

Tham khảo cách mở Remote Destkop ở đây

Tuy nhiên vì lý do nào đó chúng ta muốn chặn việc Redirection Drive/Clipboard Redirection giữa remote computer và client computer.

Có nhiều cách để làm được điều này, tuy nhiên trong bài này chúng tôi hướng dẫn chặn thông qua policy.

Thực hiện chặn Redirection với máy tính bật RDP trên:
  • Win 8.1



  • Windows Server + domain controller:

đường dẫn khác, nhưng cách làm tương tự.
Group Policy Editor -> Computer Configuration\Policies\Administrative Templates\Windows Components\Remote Desktop Services\Remote Desktop Session Host\Device and Resource Redirection.

Làm xong bước này thử lại nhé các bạn, nếu gpupdate /force chưa ép-phê thì khởi động lại máy.

Xong!

Học Python Qua Ví Dụ #015 - Mail Merge/Trộn Mail Căn Bản Trong Python


Nên xem các bài dưới đây trước khi xem bài này

Mail Merge - Trộn Thư là tính năng rất hữu ích của Ms Word, tính năng này giúp chúng ta giảm thiểu thời gian trong các việc như: soạn hợp đồng, in phiếu lương, in giấy mời, thư cám ơn,... Hôm nay chúng ta tìm hiểu cách thực hiện Mail Merge trên python.

Có file Noidung.xlm có nội dung:
Hi: your_name
Your ID: your_id 
Your Password: your_password
Your OTP: your_otp

và file Danhsach.csv có nội dung:

Yêu cầu:
Các trường: your_name, your_id, your_password, your_otp của file Noidung.xlm sẽ thay đổi, mỗi dòng trong file Danhsach.csv sẽ được điền vào các trường tương ứng ở file Noidung.xlm. Kết quả tương tự như hình bên dưới
 

Nhận xét: 
Chúng ta thấy phần nội dung của file Noidung.xlm được lặp lại 6 lần (tùy thuộc vào số lượng dòng trong file Danhsach.csv). Nên file Noidung.xlm sẽ được mở trước sau đó mở file Danhsach.csv và sẽ có sự đi lặp lại khi xử lý file này.

Thực hiện:
Code:

with open ("Noidung.xml","r") as rf:
	noidung = rf.read()

	with open ("danhsach.csv","r") as rf_ds:
		
		for line_ds in rf_ds.readlines():
			fiedls_ds = line_ds.split(",")
			# đảm bảo khi thực hiện mỗi bước nhảy của vòng lặp nội dung file mới là đúng nội dung ban đầu của file Noidung.xml và
			noidung_moi = noidung
			'''
			Thực hiện thay thế
			Nếu thấy các trường:your_name, your_id, your_password, your_otp 
			thì thay thế bằng các trường tương ứng trong file danh sách
			'''
			noidung_moi = noidung_moi.replace("your_name",fiedls_ds[1])
			noidung_moi = noidung_moi.replace("your_id",fiedls_ds[2])
			noidung_moi = noidung_moi.replace("your_password",fiedls_ds[3])
			noidung_moi = noidung_moi.replace("your_otp",fiedls_ds[4])
			print(noidung_moi)			

Kết quả:
C:\python>python Demo.py
Hi: Nguyen Van Troi
Your ID: id2020
Your Password: 112233
Your OTP: aabbcc

Hi: Tran Van Luong
Your ID: id2121
Your Password: 445566
Your OTP: ddeeff

Hi: Truong Viet Hoang
Your ID: id2222
Your Password: 778899
Your OTP: gghhkk

Hi: Cong Vuong
Your ID: id2323
Your Password: 223344
Your OTP: xxyyzz

Hi: Tien Linh
Your ID: id2424
Your Password: 334455
Your OTP: aawwqq

Hi: Van Quyet
Your ID: id2525
Your Password: 556677
Your OTP: ppkkll

C:\python>


Với code trên chúng ta thấy từ dòng 15 đến dòng 18 chúng ta có thể thay bằng vòng lặp và các trường: your_name, your_id, your_password, your_otp có thể đưa vào biến list sẽ thích hợp hơn, và code sẽ gọn hơn.

Code:
# Định nghĩa biến key_word là một list gồm các key word sẽ được thay thế

key_word = ["No.", "your_name", "your_id","your_password", "your_otp"]

with open ("Noidung.xml","r") as rf:
	noidung = rf.read()

	with open ("danhsach.csv","r") as rf_ds:
		
		rf_ds.readline() # Bỏ dòng đầu tiên, vì dòng đầu tiên là dòng tiêu đề
		
		for line_ds in rf_ds.readlines():
			fiedls_ds = line_ds.split(",")
			# đảm bảo khi thực hiện mỗi bước nhảy của vòng lặp nội dung file mới là đúng nội dung ban đầu của file Noidung.xml và
			noidung_moi = noidung
			
			#tạo vòng lặp chạy từ 1 cho đến hết chiều dài của biến key_word
			for i in range(1, len(key_word),1):
				noidung_moi = noidung_moi.replace(key_word[i],fiedls_ds[i])				
			print(noidung_moi))						



Xong!
 
/*header slide*/