পাইথনে আমি ফাইলের আকার কীভাবে পরীক্ষা করতে পারি?


756

আমি উইন্ডোজ একটি পাইথন স্ক্রিপ্ট লিখছি। আমি ফাইল আকারের উপর ভিত্তি করে কিছু করতে চাই। উদাহরণস্বরূপ, যদি আকার 0 এর চেয়ে বেশি হয় তবে আমি কারও কাছে একটি ইমেল পাঠাব, অন্যথায় অন্য জিনিসগুলিতে চালিয়ে যান।

আমি কীভাবে ফাইলের আকার চেক করব?


2
Path('./doc.txt').stat().st_size
বরিস

ধন্যবাদ @Boris আধুনিক পাইথন (v3.4 + +) উত্তর :) জন্য
মিউনিসিপ্যাল এসোসিয়েশনের

উত্তর:


734

আপনি প্রয়োজন st_sizeসম্পত্তির বস্তু দ্বারা ফিরেos.stat । আপনি pathlib(পাইথন ৩.৪++) ব্যবহার করে এটি পেতে পারেন :

>>> from pathlib import Path
>>> Path('somefile.txt').stat()
os.stat_result(st_mode=33188, st_ino=6419862, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=1564, st_atime=1584299303, st_mtime=1584299400, st_ctime=1584299400)
>>> Path('somefile.txt').stat().st_size
1564

বা ব্যবহার os.stat:

>>> import os
>>> os.stat('somefile.txt')
os.stat_result(st_mode=33188, st_ino=6419862, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=1564, st_atime=1584299303, st_mtime=1584299400, st_ctime=1584299400)
>>> os.stat('somefile.txt').st_size
1564

আউটপুট বাইটে রয়েছে।


2
যদি কিছু থাকে তবে মানটি ফাইল সিস্টেমের ব্লক আকারের (উদাহরণস্বরূপ 4096 বাইট) একাধিক হিসাবে পাস হতে পারে। আনন্দের সাথে পরিবর্তে এটি বাইট হিসাবে দেওয়া হয়।
জোছ

1
@ জোসচ - হ্যাঁ, এটি দুর্দান্ত, "আকারে ডিস্কের জন্য" আপনি stat_result.st_blocksব্লকের আকার দিয়ে বহুগুণ করতে পারেন , তবে আমি কীভাবে এটি প্রোগ্রামিকভাবে এবং ক্রস-প্ল্যাটফর্ম পেতে পারি তা আবিষ্কার করছি ( tune2fsইত্যাদি নয়)
টমাস গ্যান্ডার

1097

ব্যবহার os.path.getsize:

>>> import os
>>> b = os.path.getsize("/path/isa_005.mp3")
>>> b
2071611

আউটপুট বাইট হয়।


124
দ্রষ্টব্য: বাস্তবায়নটি os.path.getsizeকেবলমাত্রreturn os.stat(filename).st_size
উইম

তাহলে ওএস.স্ট্যাট (ফাইল) .st_size এর বিপরীতে os.path.getsize ব্যবহার করা থেকে এক মিনিটের কর্মক্ষমতা হারাতে হবে?
1515

5
@ওয়ার্ডস আরামে এটি পরিমাপ করুন! আমার কম্পিউটারে 150 ডলার।
ডেভিডম

@WWWearhewise এটি যদি সমস্যাটি হয় তবে আপনি যদি ফাইল সম্পর্কে আরও কিছু জানতে চান (পরিবর্তনের সময়, ফাইলের ধরণ, উদাহরণস্বরূপ) - তবে আপনি এটি সমস্ত সিঙ্গল সিস্টেমের মাধ্যমে পেয়ে যাবেন os.stat। তারপরে পার্থক্যটি মাইক্রোসেকেন্ডগুলির একটি যথেষ্ট সংখ্যায় চলে যেতে পারে :-)
গ্রেগগো

এটা ঠিক বলা হয় তাহলে পরে একটি ফাইল তৈরি করা হয়েছে কারণ এটি ফেরৎ 0 @danben
Alper

131

অন্যান্য উত্তরগুলি প্রকৃত ফাইলগুলির জন্য কাজ করে তবে আপনার যদি "ফাইল-জাতীয় বস্তু" এর জন্য কাজ করে এমন কিছু প্রয়োজন হয় তবে এটি ব্যবহার করে দেখুন:

# f is a file-like object. 
f.seek(0, os.SEEK_END)
size = f.tell()

