tempfile --- Tạo các tập tin và thư mục tạm thời¶
Source code: Lib/tempfile.py
Mô-đun này tạo các tập tin và thư mục tạm thời. Nó hoạt động trên tất cả các nền tảng được hỗ trợ. TemporaryFile, NamedTemporaryFile, TemporaryDirectory và SpooledTemporaryFile là các giao diện cấp cao cung cấp tính năng dọn dẹp tự động và có thể được sử dụng như context managers. mkstemp() và mkdtemp() là các hàm cấp thấp hơn yêu cầu dọn dẹp thủ công.
Tất cả các hàm và hàm tạo mà người dùng có thể gọi đều có các đối số bổ sung cho phép kiểm soát trực tiếp vị trí và tên của các tệp và thư mục tạm thời. Tên tệp được mô-đun này sử dụng bao gồm một chuỗi ký tự ngẫu nhiên cho phép các tệp đó được tạo một cách an toàn trong các thư mục tạm thời được chia sẻ. Để duy trì khả năng tương thích ngược, thứ tự đối số hơi kỳ quặc; nên sử dụng đối số từ khóa để làm rõ.
Mô-đun xác định các mục người dùng có thể gọi sau:
- tempfile.TemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)¶
Trả về file-like object có thể được sử dụng làm vùng lưu trữ tạm thời. Tệp được tạo an toàn, sử dụng các quy tắc tương tự như
mkstemp(). Nó sẽ bị hủy ngay khi bị đóng (bao gồm cả việc đóng ngầm khi đối tượng được thu gom rác). Trong Unix, mục nhập thư mục cho tệp hoàn toàn không được tạo hoặc bị xóa ngay sau khi tệp được tạo. Các nền tảng khác không hỗ trợ điều này; mã của bạn không nên dựa vào tệp tạm thời được tạo bằng chức năng này có hoặc không có tên hiển thị trong hệ thống tệp.Đối tượng kết quả có thể được sử dụng làm context manager (xem Ví dụ). Khi hoàn thành ngữ cảnh hoặc hủy đối tượng tệp, tệp tạm thời sẽ bị xóa khỏi hệ thống tệp.
Tham số mode mặc định là
'w+b'để tệp được tạo có thể được đọc và ghi mà không bị đóng. Chế độ nhị phân được sử dụng để nó hoạt động nhất quán trên tất cả các nền tảng mà không quan tâm đến dữ liệu được lưu trữ. buffering, encoding, errors và newline được hiểu làopen().Các tham số dir, prefix và suffix có ý nghĩa và mặc định tương tự như với
mkstemp().Đối tượng được trả về là đối tượng tệp thực sự trên nền tảng POSIX. Trên các nền tảng khác, nó là một đối tượng giống như tệp có thuộc tính
filelà đối tượng tệp thực sự cơ bản.Cờ
os.O_TMPFILEđược sử dụng nếu nó có sẵn và hoạt động (dành riêng cho Linux, yêu cầu nhân Linux 3.11 trở lên).Trên các nền tảng không phải là Posix hay Cygwin, TemporaryFile là bí danh của NamedTemporaryFile.
Tăng một auditing event
tempfile.mkstempvới đối sốfullpath.Thay đổi trong phiên bản 3.5: Cờ
os.O_TMPFILEhiện được sử dụng nếu có.Thay đổi trong phiên bản 3.8: Đã thêm tham số errors.
- tempfile.NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True, *, errors=None, delete_on_close=True)¶
Chức năng này hoạt động chính xác như
TemporaryFile(), ngoại trừ những khác biệt sau:Hàm này trả về một tệp được đảm bảo có tên hiển thị trong hệ thống tệp.
Để quản lý tệp được đặt tên, nó mở rộng các tham số của
TemporaryFile()với các tham số delete và delete_on_close để xác định xem tệp được đặt tên có được tự động xóa hay không và như thế nào.
Đối tượng được trả về luôn là file-like object có thuộc tính
filelà đối tượng tệp thực sự cơ bản. Đối tượng giống như tệp này có thể được sử dụng trong câu lệnhwith, giống như một tệp bình thường. Tên của tệp tạm thời có thể được lấy từ thuộc tínhnamecủa đối tượng giống tệp được trả về. Trên Unix, không giống nhưTemporaryFile(), mục nhập thư mục không bị hủy liên kết ngay sau khi tạo tệp.Nếu delete là true (mặc định) và delete_on_close là true (mặc định), tệp sẽ bị xóa ngay khi đóng. Nếu delete là đúng và delete_on_close là sai, tệp sẽ chỉ bị xóa khi thoát trình quản lý ngữ cảnh hoặc nếu không thì khi file-like object được hoàn tất. Việc xóa không phải lúc nào cũng được đảm bảo trong trường hợp này (xem
object.__del__()). Nếu delete sai thì giá trị của delete_on_close sẽ bị bỏ qua.Do đó, để sử dụng tên của tệp tạm thời để mở lại tệp sau khi đóng tệp, hãy đảm bảo không xóa tệp khi đóng (đặt tham số delete thành sai) hoặc, trong trường hợp tệp tạm thời được tạo trong câu lệnh
with, hãy đặt tham số delete_on_close thành sai. Cách tiếp cận thứ hai được khuyến nghị vì nó cung cấp hỗ trợ trong việc tự động dọn dẹp tệp tạm thời khi thoát khỏi trình quản lý bối cảnh.Việc mở lại tệp tạm thời theo tên của nó trong khi nó vẫn đang mở sẽ hoạt động như sau:
Trên POSIX, tệp luôn có thể được mở lại.
Trên Windows, hãy đảm bảo đáp ứng ít nhất một trong các điều kiện sau:
delete là sai
quyền truy cập xóa chia sẻ mở bổ sung (ví dụ: bằng cách gọi
os.open()bằng cờO_TEMPORARY)delete là đúng nhưng delete_on_close là sai. Lưu ý rằng trong trường hợp này, các lần mở bổ sung không chia sẻ quyền truy cập xóa (ví dụ: được tạo thông qua
open()dựng sẵn) phải được đóng trước khi thoát trình quản lý ngữ cảnh, nếu không lệnh gọios.unlink()khi thoát trình quản lý ngữ cảnh sẽ không thành công vớiPermissionError.
Trên Windows, nếu delete_on_close sai và tệp được tạo trong thư mục mà người dùng không có quyền xóa, thì lệnh gọi
os.unlink()khi thoát trình quản lý ngữ cảnh sẽ không thành công vớiPermissionError. Điều này không thể xảy ra khi delete_on_close là đúng vì quyền truy cập xóa được yêu cầu bởi người mở, quyền truy cập này sẽ không thành công ngay lập tức nếu quyền truy cập được yêu cầu không được cấp.Trên POSIX (chỉ), một quá trình bị chấm dứt đột ngột với SIGKILL không thể tự động xóa bất kỳ Tệp có tên tạm thời nào mà nó đã tạo.
Tăng một auditing event
tempfile.mkstempvới đối sốfullpath.Thay đổi trong phiên bản 3.8: Đã thêm tham số errors.
Thay đổi trong phiên bản 3.12: Đã thêm tham số delete_on_close.
- class tempfile.SpooledTemporaryFile(max_size=0, mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)¶
Lớp này hoạt động chính xác như
TemporaryFile(), ngoại trừ dữ liệu được lưu vào bộ nhớ cho đến khi kích thước tệp vượt quá max_size hoặc cho đến khi phương thứcfileno()của tệp được gọi, tại thời điểm đó nội dung được ghi vào đĩa và thao tác tiếp tục như vớiTemporaryFile().- rollover()¶
Tệp kết quả có một phương thức bổ sung,
rollover(), khiến tệp chuyển sang tệp trên đĩa bất kể kích thước của nó.
Đối tượng được trả về là một đối tượng giống như tệp có thuộc tính
_filelà đối tượngio.BytesIOhoặcio.TextIOWrapper(tùy thuộc vào việc mode nhị phân hay văn bản được chỉ định) hoặc một đối tượng tệp thực sự, tùy thuộc vào việcrollover()có được gọi hay không. Đối tượng giống như tệp này có thể được sử dụng trong câu lệnhwith, giống như một tệp bình thường.Thay đổi trong phiên bản 3.3: phương thức cắt ngắn hiện chấp nhận đối số size.
Thay đổi trong phiên bản 3.8: Đã thêm tham số errors.
Thay đổi trong phiên bản 3.11: Triển khai đầy đủ các lớp cơ sở trừu tượng
io.BufferedIOBasevàio.TextIOBase(tùy thuộc vào việc mode nhị phân hay văn bản được chỉ định).
- class tempfile.TemporaryDirectory(suffix=None, prefix=None, dir=None, ignore_cleanup_errors=False, *, delete=True)¶
Lớp này tạo một thư mục tạm thời một cách an toàn bằng cách sử dụng các quy tắc tương tự như
mkdtemp(). Đối tượng kết quả có thể được sử dụng làm context manager (xem Ví dụ). Khi hoàn thành ngữ cảnh hoặc hủy đối tượng thư mục tạm thời, thư mục tạm thời mới được tạo và tất cả nội dung của nó sẽ bị xóa khỏi hệ thống tệp.- name¶
Tên thư mục có thể được lấy từ thuộc tính
namecủa đối tượng được trả về. Khi đối tượng trả về được sử dụng làm context manager,namesẽ được gán cho mục tiêu của mệnh đềastrong câu lệnhwith, nếu có.
- cleanup()¶
Thư mục có thể được dọn sạch một cách rõ ràng bằng cách gọi phương thức
cleanup(). Nếu ignore_cleanup_errors là đúng, mọi trường hợp ngoại lệ chưa được xử lý trong quá trình dọn dẹp rõ ràng hoặc ẩn (chẳng hạn nhưPermissionErrorxóa các tệp đang mở trên Windows) sẽ bị bỏ qua và các mục có thể tháo rời còn lại sẽ bị xóa trên cơ sở "nỗ lực hết sức". Nếu không, lỗi sẽ xuất hiện trong bất kỳ quá trình dọn dẹp bối cảnh nào xảy ra (lệnh gọicleanup(), thoát khỏi trình quản lý bối cảnh, khi đối tượng được thu gom rác hoặc trong khi tắt trình thông dịch).
Tham số delete có thể được sử dụng để vô hiệu hóa việc dọn dẹp cây thư mục khi thoát khỏi ngữ cảnh. Mặc dù có vẻ bất thường khi trình quản lý bối cảnh vô hiệu hóa hành động được thực hiện khi thoát khỏi ngữ cảnh, nhưng nó có thể hữu ích trong quá trình gỡ lỗi hoặc khi bạn cần hành vi dọn dẹp của mình có điều kiện dựa trên logic khác.
Tăng một auditing event
tempfile.mkdtempvới đối sốfullpath.Added in version 3.2.
Thay đổi trong phiên bản 3.10: Đã thêm tham số ignore_cleanup_errors.
Thay đổi trong phiên bản 3.12: Đã thêm tham số delete.
- tempfile.mkstemp(suffix=None, prefix=None, dir=None, text=False)¶
Tạo một tập tin tạm thời theo cách an toàn nhất có thể. Không có điều kiện chủng tộc nào trong quá trình tạo tệp, giả sử rằng nền tảng triển khai đúng cờ
os.O_EXCLchoos.open(). Tệp chỉ có thể đọc và ghi được bằng ID người dùng đang tạo. Nếu nền tảng sử dụng các bit quyền để cho biết liệu một tệp có thể thực thi được hay không thì không ai có thể thực thi được tệp đó.Bộ mô tả tập tin là not inherited by child processes.
Không giống như
TemporaryFile(), người dùngmkstemp()có trách nhiệm xóa tệp tạm thời khi thực hiện xong.Nếu suffix không phải là
Nonethì tên file sẽ kết thúc bằng hậu tố đó, nếu không sẽ không có hậu tố.mkstemp()không đặt dấu chấm giữa tên tệp và hậu tố; nếu bạn cần, hãy đặt nó ở đầu suffix.Nếu prefix không phải là
None, tên tệp sẽ bắt đầu bằng tiền tố đó; mặt khác, tiền tố mặc định sẽ được sử dụng. Giá trị mặc định là giá trị trả về củagettempprefix()hoặcgettempprefixb(), nếu phù hợp.Nếu dir không phải là
None, tệp sẽ được tạo trong thư mục đó; nếu không, một thư mục mặc định sẽ được sử dụng. Thư mục mặc định được chọn từ danh sách phụ thuộc vào nền tảng, nhưng người dùng ứng dụng có thể kiểm soát vị trí thư mục bằng cách đặt các biến môi trường TMPDIR, TEMP hoặc TMP. Do đó, không có gì đảm bảo rằng tên tệp được tạo sẽ có bất kỳ thuộc tính đẹp nào, chẳng hạn như không yêu cầu trích dẫn khi được truyền tới các lệnh bên ngoài thông quaos.popen().Nếu bất kỳ suffix, prefix và dir nào không phải là
Nonethì chúng phải cùng loại. Nếu chúng là byte thì tên trả về sẽ là byte thay vì str. Nếu bạn muốn buộc giá trị trả về byte bằng hành vi mặc định khác, hãy chuyểnsuffix=b''.Nếu text được chỉ định và đúng, tệp sẽ được mở ở chế độ văn bản. Ngược lại, (mặc định) tệp sẽ được mở ở chế độ nhị phân.
mkstemp()trả về một bộ chứa bộ điều khiển cấp hệ điều hành cho một tệp đang mở (như được trả về bởios.open()) và tên đường dẫn tuyệt đối của tệp đó, theo thứ tự đó.Tăng một auditing event
tempfile.mkstempvới đối sốfullpath.Thay đổi trong phiên bản 3.5: suffix, prefix và dir hiện có thể được cung cấp theo byte để nhận được giá trị trả về byte. Trước đó, chỉ str được phép. suffix và prefix hiện chấp nhận và mặc định là
Noneđể sử dụng giá trị mặc định phù hợp.Thay đổi trong phiên bản 3.6: Tham số dir hiện chấp nhận path-like object.
- tempfile.mkdtemp(suffix=None, prefix=None, dir=None)¶
Tạo một thư mục tạm thời theo cách an toàn nhất có thể. Không có điều kiện chủng tộc trong việc tạo thư mục. Thư mục chỉ có thể đọc, ghi và tìm kiếm được bằng ID người dùng đang tạo.
Người dùng
mkdtemp()có trách nhiệm xóa thư mục tạm thời và nội dung của nó khi thực hiện xong.Các đối số prefix, suffix và dir giống như đối với
mkstemp().mkdtemp()trả về tên đường dẫn tuyệt đối của thư mục mới.Tăng một auditing event
tempfile.mkdtempvới đối sốfullpath.Thay đổi trong phiên bản 3.5: suffix, prefix và dir hiện có thể được cung cấp theo byte để nhận được giá trị trả về byte. Trước đó, chỉ str được phép. suffix và prefix hiện chấp nhận và mặc định là
Noneđể sử dụng giá trị mặc định phù hợp.Thay đổi trong phiên bản 3.6: Tham số dir hiện chấp nhận path-like object.
Thay đổi trong phiên bản 3.12:
mkdtemp()bây giờ luôn trả về một đường dẫn tuyệt đối, ngay cả khi dir là tương đối.
- tempfile.gettempdir()¶
Trả về tên của thư mục được sử dụng cho các tập tin tạm thời. Điều này xác định giá trị mặc định cho đối số dir cho tất cả các hàm trong mô-đun này.
Python tìm kiếm danh sách thư mục tiêu chuẩn để tìm một danh sách mà người dùng gọi có thể tạo tệp trong đó. Danh sách là:
Thư mục được đặt tên theo biến môi trường
TMPDIR.Thư mục được đặt tên theo biến môi trường
TEMP.Thư mục được đặt tên theo biến môi trường
TMP.Một vị trí dành riêng cho nền tảng:
Trên Windows, các thư mục
C:\TEMP,C:\TMP,\TEMPvà\TMPtheo thứ tự đó.Trên tất cả các nền tảng khác, các thư mục
/tmp,/var/tmpvà/usr/tmptheo thứ tự đó.
Phương án cuối cùng là thư mục làm việc hiện tại.
Kết quả tìm kiếm này được lưu vào bộ nhớ đệm, hãy xem mô tả về
tempdirbên dưới.Thay đổi trong phiên bản 3.10: Luôn trả về một str. Trước đây, nó sẽ trả về bất kỳ giá trị
tempdirnào bất kể loại nào, miễn là nó không phải làNone.
- tempfile.gettempdirb()¶
Tương tự như
gettempdir()nhưng giá trị trả về tính bằng byte.Added in version 3.5.
- tempfile.gettempprefix()¶
Trả về tiền tố tên tệp được sử dụng để tạo tệp tạm thời. Điều này không chứa thành phần thư mục.
- tempfile.gettempprefixb()¶
Tương tự như
gettempprefix()nhưng giá trị trả về tính bằng byte.Added in version 3.5.
Mô-đun này sử dụng biến toàn cục để lưu trữ tên của thư mục được sử dụng cho các tệp tạm thời được gettempdir() trả về. Nó có thể được đặt trực tiếp để ghi đè quá trình lựa chọn, nhưng điều này không được khuyến khích. Tất cả các hàm trong mô-đun này đều có đối số dir có thể được sử dụng để chỉ định thư mục. Đây là cách tiếp cận được đề xuất để không gây ngạc nhiên cho các mã không nghi ngờ khác bằng cách thay đổi hành vi API toàn cầu.
- tempfile.tempdir¶
Khi được đặt thành một giá trị khác
None, biến này xác định giá trị mặc định cho đối số dir cho các hàm được xác định trong mô-đun này, bao gồm loại, byte hoặc str của nó. Nó không thể là path-like object.Nếu
tempdirlàNone(mặc định) trong bất kỳ lệnh gọi nào tới bất kỳ hàm nào ở trên ngoại trừgettempprefix()thì nó sẽ được khởi tạo theo thuật toán được mô tả tronggettempdir().Ghi chú
Xin lưu ý rằng nếu bạn đặt
tempdirthành giá trị byte, thì sẽ có một tác dụng phụ khó chịu: Kiểu trả về mặc định chung củamkstemp()vàmkdtemp()thay đổi thành byte khi không cung cấp đối sốprefix,suffixhoặcdirrõ ràng của loại str. Vui lòng không viết mã mong đợi hoặc tùy thuộc vào điều này. Hành vi khó xử này được duy trì để tương thích với việc triển khai lịch sử.
Ví dụ¶
Dưới đây là một số ví dụ về cách sử dụng điển hình của mô-đun tempfile:
>>> nhập tệp tạm thời
# create một tệp tạm thời và ghi một số dữ liệu vào đó
>>> fp = tempfile.TemporaryFile()
>>> fp.write(b'Xin chào thế giới!')
dữ liệu # read từ tập tin
>>> fp.seek(0)
>>> fp.read()
b'Xin chào thế giới!'
# close tập tin, nó sẽ bị xóa
>>> fp.close()
# create một tệp tạm thời bằng trình quản lý bối cảnh
>>> với tempfile.TemporaryFile() là fp:
... fp.write(b'Xin chào thế giới!')
... fp.seek(0)
... fp.read()
b'Xin chào thế giới!'
>>>
# file hiện đã bị đóng và xóa
# create một tệp tạm thời bằng trình quản lý bối cảnh
# close file, dùng tên đó để mở lại file
>>> với tempfile.NamedTemporaryFile(delete_on_close=False) là fp:
... fp.write(b'Xin chào thế giới!')
... fp.close()
... tập tin # the đã bị đóng nhưng chưa bị xóa
... # open lại tập tin bằng cách sử dụng tên của nó
... với open(fp.name, mode='rb') là f:
... f.read()
b'Xin chào thế giới!'
>>>
# file hiện đã bị xóa
# create một thư mục tạm thời bằng trình quản lý bối cảnh
>>> với tempfile.TemporaryDirectory() là tmpdirname:
... print('đã tạo thư mục tạm thời', tmpdirname)
>>>
# directory và nội dung đã bị xóa
Các hàm và biến không dùng nữa¶
Một cách lịch sử để tạo các tệp tạm thời là trước tiên tạo tên tệp bằng hàm mktemp(), sau đó tạo tệp bằng tên này. Rất tiếc, điều này không an toàn vì một quy trình khác có thể tạo tệp có tên này trong khoảng thời gian giữa lệnh gọi tới mktemp() và lần thử tạo tệp tiếp theo bằng quy trình đầu tiên. Giải pháp là kết hợp hai bước và tạo tệp ngay lập tức. Cách tiếp cận này được mkstemp() và các hàm khác được mô tả ở trên sử dụng.
- tempfile.mktemp(suffix='', prefix='tmp', dir=None)¶
Sắp loại bỏ từ phiên bản 2.3: Thay vào đó hãy sử dụng
mkstemp().Trả về tên đường dẫn tuyệt đối của tệp không tồn tại tại thời điểm cuộc gọi được thực hiện. Các đối số prefix, suffix và dir tương tự như
mkstemp(), ngoại trừ tên tệp byte,suffix=Nonevàprefix=Nonekhông được hỗ trợ.Cảnh báo
Việc sử dụng chức năng này có thể gây ra lỗ hổng bảo mật trong chương trình của bạn. Vào thời điểm bạn bắt đầu làm bất cứ điều gì với tên tệp mà nó trả về, người khác có thể đã đánh bại bạn. Việc sử dụng
mktemp()có thể được thay thế dễ dàng bằngNamedTemporaryFile(), chuyển cho nó tham sốdelete=False>>> f = NamedTemporaryFile(delete=False) >>> f.name '/tmp/tmptjujjt' >>> f.write(b"Xin chào thế giới!\n") 13 >>> f.close() >>> os.unlink(f.name) >>> os.path.exists(f.name) sai