open() trả vầ một đối tượng tập tin, và thường được dùng với hai thông số:
"open(filename, mode)".
>>> f=open('/tmp/workfile', 'w')
>>> print f
<open file '/tmp/workfile', mode 'w' at 80a0960>
Thông số thứ nhất là một chuỗi chứa tên tập tin. Thông số thứ hai là một chuỗi khác chứa một vài ký tự xác định cách thức tập tin sẽ được dùng. mode có thể là 'r' khi tập sẽ chỉ được đọc, 'w' chỉ được ghi (tập tin cùng tên đang có sẽ bị xóa), và 'a' mở tập tin để thêm vào cuối; mọi dữ liệu ghi vào tập tin sẽ được tự động thêm vào cuối. 'r+' mở tập tin để đọc và ghi. Thông số mode là không bắt buộc; 'r' sẽ được giả định nếu nó bị bỏ qua.
Trong Windows và Macintosh, 'b' thêm vào mode mở tập tin ở chế độ nhị phân, cho nên cũng có các chế độ khác như 'rb', 'wb', và 'r+b'. Windows phân biệt rõ các tập tin văn bản và nhị phân; ký tự hết dòng (end-of-line) trong các tập tin văn bản được tự động thay đổi một chút khi dữ liệu được đọc hay ghi. Việc thay đổi sau bức bình phong (behind-the-scene) như vậy không ảnh hưởng các tập tin văn bản ASCII, nhưng nó sẽ phá dữ liệu nhị phân như trong các tập tin JPEG hay hàm EXE . Cần cẩn thận dùng chế độ nhị phân khi đọc và ghi các tập tin như vậy.
7.2.1 Phương thức của đối tượng tập tin
Các ví dụ trong mục này sẽ giả sử một đối tượng tập tin f đã được tạo.
Để đọc nội dung tập tin, gọi f.read(size), nó đọc một số lượng dữ liệu và trả vầ một chuỗi. size là một thông số số nguyên không bắt buộc. Khi size bị bỏ qua hoặc âm, toàn bộ nội dung tập tin sẽ được đọc và trả vầ; bạn sẽ gặp vấn đầ nếu tập tin lớn gấp đôi bộ nhớ của máy bạn. Ngược lại, nhiầu nhất size byte sẽ được đọc và trả vầ. Nếu đã đến cuối tập tin, f.read() sẽ trả vầ một chuỗi rỗng ("").
>>> f.read()
'This is the entire file.\n'
>>> f.read() ''
f.readline() đọc một dòng từ tập tin; ký tự dòng mới (\n) được giữ lại ở cuối chuỗi, và sẽ chỉ bị bỏ qua ở dòng cuối của tập tin nếu tập tin không kết thúc bằng một dòng mới. Điầu này làm giá trị trả vầ rõ ràng; nếu f.readline() trả vầ một chuỗi rỗng có nghĩa là đã đụng cuối tập tin, trong khi một dòng trống thì
7. Vào và ra http://www.vithon.org/tutorial/2.5/node9.html
được biểu diễn bởi '\n', một chuỗi chỉ chứa duy nhât một ký tự dòng mới.
>>> f.readline()
'This is the first line of the file.\n'
>>> f.readline()
'Second line of the file\n'
>>> f.readline() ''
f.readlines() trả vầ một danh sách tất cả các dòng trong tập tin. Nếu truyần một tham số không bắt buộc sizehint, nó sẽ đọc nhiêu đó byte từ tập tin và thêm một chút đủ để hoàn tất một dòng, và trả vầ các dòng đã đọc được. Điầu này thường được dùng để đọc một cách hiệu quả từng dòng một trong một tập tin lớn mà không cần phải nạp toàn bộ tập tin vào bộ nhớ. Chỉ có các dòng toàn vẹn mới được trả vầ.
>>> f.readlines()
['This is the first line of the file.\n', 'Second line of the file\n']
Một cách khác để đọc các dòng là lặp qua đối tượng tập tin. Nó rất tiết kiệm bộ nhớ, nhanh, và có mã đơn giản:
>>> for line in f:
print line,
This is the first line of the file.
Second line of the file
Cách này đơn giản hơn nhưng không cho bạn điầu khiển cách đọc. Vì hai cách này quản lý bộ đệm dòng khác nhau, chúng không nên được dùng chung.
f.write(string) viết nội dung của string vào tập tin, trả vầ None.
>>> f.write('This is a test\n')
Để viết một thứ khác không phải là chuỗi, nó sẽ cần được chuyển thành một chuỗi trước:
>>> value = ('the answer', 42)
>>> s = str(value)
>>> f.write(s)
f.tell() trả vầ một số nguyên cho biết vị trí hiện tại của đối tượng tập tin, tính theo byte từ đầu tập tin. Để di chuyển vị trí, dùng "f.seek(offset, from_what)". Vị trí được tính từ tổng của offset và điểm tham chiếu; điểu tham chiếu được xác định bởi thông số from_what . Giá trị from_what 0 tính từ đầu tập tin, 1 dùng vị trí hiện tại, và 2 tính từ vị trí cuối tập tin. from_what có thể bị bỏ qua và mặc định là 0, điểm tham chiếu là đầu tập tin.
>>> f = open('/tmp/workfile', 'r+')
>>> f.write('0123456789abcdef')
>>> f.seek(5) # Go to the 6th byte in the file
7. Vào và ra http://www.vithon.org/tutorial/2.5/node9.html
>>> f.read(1)
'5'>>> f.seek(-3, 2) # Go to the 3rd byte before the end
>>> f.read(1) 'd'
Khi bạn đã dùng xong, gọi f.close() để đóng nó lại và giải phóng tài nguyên hệ thống đã sử dụng khi mở tập tin. Sau khi gọi f.close(), mọi cách dùng đối tượng tập tin sẽ tự động thất bại.
>>> f.close()
>>> f.read()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ValueError: I/O operation on closed file
Các đối tượng tập tin có thêm các phương thức phụ như isatty() và
truncate() không được thường xuyên dùng; tham khảo tài liệu thư viện để biết thêm vầ các đối tượng tập tin.
7.2.2 pickle mô-đun
Các chuỗi có thể được ghi hoặc đọc dễ dàng từ một tập tin. Các số cần một ít cố gắng hơn, vì phương thức read() chỉ trả vầ chuỗi, và cần được truyần vào một hàm như int(), nó sẽ nhận một chuỗi như '123' và trả vầ giá trị số 123 của nó.
Tuy nhiên, khi bạn muốn lưu các kiểu dữ liệu phức tạp hơn như danh sách, từ điển, hoặc các đối tượng, việc này trở nên rắc rối hơn nhiầu.
Thay vì để người dùng luôn viết và gỡ rối mã để lưu các kiểu dữ liệu phức tạp, Python cung cấp một mô-đun chuẩn gọi là pickle. Đây là một mô-đun tuyệt diệu có thể nhận hầu hết mọi đối tượng Python (ngay cả một vài dạng mã Python!), và chuyển nó thành một chuỗi; quá trình này được gọi là giầm (pickling). Tạo lại đối tượng từ một chuỗi được gọi là vớt (unpickling). Giữa việc giầm và vớt, biểu diễn dạng chuỗi của đối tượng có thể được lưu vào tập tin, hoặc gửi qua mạng đến một máy ở xa.
Nếu bạn có một đối tượng x, và một đối tượng tập tin f đã được mở để ghi vào, cách đơn giản nhất để giầm đối tượng chỉ cần một dòng mã:
pickle.dump(x, f)
Để vớt đối tượng ra, nếu f là một đối tượng tập tin đã được mở để đọc:
x = pickle.load(f)
(Có những biến thể khác, dùng khi giầm nhiầu đối tượng hoặc khi bạn không muốn viết dữ liệu đã giầm vào tập tin; tham khảo toàn bộ tài liệu vầ pickle trong Tham khảo thư viện Python.)
pickle là cách chuẩn để làm cho các đối tượng Python có thể được lưu và dùng lại bởi các chương trình khác, hoặc bởi lần chạy khác của cùng chương trình;
7. Vào và ra http://www.vithon.org/tutorial/2.5/node9.html
thuật ngữ trong ngành gọi là đối tượng bền . Vì pickle được sử dụng rộng rãi, nhiầu tác giả khi mở rộng Python đã cẩn thận để đảm bảo rằng các kiểu dữ liệu mới ví dụ như ma trận có thể được giầm và vớt đúng đắn.
Phiên bản 2.5, tài liệu được cập nhật ngày 19, tháng 09, năm 2006.
Xem Về tài liệu này... về cách đề nghị thay đổi.
7. Vào và ra http://www.vithon.org/tutorial/2.5/node9.html
Bài chỉ dẫn Python