• 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

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

 

 

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

 

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


رابط هذه المساهمة
  • 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
1 شخص أعجب بهذا

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


رابط هذه المساهمة
  • 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', '!')

الناتج:

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

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

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

 

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

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


رابط هذه المساهمة
  • 0

جزيل شكري ..

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

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

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

# ^^^^^^^

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

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

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

 

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

 

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


رابط هذه المساهمة
  • 0
بتاريخ 11 ساعات قال أسماء فؤاد:

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

نعم.

عند استخدام بايثون2 ليس من الضروري تحديد نوع التشفير.

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

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


رابط هذه المساهمة

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

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

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


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

تسجيل الدخول

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


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