Có một tệp mà tôi muốn đảm bảo không phát triển lớn hơn 2 GB (vì nó phải chạy trên hệ thống sử dụng ext 2). Một cách tốt để kiểm tra kích thước của tập tin mang trong tâm trí là tôi sẽ được ghi vào tập tin này ở giữa kiểm tra là gì? Đặc biệt, tôi có cần phải lo lắng về các thay đổi đệm, không bị xóa mà chưa được ghi vào đĩa chưa?Làm cách nào để xác định kích thước tệp mở bằng Python?
Trả lời
Bạn có thể bắt đầu với một cái gì đó như thế này:
class TrackedFile(file):
def __init__(self, filename, mode):
self.size = 0
super(TrackedFile, self).__init__(filename, mode)
def write(self, s):
self.size += len(s)
super(TrackedFile, self).write(s)
Sau đó, bạn có thể sử dụng nó như thế này:
>>> f = TrackedFile('palindrome.txt', 'w')
>>> f.size
0
>>> f.write('A man a plan a canal ')
>>> f.size
21
>>> f.write('Panama')
27
Rõ ràng, triển khai này không có tác dụng nếu bạn không phải viết các tập tin từ đầu, nhưng bạn có thể điều chỉnh phương thức __init__
để xử lý dữ liệu ban đầu. Bạn cũng có thể cần phải ghi đè lên một số phương thức khác: ví dụ: writelines
.
Tác phẩm này không phân biệt mã hóa vì chuỗi chỉ là chuỗi byte.
>>> f2 = TrackedFile('palindrome-latin1.txt', 'w')
>>> f2.write(u'A man a plan a canál '.encode('latin1')
>>> f3 = TrackedFile('palindrome-utf8.txt', 'w')
>>> f3.write(u'A man a plan a canál '.encode('utf-8'))
>>> f2.size
21
>>> f3.size
22
+1: Đó là một ý tưởng thực sự thông minh. Tôi thích nó! – jathanism
Điều đó không thực sự. Nó bạn sử dụng ASCII, ISO1559 và UTF-8, kết quả sẽ giống nhau, nhưng kích thước trên đĩa sẽ không được. –
Không. Nó cũng hoạt động với các mã hóa khác, nếu bạn sử dụng các chuỗi thực tế. Trả lời sửa đổi để chứng minh. – jcdyer
Có lẽ không phải những gì bạn muốn, nhưng tôi sẽ đề xuất nó.
import os
a = os.path.getsize("C:/TestFolder/Input/1.avi")
Cách khác để mở tệp, bạn có thể sử dụng chức năng fstat, có thể được sử dụng trên tệp được mở. Phải mất một tay cầm tập số nguyên, không phải là một đối tượng tập tin, vì vậy bạn phải sử dụng phương pháp fileno trên đối tượng file:
a = open("C:/TestFolder/Input/1.avi")
b = os.fstat(a.fileno()).st_size
đáng tin cậy Hầu hết sẽ tạo ra một lớp gói mà sẽ kiểm tra kích thước tập tin khi bạn mở nó, theo dõi hoạt động viết và tìm kiếm, đếm kích thước hiện tại dựa trên các hoạt động đó và ngăn không cho vượt quá giới hạn kích thước.
Hoặc, nếu các tập tin đã được mở:
>>> fsock = open('/etc/hosts', 'rb').read()
>>> len(fsock)
444
Đó là bao nhiêu byte file là.
os.fstat(file_obj.fileno()).st_size
nên thực hiện thủ thuật. Tôi nghĩ rằng nó sẽ trả về các byte được viết. Bạn luôn có thể xả nước trước khi bàn tay nếu bạn lo lắng về việc lưu vào bộ đệm.
Và cũng hoạt động ở chế độ phụ thêm! Cảm ơn bạn. Và vâng, tôi sẽ tuôn ra trước khi gọi điều này. –
Tôi không quen với python, nhưng không phải đối tượng luồng (hoặc bất kỳ thứ gì bạn nhận được khi mở tệp) có thuộc tính chứa vị trí hiện tại của luồng không?
Tương tự như những gì bạn nhận được với chức năng ftell() C hoặc Stream.Position trong .NET.
Rõ ràng, điều này chỉ hoạt động nếu bạn được đặt ở cuối luồng, bạn đang ở đâu nếu bạn hiện đang viết thư cho nó.
Lợi ích của cách tiếp cận này là bạn không phải đóng tệp hoặc lo lắng về dữ liệu chưa được lưu.
'filehandle.tell()' thực sự hiển thị số byte trong tệp đã mở và hoạt động ở chế độ ghi hoặc nối. Không chắc tại sao tất cả những câu trả lời phức tạp hơn này lại được bình chọn. – hurfdurf
@hurfdurf Không, 'f.tell()' dường như không hoạt động đáng tin cậy trong chế độ nối thêm. Trừ khi bạn đầu tiên 'f.seek (0,2)'. Tôi không biết tại sao. –
Mặc dù đây là câu hỏi cũ, tôi nghĩ rằng Isak có giải pháp đơn giản nhất. Dưới đây là cách thực hiện trong Python:
# Assuming f is an open file
>>> pos = f.tell() # Save the current position
>>> f.seek(0, 2) # Seek to the end of the file
>>> length = f.tell() # The current position is the length
>>> f.seek(pos) # Return to the saved position
>>> print length
1024
Tôi nghĩ rằng trong dòng đầu tiên (lưu vị trí hiện tại), bạn nên sử dụng f.tell(), chứ không phải tìm kiếm(), điều này sẽ gây ra một ngoại lệ vì tìm kiếm() cần ít nhất 1 đối số. – Jkm
@Jkm Vâng, bạn đã đúng! Không chắc tôi đã bỏ lỡ điều đó như thế nào. Cảm ơn! – Trenton
Điều này sẽ tính toán kích thước tệp một cách chính xác, nhưng sẽ không khôi phục vị trí chính xác do các sự cố đã biết với [cho biết trong chế độ nối thêm] (https://stackoverflow.com/questions/31680677/). –
- 1. Làm cách nào để xác định kích thước tệp hình ảnh PE chính xác bằng (các) tiêu đề của nó?
- 2. Cách mở JFileChooser với kích thước được xác định trước
- 3. Nhận kích thước tệp bằng Python?
- 4. Làm cách nào để xác định kích thước tệp trong JavaScript?
- 5. Làm cách nào để nhận được kích thước tệp bằng megabyte bằng Perl?
- 6. Làm cách nào để mở nhiều tệp bằng cách sử dụng "có mở" bằng Python?
- 7. Làm cách nào để xác định tệp nhị phân và tệp văn bản bằng Python?
- 8. Xác định quy trình kích thước ảo bằng delphi
- 9. Làm cách nào để hạn chế kích thước tệp loại tệp tải lên bằng PHP?
- 10. Có thể xác định kích thước tệp cần tải xuống?
- 11. Xác định kích thước tệp hình ảnh + kích thước qua Javascript?
- 12. Xác định kích thước của tài liệu bằng Mongoid
- 13. Làm cách nào để đặt kích thước cột/hàng lưới mà không xác định mỗi dòng?
- 14. Làm cách nào để thay đổi kích thước ảnh thành một kích thước tệp cụ thể?
- 15. Làm cách nào để mở một Cửa sổ bật lên với kích thước cố định bằng thẻ HREF?
- 16. Làm cách nào để xác định kích thước của các đối tượng có thể kéo trong tệp kiểu?
- 17. Làm thế nào để khởi chạy EC2 instance với Boto, xác định kích thước của EBS?
- 18. Xác định kích thước của CCLabelTTF
- 19. Làm cách nào để tạo chuỗi có kích thước cố định trong python?
- 20. Làm cách nào để xác định kích thước giao dịch tối đa trong MySQL?
- 21. Làm cách nào để khai báo một chuỗi chuỗi có kích thước không xác định?
- 22. Làm cách nào để xác định kích thước/khung của UINavigationItem.titleView tùy chỉnh?
- 23. Xác nhận kích thước tải lên tệp
- 24. Làm cách nào để kiểm soát tệp nhật ký với kích thước tệp hàng ngày và kích thước tệp tối đa bằng log4j?
- 25. Làm cách nào để di chuyển/thay đổi kích thước cửa sổ bằng python-xlib?
- 26. Làm cách nào để đặt kích thước ban đầu cho một từ điển bằng Python?
- 27. Xác định kích thước của lưới trên ô bằng cách sử dụng Matplotlib
- 28. Làm cách nào để bạn chia tệp csv thành các khối có kích thước đồng đều bằng Python?
- 29. Xác định kích thước của InputStream
- 30. Cách kiểm tra kích thước tệp trong python?
Có lý do bạn không thể chỉ theo dõi kích thước tệp - nghĩa là xem kích cỡ khi bạn mở và tăng bộ đếm khi bạn viết ?Không đặc biệt thanh lịch, nhưng nó sẽ hoạt động. –
Tôi cho rằng đó là một khả năng tôi đã không nghĩ đến ... Tôi cũng có thể thử điều đó. –
Đó không phải là không hiệu quả như địa ngục mặc dù? –