• 0

كيفية قراءة اي ملف في بايثون على هيئة بيانات ثنائية

اريد قراءة اي ملف على شكل 8 byte وعمل list اضع بها القيم كل حقل يحمل 8 byte مثل هذا

11111110101001010101110011101010010101010100110010101010101001

ثم اريد ان اعيد نفس البيانات التي في list لحالتها الأولى لاضعها في ملف اخر ليصبح نسخة من الملف الاول

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1
بتاريخ 23 دقائق مضت قال Mostafa mahmoud3:

اخي انا اريد ان أقرأ ملف فيديو مثلا ثم وعمل مصفوفة كل خانة 8 byte مثل هذا

['111001011111110101001010101110011101010010101010100110010101010101001', '110110011111110101001010101110011101010010101010100110010101010101001', '110010011111110101001010101110011101010010101010100110010101010101001']

ثم اعيد تحويل هذه المصفوفة الي ملف فيديو يحمل اسم اخر يكن نسخة من الاول

هل يمكن ان تساعدني في هذا

يمكنك أن تقوم تحويل محتوى أي ملف من خلال bytearray كالتالي: 

>>> path = "C:\\Users\\sameh\\OneDrive\\Desktop\\image.png"	# مسار أي ملف
>>> file = open(path, mode='rb')
>>> content = file.read()
>>> allBytes = bytearray(content)
>>> eightBytes = [ allBytes[i:i+8] for i in range(0, len(allBytes), 8) ]
>>> binaryList = []
>>> for chunk in eightBytes:
...     eightBytesChunk = ''
...     for i in chunk:
...             eightBytesChunk += bin(i)[2:].zfill(8)
...     binaryList.append(eightBytesChunk)
>>> binaryList
['1000100101010000010011100100011100001101000010100001101000001010',
 '0000000000000000000000000000110101001001010010000100010001010010',
 '0000000000000000000000111000010000000000000000000000001001010001',
 '0000100000000110000000000000000000000000000111011100101001111001',
 '0001001100000000000000001000000000000000010010010100010001000001',
 '0101010001111000110110101110110010111101100001110111101100011011',
 '1101100101110101111111101111111111111101011001110111111010001001'

 ....

]

لاحظ أنه يجب قراءة الملف بوضع rb (read binary) في الدالة open

ولإعادة كتابة كود الـ binary إلى ملف جديد يمكنك أن تقوم بالتالي:

>>> # نقوم بتقسيم كل أكواد Binary إلى Bytes
>>> finalBinary = []
>>> lst = []
>>> for i in binaryList:
...     lst.append([ i[x:x+8] for x in range(0, len(i), 8) ])
...
>>> for i in lst:
...     for j in i:
...             finalBinary.append(j)
...
>>> finalBinary[0]
'10001001'

>>> # الدالة التالية تقوم بكتابة أرقم الـ Binary في ملف جديد
>>> def writer(stuff):
...     blob = int(stuff, 2).to_bytes(1, byteorder='big')
...     with open("C:\\Users\\sameh\\OneDrive\\Desktop\\image2.png", "a+b") as file:
...             file.write(blob)
...
>>> for strings in finalBinary:
...	writer(strings)
>>> 

بالطبع هذه الطريقة ليست عملية في نسخ الملفات لأنها تستغرق الكثير من الوقت، وفي الحالات العادية نستخدم المكتبات مجهزة مسبقًا لنسخ الملفات مثل دالة copyfile في حزمة shutil

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

يمكن تحويل النص إلى قائمة من أرقام Binary من خلال تحويل كل حرف إلى رقم ascii عبر دالة ord وإستخدام دالة format لتحويل هذا الرقم إلى كود ثنائي Binary كالتالي:

>>> string = "hello world"
>>> binary_list = [format(ord(x), 'b') for x in string]
>>> binary_list
['1101000', '1100101', '1101100', '1101100', '1101111', '100000', '1110111', '1101111', '1110010', '1101100', '1100100']

