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

مشكلة في القراءة من ملف - بايثون

أسماء فؤاد

السؤال

مرحبا ..

سؤال من مرحلة ابتدائية :)

لما اكتب كود بلغة البايثون ع اساس انه يقرأ من ملف txt : و هذا جزء من النص اللي فيه المشكلة :1‪!‬2‪!‬3

اذا نسخت النص و لصقته في ملف txt و حفظته و عملت run تطلع نتيجة ال run طبيعية ['1', '2', '3']

لكن اذا كتبت ملف ال txt  يدوياً و حفظته تطلع النتيجة بالشكل دا

l ['1\xe2\x80\xaa', '\xe2\x80\xac2\xe2\x80\xaa', '\xe2\x80\xac3'] l

للارقام فقط ، أما الحروف تطلع عادية ['a', 'b', 'c'] للنص a!b!c

اذا عملت print "\xe2\x80\xac".decode("utf-8")l تطلع النتيجة ع انها سطر او مسافة ،نفس الشي ل \xe2\x80\xaa

 اللاب توب :ماك 

البيئة : pycharm

النسخة : ٢.٧  الموجود ع الماك 

 

 

لكم الشكر مسبقاً ..

 

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

Recommended Posts

  • 2

أولا: عند كتابة هذا النوع من الأسئلة يجب كتابة الكود أو (الجزء ذو المشكلة من الكود)، أيضا يفضّل ارفاق ملف النص ذو المشكلة.

 

السؤال ليس سؤال مرحلة ابتدائية أبدا.

هذا بسبب اليونيكود و طريقة كتابة اللغة العربية.

كما هو معروف اللغة العربية و بعض اللغات الأخرى تكتب من اليمين الى اليسار بعكس اللغة الإنجليزية.

لكي يقوم الحاسب الآلي بكتابة الحروف العربية(مثلا) بطريقة صحيحة تم إستعمال حروف/رموز خاصة غير مرئية تخبر البرنامج بأنه يجب تغيير اتجاه الكتابة من هنا، ومنها:

\xe2\x80\xaa (U+202A) -> LEFT-TO-RIGHT
\xe2\x80\xab (U+202B) -> RIGHT-TO-LEFT
\xe2\x80\xac (U+202C) -> POP DIRECTIONAL FORMATTING اعادة الوضع الإفتراضي

**وغيرها.

 من أسباب ظهور هذه الرموز عند التشغيل الملف:

1-ملف النص باللغة العربية وهذا الجزئ باللغة الإنجليزية.

2-أن هذه الأرقام مسجلة كرموز عربية بسبب لوحة المفاتيح. (لهذا السبب يتم تجاهل رموز التحويل عند النسخ ).

----------------------------

اذا كانت المشكلة بسبب لوحة المفاتيح: تستطيع عمل فلتر داخل البرنامج اذا كان هذا لا يؤثر على إتجاه النص.

 

إذا كنت تريدين معرفة المزيد بهذا الشأن تستطيعين البحث عن اليونيكود(Unicode) وكيفية عمله.

روابط:

Bi-directional_text

Unicode

تم التعديل في بواسطة Amjad Alsharafi
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ On ١٥‏/٨‏/٢٠١٨ at 09:42 قال أسماء فؤاد:

اذا كتبت ملف ال txt  يدوياً و حفظته تطلع النتيجة بالشكل دا

l ['1\xe2\x80\xaa', '\xe2\x80\xac2\xe2\x80\xaa', '\xe2\x80\xac3'] l

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

ليش تطلع نتيجة ال run بهذا الشكل عند كتابة الملف يدوياً وحفظه بينما تظهر ['1', '2', '3'] اذا نسخت بيانات الملف و الصقتها و حفظت الملف؟؟

مالمشكلة و كيف احلها ؟

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

  • 0

اشكر لك ردك .. جداً amjad alsharafi

فعلاً هو بسبب حفظ الملف باتجاه الكتابة من اليمين لليسار

بتاريخ On 8/20/2018 at 19:43 قال Amjad Alsharafi:

اذا كانت المشكلة بسبب لوحة المفاتيح: تستطيع عمل فلتر داخل البرنامج اذا كان هذا لا يؤثر على إتجاه النص.

اذا ممكن تشرح لي هذا الجزء، فضلاً..

كيف اعمل فلتر ؟

النص الموجود بداخل الملف:

١!٢!٣

٢!٣!٤

٣!٤!٥

آو ارقام انجليزية محفوظة باتجاه من اليمين لليسار 

