2008-11-12 32 views
40

Có cách nào để tìm kích thước của đối tượng tệp hiện đang mở không?Kích thước của đối tượng tệp đang mở

Cụ thể, tôi đang làm việc với mô-đun tarfile để tạo tarfiles, nhưng tôi không muốn tarfile của tôi vượt quá một kích thước nhất định. Theo tôi biết, đối tượng tarfile là các đối tượng giống như tệp, vì vậy tôi tưởng tượng một giải pháp chung sẽ hoạt động.

Trả lời

66
$ ls -la chardet-1.0.1.tgz 
-rwxr-xr-x 1 vinko vinko 179218 2008-10-20 17:49 chardet-1.0.1.tgz 
$ python 
Python 2.5.1 (r251:54863, Jul 31 2008, 22:53:39) 
[GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> f = open('chardet-1.0.1.tgz','rb') 
>>> f.seek(0,2) 
>>> f.tell() 
179218L 

Thêm ý tưởng ChrisJY để ví dụ

>>> import os 
>>> os.fstat(f.fileno()).st_size 
179218L 
>>>   
+0

http://docs.python.org/library/stat.html#stat.ST_SIZE 'os.fstat' trả về cấu trúc' stat', vui lòng sử dụng 'st_size' – shevski

+1

Ai đó có thể làm sáng tỏ sự kỳ diệu của' f .seek (0,2) '? Tại sao 'tell()' trả về 0 mà không có nó? –

+3

@m_poorNgười dùng 'f.seek (0, 2)' di chuyển vị trí của đối tượng tệp thành 0 byte từ cuối tệp, do đó vị trí của đối tượng tệp nằm ở cuối tệp. Sau đó, 'f.tell()' trả về vị trí của đối tượng tệp hiện tại, đó là kích thước của tệp trong trường hợp này. Xem https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects – EarlCrapstone

4

Nếu bạn có bộ mô tả tệp, bạn có thể sử dụng fstat để tìm hiểu kích thước, nếu có. Một giải pháp chung chung hơn là tìm đến cuối tập tin và đọc vị trí của nó ở đó.

7

Vâng, nếu đối tượng tập tin hỗ trợ phương pháp nói, bạn có thể làm:

current_size = f.tell() 

Điều đó sẽ cho bạn biết là nó hiện đang viết. Nếu bạn viết theo cách tuần tự, kích thước của tệp sẽ là kích thước.

Nếu không, bạn có thể sử dụng các khả năng của hệ thống tệp, tức là os.fstat theo đề xuất của người khác.

+0

'current_size' là một tên biến xấu vì nó có nghĩa là * kích thước hiện tại * của tệp. 'tell()' cung cấp cho vị trí hiện tại của luồng tệp - tức là nơi đọc/ghi tiếp theo sẽ xảy ra. – IAbstract

+1

Theo tài liệu Python 3.6, '.tell() Trả về vị trí dòng hiện tại dưới dạng số mờ. Số thường không đại diện cho một số byte trong bộ nhớ nhị phân cơ bản.' – Devy

1

Một giải pháp khác là sử dụng StringIO "nếu bạn đang thực hiện thao tác trong bộ nhớ".

with open(file_path, 'rb') as x: 
    body = StringIO() 
    body.write(x.read()) 
    body.seek(0, 0) 

Hiện tại body hoạt động giống như đối tượng tệp với các thuộc tính khác nhau như body.read().

body.len cho kích thước tệp.

Các vấn đề liên quan