Nhiều quá trình ghi cùng một tệp python

Trong bài học trước, chúng ta đã phân tích cú pháp các giá trị từ tệp đầu ra. Mặc dù bạn có thể đã thấy tiện ích của việc làm như vậy, nhưng bạn cũng có thể thắc mắc tại sao chúng tôi không chỉ tìm kiếm tệp và cắt và dán các giá trị mà chúng tôi muốn vào bảng tính. Nếu bạn chỉ có 1 hoặc 2 tệp, đây có thể là một điều rất hợp lý để làm. Nhưng nếu bạn có 100 tệp để phân tích thì sao?

Một trong những sức mạnh thực sự của việc viết chương trình để phân tích dữ liệu của bạn là bạn có thể dễ dàng phân tích 100 tệp như 1 tệp. Trong ví dụ này, chúng tôi sẽ phân tích các tệp đầu ra cho toàn bộ chuỗi các hợp chất rượu béo và phân tích giá trị năng lượng cho từng loại. Tất cả các tệp đầu ra đều được lưu trong một thư mục có tên là tệp bên ngoài mà lẽ ra bạn phải tải xuống trong phần thiết lập cho bài học này. Đảm bảo rằng thư mục nằm trong cùng thư mục với thư mục mà bạn đang viết và thực thi mã của mình

Để phân tích nhiều tệp, chúng tôi sẽ cần nhập thư viện python. Thư viện là một tập hợp các mô-đun chứa các chức năng. Các chức năng trong thư viện hoặc mô-đun thường liên quan đến nhau. Sử dụng các thư viện và trong Python giúp giảm số lượng mã bạn phải viết. Trong bài học trước, chúng tôi đã nhập

file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
5, đây là mô-đun xử lý đường dẫn tệp cho chúng tôi

Trong bài học này, chúng ta sẽ sử dụng thư viện

file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
6, thư viện này sẽ giúp chúng ta đọc nhiều tệp từ máy tính của chúng ta. Trong một thư viện có các mô-đun và hàm thực hiện một tác vụ tính toán cụ thể. Thông thường, một chức năng có một số loại đầu vào và đưa ra một đầu ra cụ thể. Để sử dụng một hàm có trong thư viện, bạn thường sử dụng ký hiệu dấu chấm đã giới thiệu ở bài trước. Nói chung

import library_name
output = library_name.funtion_name[input]

Chúng tôi sẽ nhập hai thư viện. Một là thư viện

file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
7 điều khiển các chức năng liên quan đến hệ điều hành máy tính của bạn. Chúng tôi đã sử dụng thư viện này trong bài học trước để xử lý filepath. Cái còn lại là thư viện
file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
6 chứa các chức năng giúp chúng ta phân tích nhiều tệp. Nếu chúng tôi định phân tích nhiều tệp, trước tiên chúng tôi cần chỉ định vị trí của các tệp đó

Tập thể dục

Bạn sẽ sử dụng mô-đun

file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
5 như thế nào để trỏ đến thư mục chứa các tệp bên ngoài của bạn?

Dung dịch

outfile_directory = os.path.join['data', 'outfiles']

Để lấy tất cả các tệp khớp với một mẫu cụ thể, chúng tôi sẽ sử dụng ký tự đại diện