এটি আমার সীমিত পরীক্ষায় আসল ফাইল এবং স্ট্রিংআইও'র জন্য কাজ করে। (পাইথন 2.7.3।) "ফাইল মত বস্তু" এপিআই সত্যিই অবশ্যই একটি কঠোর ইন্টারফেস, নয়, কিন্তু এপিআই ডকুমেন্টেশন যে ফাইল মত বস্তু সমর্থন করা উচিত প্রস্তাব দেওয়া seek()এবং tell()

সম্পাদন করা

এর মধ্যে আরেকটি পার্থক্য os.stat()হ'ল আপনার stat()কাছে এটি পড়ার অনুমতি না থাকলেও আপনি একটি ফাইল করতে পারেন । স্পষ্টতই আপনি / পড়ার অনুমতি না থাকলে সন্ধান / বলার পদ্ধতি কার্যকর হবে না।

সম্পাদনা 2

জোনাথনের পরামর্শে, এখানে একটি অদ্ভুত সংস্করণ রয়েছে। (উপরের সংস্করণটি ফাইলের শেষে ফাইলের পয়েন্টারটি রেখে দেয়, তাই যদি আপনি ফাইলটি পড়ার চেষ্টা করেন তবে আপনি শূন্য বাইট ফিরে পেতে পারেন!)

# f is a file-like object. 
old_file_position = f.tell()
f.seek(0, os.SEEK_END)
size = f.tell()
f.seek(old_file_position, os.SEEK_SET)

8
আপনার আমদানি করার দরকার নেই os, পরিবর্তে f.seek(0, 2)শেষ থেকে 0 বাইট সন্ধান করতে লিখুন ।
সিডোসবার

2
এবং শেষ লাইনের জন্য, যদি osএটি ব্যবহার না করা হয়:f.seek(old_file_position, 0)
ভাগ্যডোনাল্ড

48
আপনি যদি নামযুক্ত ভেরিয়েবলের পরিবর্তে পূর্ণসংখ্যার অক্ষর ব্যবহার করেন, আপনি আপনার কোড বজায় রাখতে হয় এমন কাউকে নির্যাতন করছেন। আমদানি না করার কোনও বাধ্যতামূলক কারণ নেই os
মার্ক ই। হাজেস

সমাধানের জন্য ধন্যবাদ, আমি বাস্তবায়ন করেছি এবং এটি ঠিকঠাক কাজ করছে। শুধু নিশ্চিত করতে, sizeআউটপুট বাইটে হয়?
কেদার.এইটওয়াদেকার

3
পাইথন কীভাবে প্রয়োগ করে #seek(): তার
অটোমলস

72
import os


def convert_bytes(num):
    """
    this function will convert bytes to MB.... GB... etc
    """
    for x in ['bytes', 'KB', 'MB', 'GB', 'TB']:
        if num < 1024.0:
            return "%3.1f %s" % (num, x)
        num /= 1024.0


def file_size(file_path):
    """
    this function will return the file size
    """
    if os.path.isfile(file_path):
        file_info = os.stat(file_path)
        return convert_bytes(file_info.st_size)


# Lets check the file size of MS Paint exe 
# or you can use any file path
file_path = r"C:\Windows\System32\mspaint.exe"
print file_size(file_path)

ফলাফল:

6.1 MB

5
this function will convert bytes to MB.... GB... etcভুল। এই ফাংশনটি বাইটগুলি এমআইবি, জিআইবি ইত্যাদিতে রূপান্তর করবে এই পোস্টটি দেখুন ।
moi

2
10 লাইনটি return f'{num:.1f} {x}'পাইথন> = 3.5 তে পরিবর্তন করা যেতে পারে ।
ম্যাট এম

53

ব্যবহার pathlib( পাইথন ৩.৪-এ যোগ করা বা পিপিআইতে একটি ব্যাকপোর্ট উপলব্ধ ):

from pathlib import Path
file = Path() / 'doc.txt'  # or Path('./doc.txt')
size = file.stat().st_size

এটি সত্যই কেবলমাত্র একটি ইন্টারফেস os.stat, তবে pathlibব্যবহারের ফলে অন্যান্য ফাইল সম্পর্কিত ক্রিয়াকলাপগুলি অ্যাক্সেস করার সহজ উপায় পাওয়া যায়।


18

