Như một bổ sung cho câu hỏi này, vâng, Python Flushes trước khi đóng, tuy nhiên nếu bạn muốn đảm bảo dữ liệu được viết đúng để đĩa này là không đủ.
Đây là cách tôi sẽ viết một tệp theo cách mà nó được cập nhật về mặt nguyên tử trên máy chủ Unix/Linux, bất cứ khi nào tệp đích có tồn tại hay không. Lưu ý rằng một số hệ thống tập tin sẽ hoàn toàn cam kết dữ liệu vào đĩa trên gần+đổi tên [ext3 với data=ordered
[mặc định] và EXT4 ban đầu đã phát hiện ra nhiều lỗ hổng ứng dụng trước khi thêm phát hiện các mẫu chữ viết và dữ liệu đồng bộ hóa trước khi siêu dữ liệu trên đó [1]] .
# Write destfile, using a temporary name ._XXXXXXXX
base, name = os.path.split[destfile]
tmpname = os.path.join[base, '.{}_'.format[name]] # This is the tmpfile prefix
with tempfile.NamedTemporaryFile['w', prefix=tmpname, delete=False] as fd:
# Replace prefix with actual file path/name
tmpname = str[fd.name]
try:
# Write fd here... ex:
json.dumps[{}, fd]
# We want to fdatasync before closing, so we need to flush before close anyway
fd.flush[]
os.fdatasync[fd]
# Since we're using tmpfile, we need to also set the proper permissions
if os.path.exists[destfile]:
# Copy destination file's mask
os.fchmod[fd.fileno, os.stat[destfile].st_mode]
else:
# Set mask based on current umask value
umask = os.umask[0o22]
os.umask[umask]
os.fchmod[fd.fileno, 0o666 & ~umask] # 0o777 for dirs and executable files
# Now we can close and rename the file [overwriting any existing one]
fd.close[]
os.rename[tmpname, destfile]
except:
# On error, try to cleanup the temporary file
try:
os.unlink[tmpname]
except OSError:
pass
raise
IMHO thật tuyệt nếu Python cung cấp các phương pháp đơn giản xung quanh điều này ... Đồng thời tôi đoán nếu bạn quan tâm đến tính nhất quán của dữ liệu thì tốt nhất là thực sự hiểu những gì đang diễn ra ở mức thấp, đặc biệt là vì có nhiều sự khác biệt về Các hệ điều hành và hệ thống tập tin khác nhau.
Cũng lưu ý rằng điều này không đảm bảo dữ liệu bằng văn bản có thể được khôi phục, chỉ có điều bạn sẽ nhận được một bản sao nhất quán của dữ liệu [cũ hoặc mới]. Để đảm bảo dữ liệu mới được viết và truy cập một cách an toàn khi quay lại, bạn cần sử dụng os.fsync[...]
sau khi đổi tên và thậm chí sau đó nếu bạn có bộ nhớ cache không an toàn trong đường dẫn ghi, bạn vẫn có thể mất dữ liệu. Điều này là phổ biến trên phần cứng cấp tiêu dùng mặc dù bất kỳ hệ thống nào cũng có thể được cấu hình cho các ghi không an toàn cũng tăng hiệu suất. Ít nhất ngay cả với bộ nhớ cache không an toàn, phương thức trên vẫn sẽ đảm bảo bất kỳ bản sao nào của dữ liệu bạn nhận được là hợp lệ.
Sự mô tả
Phương thức tệp Python Flush [] Xóa bộ đệm bên trong, như FFLUSH của Stdio. Đây có thể là một không có trên một số đối tượng giống như tệp.flush[] flushes the internal buffer, like stdio's fflush. This may be a no-op on some file-like objects.
Python tự động xả các tệp khi đóng chúng. Nhưng bạn có thể muốn xóa dữ liệu trước khi đóng bất kỳ tệp nào.
Cú pháp
Sau đây là Syntax cho phương thức Flush [] -flush[] method −
fileObject.flush[];
Thông số
Na
Giá trị trả về
Phương pháp này không trả về bất kỳ giá trị nào.
Thí dụ
Ví dụ sau đây cho thấy cách sử dụng phương thức Flush [].
#!/usr/bin/python # Open a file fo = open["foo.txt", "wb"] print "Name of the file: ", fo.name # Here it does nothing, but you can call it with read operation. fo.flush[] # Close opend file fo.close[]
Khi chúng tôi chạy trên chương trình, nó tạo ra kết quả sau -
Name of the file: foo.txt
python_files_io.htm
Sự mô tả¶
Xóa các bộ đệm ghi của tệp.
Ghi chú¶
Nó hoạt động như fflush [] của stdio. Đây có thể là một không có trên một số đối tượng giống như tệp. Flush [] không nhất thiết phải ghi dữ liệu tệp vào đĩa. Sử dụng flush [] theo sau là os.fsync [] để đảm bảo hành vi này.
Thí dụ¶
>>> fw = open[r'C:\test.txt', "w"] >>> fw.write['foobar'] >>> fr = open[r'C:\test.txt'] >>> fr.readlines[] # even though we just wrote a line to the fr file it appears empty until close[] method is called [] >>> fw.flush[] # flushing forces the buffer content into the file without closing it >>> fr.readlines[] ['foobar']