عملتها بهذا الشكل:

def parse (file,x=";",y="#"):
    f = open(file).readlines()
    result = []
    for line in f:
        if line[0] == y:
            continue
        else:
            line = line.strip()
            line = line.split(x)
            temp = []
            for element in line:
                element = element.replace("\xe2\x80\xaa", "")
                element = element.replace("\xe2\x80\xac", "")
                element = element.replace("\xe2\x80\xab", "")
                if "\xd9" in element:
                    temp.append(arabic_num(element))
                else:
                    temp.append(element)
            result.append(temp)
    return result



print parse('file.txt', '!', '#'),"\n"

هل تقصد شيء آخر؟ اوحل آخر

ليس لدي الكثير من المعرفة حتى الآن

 

 

سؤال متعلق .. 

 

إذا عملت 

def parse_1 (file,x=";",y="#"):
    f = open(file).readlines()
    for line in f:
        print "\n",line #string
        line = line.strip()
        line = line.split(x)
        print line #list
        for element in line:
            print(element)

تكون النتيجة

١!٢!٣

['\xd9\xa1\xe2\x80\xab', '\xe2\x80\xac\xd9\xa2\xe2\x80\xab', '\xe2\x80\xac\xd9\xa3']
١‫
‬٢‫
‬٣

٢!٣!٤

['\xd9\xa2\xe2\x80\xab', '\xe2\x80\xac\xd9\xa3\xe2\x80\xab', '\xe2\x80\xac\xd9\xa4']
٢‫
‬٣‫
‬٤

٣!٤!٥

['\xd9\xa3\xe2\x80\xab', '\xe2\x80\xac\xd9\xa4\xe2\x80\xab', '\xe2\x80\xac\xd9\xa5']
٣‫
‬٤‫
‬٥

بمعنى انه من الممكن ان يطبع الارقام العربية او باتجاه من اليمين الا اذا دخلت في list هنا تحدث المشكلة

أي تفسير ؟ أو حل ؟

 

جزيت عني الجنة ..

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

  • 0
بتاريخ 21 ساعات قال أسماء فؤاد:

هل تقصد شيء آخر؟ اوحل آخر

لا، الحل جيد.

تستطيعين اختصار بعض السطور:


# element = element.replace("\xe2\x80\xaa", "")
# element = element.replace("\xe2\x80\xac", "")
# element = element.replace("\xe2\x80\xab", "")

# translate يستخدم للتبديل بين الحروف لكن يمكن حذف الحروف غيرالمرغوبة
#			.عن طريق وضعها في الخانة الثانية
element = element.translate(None, "\xe2\x80\xaa" + "\xe2\x80\xac" + "\xe2\x80\xab")

 

بالنسبة لمشكلة عدم ظهور الحروف العربية داخل القائمة(list)، فلم أجد تفسيرا لها، لكن هناك حل.

يبدو أن المشكلة غير موجودة في نسخة البايثون3 (Python3).

#Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:54:40) [MSC v.1900 64 bit (AMD64)] on win32

def parse_1 (file, x=";", y="#"):
	
    f = open(file, encoding='utf-8').readlines()
    #			^^^^^^^
    # .يجب تحديد طريقة التشفير التي يجب قراءة الملف بها
    # .	من الممكن أن يتم قراءة الملف بشك خاطئ اذا تم استعمال التشفير التلقائي

    for line in f:
        if line[0] == y:
            continue

        line = line.strip()
        print(line) #string
        line = line.split(x)
        print(line) #list
        for element in line:
            print(element)
            
		print()
        
parse_1('arabic.txt', '!')

الناتج:

١!٢!٣
['١', '٢', '٣']
١
٢
٣

٢!٣!٤
['٢', '٣', '٤']
٢
٣
٤

٣!٤!٥
['٣', '٤', '٥']
٣
٤
٥

 

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

  • 0

جزيل شكري ..

بالنسبة للسؤال الثاني 

بتاريخ 5 ساعات قال Amjad Alsharafi:

f = open(file, encoding='utf-8').readlines()l

# ^^^^^^^

# .يجب تحديد طريقة التشفير التي يجب قراءة الملف بها

# . من الممكن أن يتم قراءة الملف بشك خاطئ اذا تم استعمال التشفير التلقائي

لما غيرت السطر إلى المذكور ظهر لي هذا الخطأ التالي :
TypeError: 'encoding' is an invalid keyword argument for this function

 

او انه خاص بنسخة البايثون٣ ؟

 

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

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...