data/outfiles/*.out
0

file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]

data/outfiles/*.out

Điều này xác định rằng chúng tôi muốn tìm kiếm tất cả các tệp trong một thư mục có tên là

data/outfiles/*.out
1 kết thúc bằng “. ngoài". * là ký tự đại diện khớp với bất kỳ ký tự nào

Tiếp theo, chúng ta sẽ sử dụng một hàm có tên là

file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
6 trong thư viện có tên là
file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
6. Có một chút khó hiểu vì hàm và thư viện có cùng tên, nhưng chúng ta sẽ xem các ví dụ khác mà trường hợp này không xảy ra sau. Đầu ra của hàm
file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
6 là danh sách tất cả các tên tệp phù hợp với mẫu được chỉ định trong đầu vào. Đầu vào là vị trí tệp

file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
4

file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
5

Điều này sẽ cung cấp cho chúng tôi một danh sách tất cả các tệp kết thúc bằng

data/outfiles/*.out
5 trong thư mục
data/outfiles/*.out
6. Bây giờ nếu chúng tôi muốn phân tích từng tệp chúng tôi vừa đọc, chúng tôi sẽ sử dụng vòng lặp
file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
4 để đi qua từng tệp

file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
9

import library_name
output = library_name.funtion_name[input]
0

Lưu ý rằng trong mã này, chúng tôi thực sự đã sử dụng hai vòng lặp

file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
4, một vòng lặp được lồng vào bên trong vòng lặp kia. Vòng lặp
file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
4 bên ngoài đếm trên tên tệp mà chúng ta đã đọc trước đó. Vòng lặp
file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
4 bên trong đếm trên dòng trong mỗi tệp, giống như chúng ta đã làm trong bài học phân tích tệp trước đây

Đầu ra mã của chúng tôi hiện đang tạo không hữu ích. Nó không cho chúng ta biết mỗi giá trị năng lượng đến từ tập tin nào

Chúng tôi muốn in tên của phân tử với năng lượng. Chúng ta có thể sử dụng

file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
41, đây là một chức năng khác trong
file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
5 để chỉ lấy tên của tệp

import library_name
output = library_name.funtion_name[input]
6

import library_name
output = library_name.funtion_name[input]
7

Tập thể dục

Bạn sẽ trích xuất tên phân tử từ ví dụ trên như thế nào?

Dung dịch

Bạn có thể sử dụng hàm

file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
43 đã giới thiệu ở bài trước, và chia tách ở phần ‘. ' tính cách

outfile_directory = os.path.join['data', 'outfiles']
0

Sử dụng giải pháp trên, chúng tôi có thể sửa đổi vòng lặp của mình để nó in tên tệp cùng với từng giá trị năng lượng

outfile_directory = os.path.join['data', 'outfiles']
1

outfile_directory = os.path.join['data', 'outfiles']
2

In ra một tập tin

Cuối cùng, có thể hữu ích khi in kết quả của chúng tôi trong một tệp mới, để chúng tôi có thể chia sẻ kết quả của mình với đồng nghiệp hoặc gửi e-mail cho cố vấn của chúng tôi. Giống như khi chúng ta đọc trong một tệp, bước đầu tiên để ghi đầu ra vào một tệp là mở tệp đó để ghi. Nói chung để mở một tệp để ghi bạn sử dụng cú pháp

outfile_directory = os.path.join['data', 'outfiles']
3

file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
44 có nghĩa là mở tệp để viết. Nếu bạn sử dụng
file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
45 có nghĩa là mở tệp để ghi và nếu tệp không tồn tại, hãy tạo nó. Bạn cũng có thể sử dụng
file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
46 để thêm vào tệp hiện có hoặc
file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
47. Sự khác biệt giữa
file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
45 và
file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
47 là
file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
45 sẽ ghi đè lên tệp nếu nó đã tồn tại, trong khi
file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
47 sẽ giữ nguyên những gì đã có và chỉ thêm văn bản bổ sung vào tệp

Python chỉ có thể ghi chuỗi vào tệp. Câu lệnh in hiện tại của chúng ta không phải là một chuỗi; . Để chuyển đổi những gì chúng ta có bây giờ thành một chuỗi, bạn đặt chữ F viết hoa trước dòng bạn muốn in và đặt nó trong dấu nháy đơn. Mỗi biến python được đặt trong dấu ngoặc nhọn. Sau đó, bạn có thể in dòng đó [như chúng ta đã làm trước đây] hoặc bạn có thể sử dụng lệnh

file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
52 để in nó ra một tệp

Để làm cho bản in gọn gàng hơn, chúng tôi sẽ tách tên tệp khỏi năng lượng bằng tab. Để chèn tab ta dùng ký tự đặc biệt

file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
53

outfile_directory = os.path.join['data', 'outfiles']
4

Sau khi bạn chạy lệnh này, hãy tìm trong thư mục mà bạn đã chạy mã của mình và tìm mục “energy. txt” tập tin. Mở nó trong trình soạn thảo văn bản và xem tệp

Trong dòng viết tệp, hãy chú ý đến

file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
54 ở cuối dòng. Đây là ký tự xuống dòng. Không có nó, văn bản trong cuộc sống của chúng ta sẽ chỉ nằm gọn trong một dòng. Ngoài ra, lệnh
file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
55 rất quan trọng. Hãy nghĩ về một chiếc máy tính như một người có trí nhớ rất tốt, nhưng viết rất chậm. Do đó, khi bạn yêu cầu máy tính viết một dòng, nó sẽ ghi nhớ những gì bạn muốn viết, nhưng nó không thực sự ghi tệp mới cho đến khi bạn nói với nó rằng bạn đã hoàn thành. Lệnh
file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
56 báo cho máy tính biết bạn đã viết xong các dòng và máy tính sẽ tiếp tục ghi tệp ngay bây giờ. Nếu bạn đang cố gắng ghi một tệp và tệp đó liên tục bị trống, có thể là do bạn quên đóng tệp

Lưu ý cuối cùng về định dạng chuỗi

Ký hiệu F’string’ mà bạn có thể sử dụng với lệnh in hoặc lệnh ghi cho phép bạn định dạng chuỗi theo nhiều cách. Bạn có thể bao gồm các từ khác hoặc cả câu. Ví dụ: chúng ta có thể thay đổi dòng ghi tệp thành

outfile_directory = os.path.join['data', 'outfiles']
5

trong đó bất cứ thứ gì trong dấu ngoặc nhọn là biến python và nó sẽ in giá trị của biến đó

Chuyển nhượng dự án

Đây là một bài tập dự án mà bạn có thể hoàn thành để kiểm tra kỹ năng của mình. Dự án này nên được sử dụng khi tài liệu này được sử dụng trong một hội thảo dài hoặc nếu bạn đang làm việc với tài liệu này một cách độc lập

Phân tích tệp bài tập về nhà

Trong tài liệu bài giảng có file tên là

file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
57. Đây là file đầu ra của chương trình mô phỏng động lực học phân tử Amber

Các bạn mở file ra xem sẽ thấy các phần như thế này

outfile_directory = os.path.join['data', 'outfiles']
6

Nhiệm vụ của bạn là phân tích tệp này và viết một tệp mới chứa danh sách > tổng năng lượng. Đặt tên cho tệp của bạn là

file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
58. Khi bạn mở nó, nó sẽ trông như thế này

outfile_directory = os.path.join['data', 'outfiles']
7

file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
59 chỉ ra rằng bạn sẽ có nhiều hàng hơn. Chúng tôi chỉ hiển thị 10 cái đầu tiên ở đây

Nếu bạn không chắc bắt đầu từ đâu với bài tập này, hãy xem phần gợi ý

gợi ý

Nó hữu ích khi bạn đang viết mã để chia nhỏ những gì bạn phải làm thành các bước. Nhìn chung, chúng tôi muốn lấy thông tin từ tệp. làm sao chúng ta làm việc đó bây giờ?

Nếu bạn nghĩ về các bước bạn sẽ cần để thực hiện bài tập này, bạn có thể nghĩ ra một danh sách giống như thế này, bạn có thể có một danh sách như thế này

  1. Mở tệp để đọc
  2. Đọc dữ liệu trong tệp
  3. Lặp qua các dòng trong tệp
  4. Nhận thông tin từ dòng chúng tôi quan tâm
  5. Ghi thông tin vào một tập tin

Có thể hữu ích khi bạn viết mã để viết ra các bước này và thực hiện từng phần. Hãy thử viết mã bằng các bước sau. Lưu ý rằng khi bạn viết mã, bạn có thể nghĩ ra các bước khác. Đầu tiên, về những gì bạn phải làm cho bước 1 và viết mã cho bước đó. Tiếp theo, hãy nghĩ xem bạn sẽ thực hiện bước 2 như thế nào và viết mã cho bước đó. Bạn có thể khắc phục sự cố từng bước bằng cách sử dụng câu lệnh in. Các bước xây dựng cho nhau, vì vậy bạn có thể làm việc để viết từng phần trước khi chuyển sang bước tiếp theo

Dung dịch

Sau đây là một giải pháp tiềm năng, mặc dù bạn có thể nghĩ ra một giải pháp khác. Chỉ cần đảm bảo rằng tệp văn bản của bạn trông giống như giải pháp được đưa ra trong báo cáo sự cố

Giải pháp này sẽ hướng dẫn từng bước viết mã. Nếu bạn không muốn xem từng bước, chỉ cần bỏ qua phần cuối của giải pháp

Hãy bắt đầu với các bước chúng tôi đã nghĩ ra trong phần gợi ý để viết đoạn mã này

outfile_directory = os.path.join['data', 'outfiles']
8

Đối với phần một, bạn sẽ nhận ra rằng bạn cần xây dựng đường dẫn tệp trước khi mở. Chúng tôi cũng biết rằng nếu chúng tôi mở một tệp, chúng tôi sẽ cần phải đóng tệp đó. Sau khi chúng tôi tạo đường dẫn tệp và mở tệp, mã của chúng tôi sẽ như thế này

outfile_directory = os.path.join['data', 'outfiles']
9

Mã này dường như không làm bất cứ điều gì, nhưng nó xây dựng một đường dẫn tệp, mở tệp, sau đó đóng tệp. Chạy nó sẽ cho phép chúng tôi xem liệu chúng tôi đã xây dựng đúng đường dẫn tệp của mình hay chưa và để biết rằng chúng tôi có thể mở và đóng tệp hay không

Bước thứ hai của chúng tôi là đọc dữ liệu trong tệp. Nhớ lại rằng chúng ta đã làm điều này trước đó với một chức năng gọi là

file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
90. Nhớ lại từ
file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
90 rằng tệp sẽ cần được mở để thực hiện việc này, vì vậy chúng tôi sẽ thêm tệp này trước khi sử dụng lệnh
file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
92

file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
0

Chúng tôi biết rằng các đường dẫn cung cấp cho chúng tôi một danh sách trong đó mỗi dòng là một phần tử của danh sách. Chúng tôi cần lặp qua các dòng trong tệp và chúng tôi sẽ thực hiện việc này bằng cách sử dụng vòng lặp

file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
4

Chúng tôi sẽ cần trích xuất thông tin từ các dòng, vì vậy hãy tiếp tục và chia các dòng. Hãy in cái này trước

file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
1

Khi bạn kiểm tra kết quả này, bạn sẽ phát hiện ra rằng nếu dòng chứa từ khóa của chúng tôi [

file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
94], thì giá trị được liên kết sẽ là phần tử
file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
95 trong
file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
96 [hãy nhớ rằng việc đếm bắt đầu từ 0]. Hãy in nó

file_location = os.path.join['data', 'outfiles', '*.out']
print[file_location]
2

Bây giờ tất cả những gì còn lại phải làm là ghi thông tin này vào một tệp. Chúng ta sẽ cần mở tệp trước vòng lặp, ghi vào tệp bên trong vòng lặp và cuối cùng đóng tệp bên ngoài vòng lặp. Giải pháp cuối cùng của chúng tôi là

Nhiều quy trình có thể truy cập cùng một tệp không?

Nếu một quy trình khác mở cùng một tệp, thì một bộ con trỏ tệp khác sẽ được tạo . Tệp đã từng mở có con trỏ tệp riêng. Vì các con trỏ tệp không được chia sẻ, hai quy trình có thể ghi vào cùng một khu vực của tệp, quy trình ghi cuối cùng sẽ thắng.

Điều gì xảy ra nếu hai quá trình cố ghi vào cùng một tệp?

Nếu bạn đang sử dụng một hệ thống bộ xử lý duy nhất—nghĩa là một luồng thực thi phần cứng duy nhất—thì hai chương trình của bạn không bao giờ thực sự thực thi cùng một lúc. The operating system will time-slice between them, and the memory system only ever sees one program trying to write to a particular memory location at a given time.

Nhiều tiến trình có thể ghi vào đĩa cùng một lúc không?

không, nói chung là không an toàn khi làm điều này . bạn cần có một khóa ghi độc quyền cho mỗi quy trình -- điều đó ngụ ý rằng tất cả các quy trình khác sẽ phải đợi trong khi một quy trình đang ghi vào tệp. bạn càng có nhiều quy trình chuyên sâu I/O, thời gian chờ đợi càng lâu.

Hai tập lệnh Python có thể đọc cùng một tệp không?

Python cung cấp khả năng mở cũng như làm việc với nhiều tệp cùng lúc .

Chủ Đề