Cách trích xuất các phần cụ thể của tệp văn bản bằng Python – tệp văn bản xuất python

Hướng dẫn và ví dụ với hướng dẫn từng bước để trích xuất văn bản từ tệp bằng Python.

Bạn đang xem : tệp văn bản xuất python

Cách trích xuất các phần cụ thể của tệp văn bản bằng Python

Trích xuất văn bản từ tệp là tác vụ phổ biến trong kịch bản lập trình , và Python giúp việc này trở nên dễ dàng. Trong hướng dẫn này, chúng ta sẽ thảo luận về một số cách đơn giản để trích xuất văn bản từ tệp bằng ngôn ngữ lập trình Python 3.

Đảm bảo rằng bạn đang sử dụng Python 3

Trong hướng dẫn này, chúng tôi sẽ sử dụng phiên bản Python 3. Hầu hết các hệ thống đều được cài đặt sẵn Python 2.7. Trong khi Python 2.7 được sử dụng trong mã kế thừa, Python 3 là hiện tại và tương lai của ngôn ngữ Python. Trừ khi bạn có lý do cụ thể để viết hoặc hỗ trợ Python 2, chúng tôi khuyên bạn nên làm việc bằng Python 3.

Đối với Microsoft Windows, Python 3 có thể được tải xuống từ trang web chính thức của Python . Khi cài đặt, hãy đảm bảo rằng cả hai tùy chọn “Cài đặt trình khởi chạy cho tất cả người dùng” và “Thêm Python vào PATH” đều được chọn, như thể hiện trong hình ảnh bên dưới.

Trên Linux, bạn có thể cài đặt Python 3 bằng trình quản lý gói của mình. Ví dụ: trên Debian hoặc Ubuntu , bạn có thể cài đặt nó bằng lệnh sau:

 sudo apt-get update & amp; & amp; sudo apt-get install python3 

Đối với macOS , trình cài đặt Python 3 có thể được tải xuống từ python.org, như được liên kết ở trên. Nếu bạn đang sử dụng trình quản lý gói Homebrew, nó cũng có thể được cài đặt bằng cách mở cửa sổ dòng lệnh ( Ứng dụng Tiện ích ) và chạy lệnh này:

 pha cài đặt python3 

Chạy Python

Trên Linux và macOS, lệnh chạy trình thông dịch Python 3 là python3 . Trên Windows, nếu bạn đã cài đặt trình khởi chạy, lệnh sẽ là py . Các lệnh trên trang này sử dụng python3 ; nếu bạn đang sử dụng Windows, hãy thay thế py cho python3 trong tất cả các lệnh.

Chạy Python mà không có tùy chọn sẽ khởi động trình thông dịch tương tác. Để biết thêm thông tin về cách sử dụng trình thông dịch, hãy xem Tổng quan về Python: sử dụng trình thông dịch Python . Nếu bạn vô tình nhập trình thông dịch, bạn có thể thoát khỏi trình thông dịch bằng lệnh exit () hoặc thoát () .

Chạy Python với tên tệp sẽ diễn giải chương trình python đó. Ví dụ:

 python3 program.py 

… chạy chương trình có trong tệp program.py .

Được rồi, làm cách nào chúng ta có thể sử dụng Python để trích xuất văn bản từ tệp văn bản?

Đọc dữ liệu từ tệp văn bản

Trước tiên, hãy đọc một tệp văn bản. Giả sử chúng tôi đang làm việc với một tệp có tên lorem.txt , chứa các dòng từ văn bản mẫu của Lorem Ipsum .

 Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Nunc fringilla arcu congue metus aliquam mollis.
Mauris. Maecenas ngồi amet pretium Tellus.
Quisque tại dignissim lacus. 

Lưu ý

Trong tất cả các ví dụ tiếp theo, chúng tôi làm việc với bốn dòng văn bản có trong tệp này. Sao chép dán văn bản tiếng Latinh ở trên vào tệp văn bản và lưu dưới dạng lorem.txt , vì vậy bạn có thể chạy mã mẫu bằng cách sử dụng tệp này tệp làm đầu vào.

Chương trình Python có thể đọc tệp văn bản bằng cách sử dụng hàm open () được tích hợp sẵn. Ví dụ: chương trình Python 3 bên dưới mở lorem.txt để đọc ở chế độ văn bản, đọc nội dung vào biến chuỗi có tên nội dung , đóng và in dữ liệu.

 myfile = open ("lorem.txt", "rt") # mở lorem.txt để đọc văn bản
content = myfile.read () # đọc toàn bộ tệp thành chuỗi
myfile.close () # đóng tệp
print (nội dung) # in nội dung chuỗi 

Ở đây, myfile là tên mà chúng tôi đặt cho đối tượng tệp của mình.

Tham số “ rt ” trong hàm open () có nghĩa là “chúng tôi đang mở tệp này thành r ead t dữ liệu mở rộng “