bitshiftআমি যদি bytesঅন্য কোনও ইউনিটে রূপান্তর করতে চাই তবে আমি ব্যবহার করি একটি কৌশল । আপনি যদি একটি ডান শিফট করেন তবে 10মূলত এটি একটি আদেশ (একাধিক) দ্বারা শিফট করুন।

উদাহরণ: 5GB are 5368709120 bytes

print (5368709120 >> 10)  # 5242880 kilobytes (kB)
print (5368709120 >> 20 ) # 5120 megabytes (MB)
print (5368709120 >> 30 ) # 5 gigabytes (GB)

9
এটি প্রশ্নের উত্তর দেয় না। প্রশ্নটি কোনও ফাইলের আকার অনুসন্ধানের বিষয়ে, মানুষের ব্যবহারের জন্য ফলাফল ফর্ম্যাট করার বিষয়ে নয়।
উইল ম্যানলে

1
এই সংখ্যাগুলি ভুল এবং এইভাবে বিভ্রান্তিকর। 5 জিবি 5e9 বাইট হয়। এটি কি একরকম মানব-পঠনযোগ্য অনুমানের কথা বলে মনে হয়? আপনি এমনকি এখানে কিছু ব্যবহার করবেন?
সুরটিকে

1-বিট => 2 ... 2-বিট => 4 ... 3-বিট => 8 ... 4-বিট => 16 ... 5-বিট => 32 ... 6-বিট => 64 ... 7-বিট => 128 ... 8-বিট => 256 ... 9-বিট => 512 ... 10-বিট => 1024 ... 1024 বাইট 1 কেবি ... => 20 -বিটস => 1024 * 1024 = 1,048,576 বাইটস, যা 1024 কেবি, এবং 1 এমবি ... => 30-বিট => 1024 * 1024 * 1024 = 1,073,741,824 বাইট, যা 1,048,576 কেবি, এবং 1024 এমবি, এবং 1 জিবি… আপনি বিভ্রান্ত হয়েছেন বৈজ্ঞানিক স্বরলিপি এবং দশমিক স্থানগুলি বাইনারি / বেস -২ উপস্থাপনার সাথে কম্পিউটিংয়ে ব্যবহৃত হয়। 5x9 = 5 x 10 ^ 9 = 5,000,000,000
জেমস 'ফ্লাফি' বার্টন

3
বন্ধুরা, তিনি কিছুতেই বিভ্রান্ত হননি ... তাকে সবেমাত্র একটি অনুমান দেওয়া হয়েছে, যা "মূলত" বললে স্পষ্ট হয়। 2 ^ 10 প্রায় হয়। 10 ^ 3। আসলে এই পড়তা তাই সাধারণ যে এটা একটি নাম আছে : Mebi , Gibi এবং Tebi মেগা, গিগা এবং তেরা হয়, যথাক্রমে। প্রশ্নের উত্তর না দেওয়ার বিষয়ে, @ উইলম্যানলে, আপনার সেখানে মোটামুটি কথা আছে! ;
মাইক উইলিয়ামসন

9

প্রশ্নটির সাথে দৃrict়ভাবে আঁকড়ে ধরলে পাইথন কোড (+ সিউডো কোড) হবে:

import os
file_path = r"<path to your file>"
if os.stat(file_path).st_size > 0:
    <send an email to somebody>
else:
    <continue to other things>

-1
#Get file size , print it , process it...
#Os.stat will provide the file size in (.st_size) property. 
#The file size will be shown in bytes.

import os

fsize=os.stat('filepath')
print('size:' + fsize.st_size.__str__())

#check if the file size is less than 10 MB

if fsize.st_size < 10000000:
    process it ....

-1

আমাদের দুটি বিকল্প আছে উভয়ই ওএস মডিউল আমদানি করা অন্তর্ভুক্ত

1) OS.stat () ফাংশন হিসাবে আমদানি করে এমন একটি বস্তু প্রদান করে যা ফাইল তৈরির সময় এবং শেষ পরিবর্তিত সময় ইত্যাদি সহ অনেকগুলি শিরোলেখ ধারণ করে। তাদের মধ্যে st_size () ফাইলটির সঠিক আকার দেয়।

os.stat ( "ফাইলের নাম")। st_size ()

2) ওএস আমদানি করুন এতে, আমাদের কোনও আপেক্ষিক পথ নয়, সঠিক ফাইল পথ (পরম পথ) সরবরাহ করতে হবে।

os.path.getsize ("ফাইলের পথ")

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.