ولإعادة تحويل القائمة السابقة إلى نص مرة أخرى يمكن أن تقوم بالتالي:

>>> ascii_string = ""	# هنا سيتم تخزين النص النهائي
>>> for binary_value in binary_list:
...     an_integer = int(binary_value, 2)	# تحويل كود Binary إلى النظام العشري (ascii code)
...     ascii_character = chr(an_integer)	# تحويل الحرف من ascii code إلى حرف نصي string
...     ascii_string += ascii_character		# إضافة الحرف إلى المتغير الأساسي
...
>>> print(ascii_string)
hello world

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0
بتاريخ 6 دقائق مضت قال سامح أشرف:

يمكن تحويل النص إلى قائمة من أرقام Binary من خلال تحويل كل حرف إلى رقم ascii عبر دالة ord وإستخدام دالة format لتحويل هذا الرقم إلى كود ثنائي Binary كالتالي:


>>> string = "hello world"
>>> binary_list = [format(ord(x), 'b') for x in string]
>>> binary_list
['1101000', '1100101', '1101100', '1101100', '1101111', '100000', '1110111', '1101111', '1110010', '1101100', '1100100']

ولإعادة تحويل القائمة السابقة إلى نص مرة أخرى يمكن أن تقوم بالتالي:


>>> ascii_string = ""	# هنا سيتم تخزين النص النهائي
>>> for binary_value in binary_list:
...     an_integer = int(binary_value, 2)	# تحويل كود Binary إلى النظام العشري (ascii code)
...     ascii_character = chr(an_integer)	# تحويل الحرف من ascii code إلى حرف نصي string
...     ascii_string += ascii_character		# إضافة الحرف إلى المتغير الأساسي
...
>>> print(ascii_string)
hello world

 

هل يمكن عمل هذا مع 8 byte مره واحده

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0
بتاريخ 12 دقائق مضت قال Mostafa mahmoud3:

هل يمكن عمل هذا مع 8 byte مره واحده

يمكن تقسيم المصفوفة بعد عملية التحويل إلى 8 Byte كالتالي:

_8_bytes = [binary_list[x:x+8] for x in range(0, len(binary_list), 8)]

أو يمكن تقسيم النص من البداية إلى قائمة list من النصوص والمرور على كل جزء على حدى كالتالي:

>>> string = 'hello world'
>>> list_of_string = [ string[i:i+8] for i in range(0, len(string), 8) ]
>>> list_of_string
['hello wo', 'rld']
>>> for item in list_of_string: 
...		print([format(ord(x), 'b') for x in item])
...
['1101000', '1100101', '1101100', '1101100', '1101111', '100000', '1110111', '1101111']
['1110010', '1101100', '1100100']

بعد ذلك يمكنك أن تقوم بجمع عناصر القائمة الناتجة في النهاية لتكون على شكل نص، كالتالي:

>>> string = 'hello world'
>>> list_of_string = [ string[i:i+8] for i in range(0, len(string), 8) ]
>>> list_of_string
['hello wo', 'rld']
>>> for item in list_of_string: 
...		print("".join([format(ord(x), 'b') for x in item]))
...
1101000110010111011001101100110111110000011101111101111
111001011011001100100

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0
بتاريخ 18 دقائق مضت قال سامح أشرف:

يمكن تقسيم المصفوفة بعد عملية التحويل إلى 8 Byte كالتالي:


_8_bytes = [binary_list[x:x+8] for x in range(0, len(binary_list), 8)]

أو يمكن تقسيم النص من البداية إلى قائمة list من النصوص والمرور على كل جزء على حدى كالتالي:


>>> string = 'hello world'
>>> list_of_string = [ string[i:i+8] for i in range(0, len(string), 8) ]
>>> list_of_string
['hello wo', 'rld']
>>> for item in list_of_string: 
...		print([format(ord(x), 'b') for x in item])
...
['1101000', '1100101', '1101100', '1101100', '1101111', '100000', '1110111', '1101111']
['1110010', '1101100', '1100100']

