اذهب إلى المحتوى
  • 0

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

Mostafa mahmoud3

السؤال

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

11111110101001010101110011101010010101010100110010101010101001

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

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

Recommended Posts

  • 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

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

  • 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

 

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

  • 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 مره واحده

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

  • 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

 

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

  • 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']

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

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

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

  • 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

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

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

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...