Để giúp các bạn hiểu rõ hơn về module os mà mình đã nói ở bài trước, hôm nay mình sẽ đưa ra một bài tập nhỏ để áp dụng module os để tìm một file và ghi dữ liệu vào nó trong python.
1. Vấn đề đặt ra
Giả sử tôi có một file không nhớ tên của nó và nó lưu một số dữ liệu nhưng lại không nhớ nó ở đâu, và một file là file.txt có một số dữ liệu giống như là file ở trên. Nhiệm vụ của chúng ta bây giờ là tìm ra file đó và so sánh xem thử có file nào có dữ liệu gần giống với dữ liệu của file.txt hay không, nếu có thì ghi thêm dữ liệu vào.
file.txt của tôi có dữ liệu như sau:
file cần tìm và chèn dữ liệu:
Trong trường hợp này, tôi sẽ kiểm tra xem trong ổ đĩa có file có dòng nào có dữ liệu là 456
hay không, nếu có thì ghi thêm ở đây có nè
vào sau dòng có 456
.
2. Code minh họa
Dưới đay là code minh họa cho chương trình
#Bài tập sử dụng module os # thêm module os vào import os #tôi rút gọn lại chỉ tìm ở trong ổ đĩa F path = "F:\File" dir_list = [] #Mở file.txt và kiểm tra nó def MoFile(line): lin = [] # Mở file ở chế độ đọc và thêm mỗi dòng vào một list with open("File.txt", "r") as f: lin = f.readlines() # so sánh các dòng ở file tìm được với mỗi dòng ở file tìm được for l in lin: if l.strip() == line.strip(): return True return False def CheckFile(path): # tạo đường dẫn for dirpath, dirfile, namefiles in os.walk(path): for namefile in namefiles: SuaFile(os.path.join(dirpath, namefile)) def SuaFile(a): global dir_list # đọc file ở đường dẫn with open(a, "r") as f: lines = f.readlines() # kiểm tra for index, line in enumerate(lines): if MoFile(line): print(a) lines.insert(3, "nhello") f.close() # ghi lại dữ liệu with open(a, "w") as f: for i in lines: f.write(i) f.close() CheckFile(path)
3. Giải thích code
import os path = "F:\" dir_list = []
Đầu tiên là chúng ta thêm module os vào và khởi tạo đường dẫn, ở đây tôi sẽ tìm file ở trong ổ đĩa F:
def CheckFile(path): for dirpath, dirfile, namefiles in os.walk(path): for namefile in namefiles: SuaFile(os.path.join(dirpath, namefile))
Như đã giới thiệu về hàm os.walk()
trong bài trước, hàm này sẽ trả về 3 thuộc tính là
- dirpath: các thư mục từ những gì bạn đã chỉ định.
- dirname: các thư mục con từ root.
- namefiles: in ra tất cả các tập tin từ thư mục gốc và thư mục.
Sau đó trong danh sách namfiles, thêm tên của file vào đường dẫn. Hàm SuaFile sẽ đảm nhận nhiệm vụ tiếp theo.
def SuaFile(a): global dir_list # đọc file ở đường dẫn with open(a, "r") as f: lines = f.readlines() # kiểm tra for index, line in enumerate(lines): if MoFile(line): print(a) lines.insert(3, "hello") f.close() # ghi lại dữ liệu with open(a, "w") as f: for i in lines: f.write(i) f.close()
Giải thích hàm SuaFile
def SuaFile(a): global dir_list # đọc file ở đường dẫn with open(a, "r") as f: lines = f.readlines() # kiểm tra for index, line in enumerate(lines): if MoFile(line): print(a) lines.insert(index, "ở đây có nè") f.close()
Nhiệm vụ của đoạn code này là mở file sau đó tạo một danh sách gồm các dòng của file theo đường dẫn path
được truyền vào. Hàm enumerate()
sé trả về hai đối tượng:
- index: là thứ tự của mỗi phần tử của danh sách
- line: là phần từ đó.
Ở điều kiện if
sẽ kiểm tra giá trị mà hàm MoFile()
trả về, nếu là True
thì hàm insert()
sẽ thêm “ở đây có nè” vào vị trí index
, còn Flase
thì sẽ bỏ qua
with open(a, "w") as f: for i in lines: f.write(i) f.close()
Đoạn code này sẽ có nhiệm vụ là viết lại các phần tử trong danh sách sau khi đã thêm ở trên vào.
def MoFile(line): lin = [] # Mở file ở chế độ đọc và thêm mỗi dòng vào một list with open("File.txt", "r") as f: lin = f.readlines() # so sánh các dòng ở file tìm được với mỗi dòng ở file tìm được for l in lin: if l.strip() == line.strip(): return True return False
Tương tự như ở trên thì hàm này cũng mở file.txt và thêm các dòng của file đó vào danh sách lin
. Hàm strip()
sẽ bỏ qua các kí tự trông ở trước và sau mỗi dòng và so sánh mỗi phần tử trong lin
với line
được truyền vào, nếu giống nhau thì sẽ trả về True
, còn sai thì trả về False
.
CheckFile(path)
Cuối cùng là gọi hàm CheckFile() và gửi vào đó đường dẫn
Thử chạy chương trình xem nào.
Ồ, nó đã tìm thấy file có dữ liệu là 456 và in ra màn hình rồi nè
Thử đi theo đường dẫn và mở file đó lên xem
Nó cũng đã ghi dòng chứ hello vào sau dòng 456 rồi nè.
Vậy là chương trình của chúng ta đã chạy rồi, hi vọng các bạn có thể thông qua bài viết có thể hiểu hơn ứng dụng của module os.
Hãy tham gia group lập trình không khó để cùng thảo luận về các vấn đề về lập trình.
Hẹn các bạn vào các bài học sau!!!
Để lại một bình luận