dấu thăng (“ # “) có nghĩa là mọi thứ trên dòng đó là nhận xét và nó bị bỏ qua bởi trình thông dịch Python.

Nếu bạn lưu chương trình này trong một tệp có tên là read.py , bạn có thể chạy chương trình bằng lệnh sau.

 python3 read.py 

Lệnh trên xuất ra nội dung của lorem.txt :

 Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Nunc fringilla arcu congue metus aliquam mollis.
Mauris. Maecenas ngồi amet pretium Tellus.
Quisque tại dignissim lacus. 

Sử dụng “with open”

Điều quan trọng là phải đóng các tệp đang mở của bạn càng sớm càng tốt: mở tệp, thực hiện thao tác của bạn và đóng nó. Đừng để nó mở trong thời gian dài.

Khi bạn đang làm việc với tệp, bạn nên sử dụng câu lệnh ghép với open … as . Đó là cách sạch sẽ nhất để mở tệp, thao tác trên tệp và đóng tệp, tất cả chỉ trong một khối mã dễ đọc. Tệp tự động được đóng khi khối mã hoàn tất.

Sử dụng với mở dưới dạng , chúng ta có thể viết lại chương trình của mình để trông giống như sau:

 với open ('lorem.txt', 'rt') là myfile: # Mở lorem.txt để đọc văn bản
    content = myfile.read () # Đọc toàn bộ tệp thành một chuỗi
print (nội dung) # In chuỗi 

Lưu ý

Thụt lề rất quan trọng trong Python. Các chương trình Python sử dụng khoảng trắng ở đầu dòng để xác định phạm vi, chẳng hạn như một khối mã. Chúng tôi khuyên bạn nên sử dụng bốn dấu cách cho mỗi mức thụt lề và bạn nên sử dụng dấu cách thay vì tab. Trong các ví dụ sau, hãy đảm bảo mã của bạn được thụt lề chính xác như được trình bày ở đây.

Ví dụ

Lưu chương trình dưới dạng read.py và thực thi nó:

 python3 read.py 

Đầu ra:

 Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Nunc fringilla arcu congue metus aliquam mollis.
Mauris. Maecenas ngồi amet pretium Tellus.
Quisque tại dignissim lacus. 

Đọc từng dòng một tệp văn bản

Trong các ví dụ cho đến nay, chúng tôi đã đọc toàn bộ tệp cùng một lúc. Đọc một tệp đầy đủ không phải là vấn đề lớn đối với các tệp nhỏ, nhưng nói chung, đó không phải là một ý tưởng tuyệt vời. Thứ nhất, nếu tệp của bạn lớn hơn dung lượng bộ nhớ khả dụng, bạn sẽ gặp lỗi.

Trong hầu hết mọi trường hợp, tốt hơn hết bạn nên đọc một tệp văn bản từng dòng một.

Trong Python, đối tượng tệp là một trình lặp. trình lặp là một loại đối tượng Python hoạt động theo những cách nhất định khi được thao tác lặp lại. Ví dụ: bạn có thể sử dụng for loop để thao tác lặp lại trên một đối tượng tệp và mỗi lần thực hiện cùng một thao tác, bạn sẽ nhận được một kết quả khác hoặc “tiếp theo”.

Ví dụ

Đối với tệp văn bản, đối tượng tệp lặp lại một dòng văn bản tại một thời điểm. Nó coi một dòng văn bản là “đơn vị” dữ liệu, vì vậy chúng tôi có thể sử dụng câu lệnh lặp for … in để lặp lại từng dòng một:

 với open ('lorem.txt', 'rt') là myfile: # Mở lorem.txt để đọc
    cho myline trong myfile: # Đối với mỗi dòng, đọc thành một chuỗi,
        print (myline) # và in chuỗi. 

Đầu ra:

 Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Nunc fringilla arcu congue metus aliquam mollis.

Mauris. Maecenas ngồi amet pretium Tellus.

Quisque tại dignissim lacus. 

Lưu ý rằng chúng tôi sẽ nhận được thêm ngắt dòng (“newline”) sau mỗi dòng. Đó là bởi vì hai dòng mới đang được in. Dòng đầu tiên là dòng mới ở cuối mỗi dòng của tệp văn bản của chúng tôi. Dòng mới thứ hai xảy ra bởi vì theo mặc định, print () thêm một dấu ngắt dòng vào cuối bất kỳ thứ gì bạn yêu cầu in.

Hãy lưu trữ các dòng văn bản của chúng ta trong một biến – cụ thể là một biến – để chúng ta có thể xem xét kỹ hơn.

Xem Thêm  Học HTML và CSS - học xhtml và css

Lưu trữ dữ liệu văn bản trong một biến

Trong Python, danh sách tương tự, nhưng không giống với mảng trong C hoặc Java . Danh sách Python chứa dữ liệu đã được lập chỉ mục , có độ dài và kiểu khác nhau.

Ví dụ

 mylines = [] # Khai báo danh sách trống có tên mylines.
với open ('lorem.txt', 'rt') là myfile: # Mở lorem.txt để đọc dữ liệu văn bản.
    cho myline trong myfile: # Đối với mỗi dòng, được lưu trữ dưới dạng myline,
        mylines.append (myline) # thêm nội dung của nó vào mylines.
print (mylines) # In danh sách. 

Đầu ra của chương trình này hơi khác một chút. Thay vì in danh sách, chương trình này in danh sách của chúng tôi, trông giống như sau:

Đầu ra:

 ['Lorem ipsum dolor sit amet, consectetur adipiscing elit. \ n', 'Never fringe bow congue metus aliquam mollis. \ n', 'Mauris mort maximus purus. Maecenas có một điều quý giá. \ N ',' Quisque at dignissim lacus. \ N '] 

Ở đây chúng ta thấy nội dung thô của danh sách. Ở dạng đối tượng thô của nó, một danh sách được biểu thị dưới dạng danh sách được phân cách bằng dấu phẩy . Ở đây, mỗi phần tử được biểu thị dưới dạng một chuỗi và mỗi dòng mới được biểu thị dưới dạng chuỗi ký tự thoát , \ n .

Giống như mảng C hoặc Java, các phần tử danh sách được truy cập bằng cách chỉ định số chỉ mục sau tên biến, trong dấu ngoặc vuông . Số chỉ mục bắt đầu từ 0 – nói cách khác, phần tử thứ của danh sách có chỉ số số -1.

Lưu ý

Nếu bạn đang tự hỏi tại sao các số chỉ mục bắt đầu bằng 0 thay vì một, thì bạn không đơn độc. Các nhà khoa học máy tính đã tranh luận về tính hữu dụng của các hệ thống đánh số dựa trên số 0 trong quá khứ. Vào năm 1982, Edsger Dijkstra đã đưa ra ý kiến ​​của mình về chủ đề này, giải thích tại sao đánh số dựa trên số 0 là cách tốt nhất để lập chỉ mục dữ liệu trong khoa học máy tính. Bạn có thể tự đọc bản ghi nhớ – anh ấy đưa ra lập luận thuyết phục

Ví dụ

Phần tử đầu tiên của dòng có thể được in bằng cách chỉ định số chỉ mục 0 , được đặt trong dấu ngoặc sau tên của danh sách:

 print (mylines [0]) 

Đầu ra:

 Lorem Ipsum Pain Sit Amet, Consectetur Adipiscing Elite. Không bao giờ có rìa cung congue metus aliquam mollis. 

Ví dụ

Hoặc dòng thứ ba, bằng cách chỉ định chỉ mục số 2:

 print (mylines [2]) 

Đầu ra:

 Lacus nhanh chóng và trang nghiêm. 

Nhưng nếu chúng tôi cố gắng truy cập vào một chỉ mục không có giá trị, chúng tôi sẽ gặp lỗi:

Ví dụ

 print (mylines [3]) 

Đầu ra:

 Traceback (lần gọi gần đây nhất):
Tệp & lt; tên tệp & gt ;, dòng & lt; số dòng & gt ;, trong & lt; mô-đun & gt;
in (mylines [3])
IndexError: danh sách chỉ mục nằm ngoài phạm vi 

Ví dụ

Đối tượng danh sách là một trình lặp, vì vậy, để in mọi phần tử của danh sách, chúng ta có thể lặp lại nó bằng for ... in :

 mylines = [] # Khai báo danh sách trống
với open ('lorem. txt', 'rt') là myfile: # Mở lorem. txt để đọc văn bản
    cho dòng trong myfile: # Đối với mỗi dòng văn bản,
        mylines. append (line) # thêm dòng đó vào danh sách
    cho phần tử trong mylines: # Đối với mỗi phần tử trong danh sách,
        print (phần tử) # in nó. 

Đầu ra:

 Lorem Ipsum Pain Sit Amet, Consectetur Adipiscing Elite.

Không bao giờ rìa cung congo metus aliquam mollis.

Mauritius chưa tinh khiết tối đa. Maecenas có một lời kể quý giá.

Nhanh chóng và thiếu trang nghiêm. 

Nhưng chúng tôi vẫn nhận được thêm các dòng mới. Mỗi dòng trong tệp văn bản của chúng tôi kết thúc bằng một ký tự dòng mới (' \ n '), đang được in. Ngoài ra, sau khi in mỗi dòng, print () sẽ thêm một dòng mới của riêng nó, trừ khi bạn yêu cầu nó làm theo cách khác.

Chúng tôi có thể thay đổi hành vi mặc định này bằng cách chỉ định tham số end trong lệnh gọi print () của chúng tôi: >

 print (element, end = '') 

Bằng cách đặt end thành một chuỗi trống (hai dấu nháy đơn, không có dấu cách), chúng tôi yêu cầu print () in ở cuối một dòng, thay vì một ký tự dòng mới

Ví dụ

Chương trình đã sửa đổi của chúng tôi trông giống như sau:

 mylines = [] # Khai báo danh sách trống
với open ('lorem. txt', 'rt') là myfile: # Mở tệp lorem. txt
    cho dòng trong myfile: # Đối với mỗi dòng văn bản,
        mylines. append (line) # thêm dòng đó vào danh sách
    cho phần tử trong mylines: # Đối với mỗi phần tử trong danh sách,
        print (element , end = '' ) # in nó mà không có thêm dòng mới. 

Đầu ra:

 Lorem Ipsum Pain Sit Amet, Consectetur Adipiscing Elite.
Không bao giờ rìa cung congo metus aliquam mollis.
Mauritius chưa tinh khiết tối đa. Maecenas có một lời kể quý giá.
Nhanh chóng và thiếu trang nghiêm. 

Các dòng mới bạn thấy ở đây thực sự có trong tệp; chúng là một ký tự đặc biệt (' \ n ') ở cuối mỗi dòng. Chúng tôi muốn loại bỏ những thứ này để không phải lo lắng về chúng trong khi xử lý tệp.

Cách tách dòng mới

Để loại bỏ hoàn toàn các dòng mới, chúng ta có thể loại bỏ chúng. Để dải một chuỗi là loại bỏ một hoặc nhiều ký tự, thường là khoảng trắng, từ đầu hoặc cuối chuỗi.

Mẹo

Quá trình này đôi khi còn được gọi là "cắt tỉa".

Đối tượng chuỗi Python 3 có một phương thức được gọi là rstrip () , phương thức này tách các ký tự khỏi phía bên phải của một chuỗi. Ngôn ngữ tiếng Anh đọc từ trái sang phải, vì vậy việc tách từ bên phải sẽ xóa các ký tự ở cuối.

Nếu biến được đặt tên là mystring , chúng ta có thể tách bên phải của nó bằng mystring.rstrip () , đây là một chuỗi ký tự để tách . Ví dụ: "123abc" .rstrip ("bc") trả về 123a .

Mẹo

Khi bạn biểu diễn một chuỗi trong chương trình của mình với nội dung theo nghĩa đen của nó, nó được gọi là chuỗi ký tự . Trong Python (như trong hầu hết các ngôn ngữ lập trình), các ký tự chuỗi luôn luôn - được đặt ở hai bên bởi dấu nháy đơn (') hoặc kép (") . Trong Python, dấu nháy đơn và dấu ngoặc kép là tương đương nhau; bạn có thể sử dụng cái này hoặc cái kia, miễn là chúng khớp ở cả hai đầu của chuỗi. Theo truyền thống, biểu thị một chuỗi mà con người có thể đọc được (chẳng hạn như Xin chào ) trong dấu ngoặc kép ( "Xin chào" ). Nếu bạn đại diện cho một ký tự (chẳng hạn như b ) hoặc một ký tự đặc biệt, chẳng hạn như ký tự dòng mới ( \ n ), thì đó là truyền thống để sử dụng dấu ngoặc kép ( 'b' , '\ n' ). Để biết thêm thông tin về cách sử dụng chuỗi trong Python, bạn có thể đọc tài liệu của chuỗi bằng Python .

Câu lệnh .rstrip ('\ n') sẽ loại bỏ một ký tự dòng mới từ phía bên phải của. Phiên bản sau của chương trình của chúng tôi loại bỏ các dòng mới khi mỗi dòng được đọc từ tệp văn bản:

 mylines = [] # Khai báo danh sách trống.
với open ('lorem.txt', 'rt') là myfile: # Mở lorem.txt để đọc văn bản.
    cho myline trong myfile: # Đối với mỗi dòng trong tệp,
        mylines.append (myline.rstrip ('\ n')) # dải dòng mới và thêm vào danh sách.
cho phần tử trong mylines: # Đối với mỗi phần tử trong danh sách,
    print (phần tử) # in nó. 

Văn bản hiện được lưu trữ trong một biến danh sách, do đó, các dòng riêng lẻ có thể được truy cập bằng số chỉ mục. Các dòng mới đã bị loại bỏ, vì vậy chúng tôi không phải lo lắng về chúng. Chúng tôi luôn có thể đặt chúng trở lại sau nếu chúng tôi tạo lại tệp và ghi nó vào đĩa.

Bây giờ, hãy tìm kiếm các dòng trong danh sách để tìm một chuỗi con cụ thể.

Tìm kiếm văn bản cho một chuỗi con

Giả sử chúng ta muốn xác định vị trí mỗi lần xuất hiện của một cụm từ nhất định hoặc thậm chí một chữ cái. Ví dụ, có thể chúng ta cần biết vị trí của mọi chữ "e". Chúng tôi có thể thực hiện điều này bằng cách sử dụng phương thức find () của chuỗi.

Danh sách lưu trữ từng dòng văn bản của chúng ta dưới dạng một đối tượng chuỗi. Tất cả các đối tượng chuỗi đều có một phương thức, find () , định vị lần xuất hiện đầu tiên của chuỗi con trong chuỗi.

Hãy sử dụng phương thức find () để tìm kiếm chữ cái "e" trong dòng đầu tiên của tệp văn bản của chúng ta, được lưu trữ trong danh sách mylines < / b>. Phần tử đầu tiên của mylines là một đối tượng chuỗi chứa dòng đầu tiên của tệp văn bản. Đối tượng chuỗi này có phương thức find () .

Trong dấu ngoặc đơn của find () , chúng tôi chỉ định các tham số. Tham số bắt buộc đầu tiên và duy nhất là chuỗi để tìm kiếm, "e" . Câu lệnh mylines [0] .find ("e") yêu cầu trình thông dịch tìm kiếm tiếp, bắt đầu từ đầu chuỗi, mỗi ký tự một, cho đến khi tìm thấy ký tự "e". Khi nó tìm thấy một, nó sẽ ngừng tìm kiếm và trả về số chỉ mục nơi có chữ "e". Nếu đến cuối chuỗi, nó sẽ trả về -1 để cho biết không tìm thấy gì.

Ví dụ

 print (mylines [0] .find ("e")) 

Đầu ra:

3

Giá trị trả về "3" cho chúng ta biết rằng ký tự "e" là ký tự thứ tư, "e" trong "Lorem". (Hãy nhớ rằng chỉ mục dựa trên 0: chỉ số 0 là ký tự đầu tiên, 1 là ký tự thứ hai, v.v.)

Phương thức find () nhận hai tham số tùy chọn, bổ sung: một chỉ mục và một chỉ mục, cho biết vị trí trong chuỗi mà tìm kiếm sẽ bắt đầu và kết thúc. Ví dụ: .find ("abc", 10, 20) tìm kiếm chuỗi con "abc", nhưng chỉ từ ký tự thứ 11 đến ký tự thứ 21. Nếu không được chỉ định, find () bắt đầu ở chỉ mục và dừng ở cuối chuỗi.

Ví dụ

Ví dụ: câu lệnh sau tìm kiếm "e" trong mylines [0] , bắt đầu bằng ký tự thứ năm.

 print (mylines [0] .find ("e", 4)) 

Đầu ra:

 24 

Nói cách khác, bắt đầu từ ký tự thứ 5 trong dòng [0], chữ "e" đầu tiên nằm ở chỉ mục 24 (chữ "e" trong "nghĩa vụ").

Ví dụ

Để bắt đầu tìm kiếm ở chỉ mục 10 và dừng lại ở chỉ mục 30:

 print (mylines [1] .find ("e", 10, 30)) 

Đầu ra:

 28 

(Chữ "e" đầu tiên trong "Maecenas").

Nếu find () không tìm thấy chuỗi con trong phạm vi tìm kiếm, nó sẽ trả về số -1 , cho biết lỗi:

 print (mylines [0] .find ("e", 25, 30)) 

Đầu ra:

- 1

Không có lần xuất hiện "e" nào giữa các chỉ số 25 và 30.

Tìm tất cả các lần xuất hiện của một chuỗi con

Nhưng nếu chúng ta muốn xác định vị trí xuất hiện của một chuỗi con, không chỉ chuỗi đầu tiên chúng ta gặp phải thì sao? Chúng tôi có thể lặp lại qua chuỗi, bắt đầu từ chỉ mục của kết quả khớp trước đó.

Trong ví dụ này, chúng tôi sẽ sử dụng vòng lặp while để liên tục tìm chữ cái "e". Khi một sự xuất hiện được tìm thấy, chúng tôi gọi lại tìm , bắt đầu từ một vị trí mới trong chuỗi. Cụ thể, vị trí của lần xuất hiện cuối cùng, cộng với độ dài của chuỗi (vì vậy chúng ta có thể di chuyển về phía trước qua lần cuối cùng). Khi find trả về -1 hoặc chỉ mục bắt đầu vượt quá độ dài của chuỗi, chúng tôi dừng lại.

 # Tạo mảng dòng từ tệp, tách dòng mới

mylines = [] # Khai báo danh sách trống.
với open ('lorem.txt', 'rt') là myfile: # Mở lorem.txt để đọc văn bản.
    cho myline trong myfile: # Đối với mỗi dòng trong tệp,
        mylines.append (myline.rstrip ('\ n')) # dải dòng mới và thêm vào danh sách.

# Định vị và in tất cả các lần xuất hiện của chữ "e"

substr = "e" # chuỗi con để tìm kiếm.
cho dòng trong mylines: # chuỗi được tìm kiếm
  index = 0 # chỉ mục hiện tại: ký tự được so sánh
  trước = 0 # chỉ mục trước: ký tự cuối cùng được so sánh
  trong khi chỉ mục & lt; len (line): # Trong khi chỉ mục không vượt quá độ dài chuỗi,
    index = line.find (substr, index) # đặt chỉ mục thành lần xuất hiện đầu tiên của "e"
    if index == -1: # Nếu không tìm thấy gì,
      break # thoát khỏi vòng lặp while.
    print ("" * (chỉ mục - trước) + "e", end = '') # dấu cách in từ trước
                                               # khớp, sau đó là chuỗi con.
    pres = index + len (substr) # nhớ vị trí này cho vòng lặp tiếp theo.
    index + = len (substr) # tăng chỉ số bằng độ dài của substr.
                              # (Lặp lại cho đến khi chỉ mục & gt; độ dài dòng)
  print ('\ n' + dòng); # In chuỗi gốc dưới chữ e

Đầu ra:

 e e e e e e
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
                         e e
Nunc fringilla arcu congue metus aliquam mollis.
        e e e e e e
Mauris ne maximus purus. Maecenas ngồi amet pretium Tellus.
      e
Quisque tại dignissim lacus. 

Kết hợp các biểu thức chính quy

Đối với các tìm kiếm phức tạp, hãy sử dụng biểu thức chính quy .

Mô-đun biểu thức chính quy trong Python được gọi là re . Để sử dụng nó trong chương trình của bạn, hãy nhập mô-đun trước khi bạn sử dụng nó:

 nhập lại 

Mô-đun re triển khai các biểu thức chính quy bằng cách biên dịch một mẫu tìm kiếm thành một đối tượng mẫu. Các phương thức của đối tượng này sau đó có thể được sử dụng để thực hiện các hoạt động đối sánh.

Ví dụ: giả sử bạn muốn tìm kiếm bất kỳ từ nào trong tài liệu của mình bắt đầu bằng chữ cái d và kết thúc bằng chữ cái r . Chúng tôi có thể thực hiện điều này bằng cách sử dụng biểu thức chính quy " \ bd \ w * r \ b ". Điều này có nghĩa là gì?

chuỗi ký tự
Ý nghĩa

\ b
Ranh giới từ khớp với một chuỗi trống (bất kỳ thứ gì, không bao gồm gì cả), nhưng chỉ khi nó xuất hiện trước hoặc sau một ký tự không phải từ. "Các ký tự trong Word" là các chữ số từ 0 đến 9, chữ thường và chữ hoa hoặc dấu gạch dưới (" _ ").

d
Chữ thường d .

\ w *
\ w đại diện cho bất kỳ ký tự từ nào và * là một bộ định lượng có nghĩa là "không hoặc nhiều ký tự trước đó." Vì vậy, \ w * sẽ khớp với không hoặc nhiều ký tự từ.

r
Chữ thường r .

\ b
Ranh giới từ.

Vì vậy, biểu thức chính quy này sẽ khớp với bất kỳ chuỗi nào có thể được mô tả là "ranh giới từ, sau đó là chữ thường 'd', không hoặc nhiều ký tự từ, sau đó là chữ thường 'r', sau đó là một từ ranh giới. " Các chuỗi được mô tả theo cách này bao gồm các từ kẻ hủy diệt , dour , và bác sĩ , và chữ viết tắt dr .

Để sử dụng biểu thức chính quy này trong các thao tác tìm kiếm Python, trước tiên chúng ta biên dịch nó thành một đối tượng mẫu. Ví dụ: câu lệnh Python sau đây tạo một đối tượng mẫu có tên là mẫu mà chúng ta có thể sử dụng để thực hiện tìm kiếm bằng biểu thức chính quy đó.

 pattern = re.compile (r "\ bd \ w * r \ b") 

Lưu ý

Chữ cái r trước chuỗi của chúng tôi trong câu lệnh ở trên là quan trọng. Nó yêu cầu Python diễn giải chuỗi của chúng tôi dưới dạng chuỗi thô, chính xác như chúng tôi đã nhập. Nếu chúng tôi không đặt tiền tố chuỗi bằng r , Python sẽ diễn giải chuỗi thoát chẳng hạn như \ b theo những cách khác. Bất cứ khi nào bạn cần Python để diễn giải các chuỗi của mình theo nghĩa đen, hãy chỉ định nó là một chuỗi thô bằng cách thêm tiền tố r .

Bây giờ chúng ta có thể sử dụng các phương thức của đối tượng mẫu, chẳng hạn như search () , để tìm kiếm một chuỗi cho biểu thức chính quy đã biên dịch, tìm kiếm một kết quả phù hợp. Nếu nó tìm thấy một, nó sẽ trả về một kết quả đặc biệt được gọi là đối tượng khớp. Nếu không, nó trả về Không có , một hằng được tích hợp sẵn trong Python được sử dụng giống như giá trị boolean "false".

 nhập lại
str = "Chào buổi sáng, bác sĩ."
pat = re.compile (r "\ bd \ w * r \ b") # biên dịch regex "\ bd \ w * r \ b" thành một đối tượng mẫu
if pat.search (str)! = None: # Tìm kiếm mẫu. Nếu được tìm thấy,
    print ("Đã tìm thấy.") 

Đầu ra:

 Đã tìm thấy. 

Để thực hiện tìm kiếm không phân biệt chữ hoa chữ thường, bạn có thể chỉ định hằng số đặc biệt re.IGNORECASE trong bước biên dịch:

 nhập lại
str = "Xin chào, DoctoR."
pat = re.compile (r "\ bd \ w * r \ b", re.IGNORECASE) # chữ hoa và chữ thường sẽ khớp
if pat.search (str)! = Không có:
    print ("Đã tìm thấy.") 

Đầu ra:

 Đã tìm thấy. 

Kết hợp tất cả lại với nhau

Vì vậy, bây giờ chúng ta biết cách mở một tệp, đọc các dòng trong danh sách và xác định vị trí một chuỗi con trong bất kỳ phần tử danh sách nhất định nào. Hãy sử dụng kiến ​​thức này để xây dựng một số chương trình mẫu.

In tất cả các dòng chứa chuỗi con

Chương trình bên dưới đọc tệp nhật ký từng dòng. Nếu dòng chứa từ "error", nó sẽ được thêm vào danh sách được gọi là lỗi . Nếu không, nó được bỏ qua. Phương thức chuỗi low () chuyển đổi tất cả các chuỗi thành chữ thường cho mục đích so sánh, giúp tìm kiếm không phân biệt chữ hoa chữ thường mà không làm thay đổi các chuỗi ban đầu.

Lưu ý rằng phương thức find () được gọi trực tiếp trên kết quả của phương thức low () ; cái này được gọi là. Ngoài ra, hãy lưu ý rằng trong câu lệnh print () , chúng tôi xây dựng một chuỗi đầu ra bằng cách nối một số chuỗi với toán tử + .

 error = [] # Danh sách nơi chúng tôi sẽ lưu trữ kết quả.
linenum = 0
substr = "error" .lower () # Chuỗi con cần tìm.
với open ('logfile.txt', 'rt') là myfile:
    cho dòng trong myfile:
        linenum + = 1
        if line.lower (). find (substr)! = -1: # nếu đối sánh không phân biệt chữ hoa chữ thường,
            error.append ("Line" + str (linenum) + ":" + line.rstrip ('\ n'))
vì lỗi sai:
    in (err) 

Đầu vào (được lưu trữ trong logfile.txt):

 Đây là dòng 1
Đây là dòng 2
Dòng 3 có lỗi!
Đây là dòng 4
Dòng 5 cũng có lỗi! 

Đầu ra:

 Dòng 3: Dòng 3 bị lỗi!
Dòng 5: Dòng 5 cũng có lỗi! 

Trích xuất tất cả các dòng có chứa chuỗi con, sử dụng regex

Chương trình dưới đây tương tự như chương trình trên, nhưng sử dụng mô-đun biểu thức chính quy re . Các lỗi và số dòng được lưu trữ dưới dạng bộ giá trị , ví dụ: (linenum, dòng). Bộ giá trị được tạo bởi dấu ngoặc đơn bao quanh bổ sung trong câu lệnh error.append () . Các phần tử của bộ tuple được tham chiếu tương tự như một danh sách, với chỉ mục dựa trên 0 trong dấu ngoặc. Như được xây dựng ở đây, err [0] là dòng lanh và err [1] là dòng liên quan chứa lỗi.

 nhập lại
lỗi = []
linenum = 0
pattern = re.compile ("error", re.IGNORECASE) # Biên dịch regex không phân biệt chữ hoa chữ thường
với open ('logfile.txt', 'rt') là myfile:
    cho dòng trong myfile:
        linenum + = 1
        if pattern.search (line)! = None: # Nếu tìm thấy kết quả phù hợp
            error.append ((linenum, line.rstrip ('\ n')))
đối với lỗi sai: # Lặp lại danh sách các bộ giá trị
    print ("Dòng" + str (err [0]) + ":" + err [1]) 

Đầu ra:

 Dòng 6: Ngày 28 tháng 3 09:10:37 Lỗi: không thể kết nối với máy chủ. Kết nối bị từ chối.
Dòng 10: Ngày 28 tháng 3 10:28:15 Lỗi hạt nhân: Vị trí được chỉ định không được gắn kết.
Dòng 14: Ngày 28 tháng 3 11:06:30 LỖI: usb 1-1: không thể đặt cấu hình, đang thoát. 

Trích xuất tất cả các dòng có chứa số điện thoại

Chương trình bên dưới in bất kỳ dòng nào của tệp văn bản, info.txt , chứa số điện thoại quốc tế hoặc Hoa Kỳ. Nó hoàn thành điều này với biểu thức chính quy " (\ + \ d {1,2})? [\ S .-]? \ D {3} [\ s .-]? \ D {4} ". Regex này khớp với các ký hiệu số điện thoại sau:

  • 123-456-7890
  • (123) 456-7890
  • 123 456 7890
  • 123.456.7890
  • +91 (123) 456-7890
 nhập lại
lỗi = []
linenum = 0
pattern = re.compile (r "(\ + \ d {1,2})? [\ s .-]? \ d {3} [\ s .-]? \ d {4}")
với open ('info.txt', 'rt') dưới dạng myfile:
    cho dòng trong myfile:
        linenum + = 1
        if pattern.search (line)! = None: # Nếu tìm kiếm theo mẫu tìm thấy kết quả phù hợp,
            error.append ((linenum, line.rstrip ('\ n')))
vì lỗi sai:
    print ("Dòng", str (err [0]), ":" + err [1]) 

Đầu ra:

 Dòng 3: Số điện thoại của tôi là 731.215.8881.
Dòng 7: Bạn có thể liên hệ với ông Walters theo số (212) 558-3131.
Dòng 12: Người đại diện của anh ấy, Bà Kennedy, có thể liên hệ theo số +12 (123) 456-7890
Dòng 14: Cô ấy cũng có thể được liên hệ theo số (888) 312.8403, số máy lẻ 12. 

Tìm kiếm các từ trong từ điển

Chương trình bên dưới tìm kiếm từ điển bất kỳ từ nào bắt đầu bằng h và kết thúc bằng pe . Đối với đầu vào, nó sử dụng tệp từ điển có trong nhiều hệ thống Unix, / usr / share / dict / words .

 nhập lại
filename = "/ usr / share / dict / words"
pattern = re.compile (r "\ bh \ w * pe $", re.IGNORECASE)
với open (tên tệp, "rt") là myfile:
    cho dòng trong myfile:
        if pattern.search (line)! = Không có:
            print (line, end = '') 

Đầu ra:

 Hy vọng
heliotrope
mong
vòi rồng
lá số tử vi
cường điệu 


Xem thêm những thông tin liên quan đến chủ đề tệp văn bản xuất python

Lập trình Python cơ bản || Bài 8: Đọc Và Ghi File Trong Python || Học Và Giải Trí

  • Tác giả: Học Và Giải Trí
  • Ngày đăng: 2021-07-16
  • Đánh giá: 4 ⭐ ( 1785 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: HocVaGiaiTri
    - Hướng dẫn học Pyhton cơ bản. Bài 8: Đọc và ghi file trong Python
    - Fanpage: https://www.facebook.com/hoclaptrinh.scratch.python.c.coban/?ref=pages_you_manage
    - Đề thi tin học trẻ, HSG: https://tinhoctrekhongchuyen.blogspot.com/
    - Vui lòng đăng kí kênh giúp tôi. Cảm ơn

Chi tiết bài học 17.Xử lý tệp Python

  • Tác giả: vimentor.com
  • Đánh giá: 3 ⭐ ( 9942 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Vimentor chi tiết bài học Xử lý tệp Python: Tạo, mở, ghi tiếp, đọc, ghi

Xử lý file trong Python

  • Tác giả: howkteam.vn
  • Đánh giá: 4 ⭐ ( 5205 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Xử lý file trong Python

Làm việc với File trong Python

  • Tác giả: quantrimang.com
  • Đánh giá: 5 ⭐ ( 4691 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Trong bài viết này, Quantrimang sẽ cùng bạn tìm hiểu về các hoạt động của file trong Python. Cụ thể hơn là về cách mở file, đọc file, ghi tới file, đóng file cũng như các phương thức làm việc với tập tin mà bạn nên biết. Hãy cùng theo dõi.

Tìm hiểu và làm việc với File trong Python

  • Tác giả: t3h.edu.vn
  • Đánh giá: 5 ⭐ ( 1858 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Trong bài viết này, bạn sẽ tìm hiểu nơi có thể lưu trữ, truy xuất cũng như thao tác với các file như cách đọc file, ghi file, ... trong Python.

Thao tác với File trong Python

  • Tác giả: viblo.asia
  • Đánh giá: 4 ⭐ ( 2672 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Python cung cấp các chức năng cơ bản và phương thức cần thiết để thao tác các file. Bài viết này tôi xin giới thiệu những thao tác cơ bản nhất với file trong Python.

Trích xuất văn bản từ tệp HTML bằng Python

  • Tác giả: qastack.vn
  • Đánh giá: 5 ⭐ ( 3235 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: [Tìm thấy giải pháp!] html2text là một chương trình Python thực hiện công việc này khá tốt.

Xem thêm các bài viết khác thuộc chuyên mục: Kiến thức lập trình