بعد ذلك يمكنك أن تقوم بجمع عناصر القائمة الناتجة في النهاية لتكون على شكل نص، كالتالي:


>>> string = 'hello world'
>>> list_of_string = [ string[i:i+8] for i in range(0, len(string), 8) ]
>>> list_of_string
['hello wo', 'rld']
>>> for item in list_of_string: 
...		print("".join([format(ord(x), 'b') for x in item]))
...
1101000110010111011001101100110111110000011101111101111
111001011011001100100

اخي انا اريد ان أقرأ ملف فيديو مثلا ثم وعمل مصفوفة كل خانة 8 byte مثل هذا

['111001011111110101001010101110011101010010101010100110010101010101001', '110110011111110101001010101110011101010010101010100110010101010101001', '110010011111110101001010101110011101010010101010100110010101010101001']

ثم اعيد تحويل هذه المصفوفة الي ملف فيديو يحمل اسم اخر يكن نسخة من الاول

هل يمكن ان تساعدني في هذا

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0
بتاريخ 44 دقائق مضت قال سامح أشرف:

يمكنك أن تقوم تحويل محتوى أي ملف من خلال bytearray كالتالي: 


>>> path = "C:\\Users\\sameh\\OneDrive\\Desktop\\image.png"	# مسار أي ملف
>>> file = open(path, mode='rb')
>>> content = file.read()
>>> allBytes = bytearray(content)
>>> eightBytes = [ allBytes[i:i+8] for i in range(0, len(allBytes), 8) ]
>>> binaryList = []
>>> for chunk in eightBytes:
...     eightBytesChunk = ''
...     for i in chunk:
...             eightBytesChunk += bin(i)[2:].zfill(8)
...     binaryList.append(eightBytesChunk)
>>> binaryList
['1000100101010000010011100100011100001101000010100001101000001010',
 '0000000000000000000000000000110101001001010010000100010001010010',
 '0000000000000000000000111000010000000000000000000000001001010001',
 '0000100000000110000000000000000000000000000111011100101001111001',
 '0001001100000000000000001000000000000000010010010100010001000001',
 '0101010001111000110110101110110010111101100001110111101100011011',
 '1101100101110101111111101111111111111101011001110111111010001001'

 ....

]

لاحظ أنه يجب قراءة الملف بوضع rb (read binary) في الدالة open

ولإعادة كتابة كود الـ binary إلى ملف جديد يمكنك أن تقوم بالتالي:


>>> # نقوم بتقسيم كل أكواد Binary إلى Bytes
>>> finalBinary = []
>>> lst = []
>>> for i in binaryList:
...     lst.append([ i[x:x+8] for x in range(0, len(i), 8) ])
...
>>> for i in lst:
...     for j in i:
...             finalBinary.append(j)
...
>>> finalBinary[0]
'10001001'

>>> # الدالة التالية تقوم بكتابة أرقم الـ Binary في ملف جديد
>>> def writer(stuff):
...     blob = int(stuff, 2).to_bytes(1, byteorder='big')
...     with open("C:\\Users\\sameh\\OneDrive\\Desktop\\image2.png", "a+b") as file:
...             file.write(blob)
...
>>> for strings in finalBinary:
...	writer(strings)
>>> 

بالطبع هذه الطريقة ليست عملية في نسخ الملفات لأنها تستغرق الكثير من الوقت، وفي الحالات العادية نستخدم المكتبات مجهزة مسبقًا لنسخ الملفات مثل دالة copyfile في حزمة shutil

شكراً اخي بارك الله فيك انا لا اريد النسخ مباشره إنما أريد ان اقوم ببعض العمليات على الكود قبل نقلة الي ملف اخر شكرا على المساعده

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن