"استشاري +": تغيير في تدفق المواد. الخطوط والأنماط ومحاذاة النص مع بيثون

"استشاري +" - نظام مرجعي للمحامين والمحاسبين وغيرهم. إنه يعمل بثبات مثل الساعة. في هذا المنشور ، يُقترح أن تضبط هذه الساعة قليلاً على احتياجاتك فيما يتعلق بإخراج النص ، وهي: انظر كيف يمكنك معالجة المعلومات النصية التي يقدمها النظام بيثون. على طول الطريق ، العمل مع عناصر النص المعلنة في العنوان.

الظل على السياج


كمحامي ، الذي عمل لفترة طويلة مع برنامج المساعدة "Consultant +" ، كنت دائماً أفتقد وظيفة عادية في هذا النظام. وكانت هذه الوظيفة على النحو التالي. عندما تظهر أي تغييرات في القانون التنظيمي ، ينشر موظفو K + نظرة عامة على التغييرات في شكل عمودين من النص:



العمود الموجود على اليسار هو ما كان عليه من قبل ، والعمود الموجود على اليمين هو المعيار الساري الآن. الآن (منذ بضع سنوات) ، تم تحديث الوظيفة وإبراز التغييرات بخط غامق ومرئي على الفور. هذا كل شيء مريح للغاية. ولكن هناك أشياء غير مريحة.

أولا ، لا يتم إعطاء بعض المعايير ، لأن حجمها كبير جدًا بالنسبة لموظفي K + وعليك الانتقال إلى روابط النظام ، وثانياً ، لا يمكنك فقط التقاط هذين العمودين ونسخهما عن طريق لصقهما في جدول إكسل أو كلمة عادي.

ربما تم ذلك عن قصد حتى يعمل المستخدمون بنشاط أكبر مع النظام ، بما في ذلك عدم نقل أي شيء من هناك.

حسنا يجب اصلاحها.

المهمة : نشر النص في عمودين ، حيثما كان ذلك ممكنًا وأين لا - قم فقط بإزالة القاعدة ووضع كل هذا في جدول بيانات Excel. في الوقت نفسه ، دعونا نرى كيف يمكنك تغيير الخط والمحاذاة وغيرها من تفاهات في النص باستخدام بيثون.

على سبيل المثال الذي يغذي برنامجنا المستقبلي ، نأخذ من K + التغييرات في قانون الشركات المساهمة العامة. غالبا ما يتم تغيير هذا القانون ، لذلك سيكون هناك عمل للقيام به.

احفظ التغييرات في ملف txt عادي (على سبيل المثال ، إصدار .txt). تحصل على شيء مثل التالي:



لذلك ، من الواضح أن كل تغيير يتم فصله عن الآخر بخط صلب ، والذي اتخذ بعد الحفظ شكل "؟؟؟". هناك أيضًا تغيير عنوان يجب حسابه. كل شيء يبدو بسيطا باستثناء بعض النقاط.

لذلك ، صادف التغييرات التي تحتوي على النموذج التالي:



بالإضافة إلى ذلك ، تتفاقم المسألة من خلال حقيقة أن التغييرات الفردية تختلف اختلافًا كبيرًا في الطول.

ننتقل إلى K +.


قم بإنشاء ملف consult.py جديد وأضف الأسطر الأولى إليه:

from __future__ import unicode_literals import codecs import openpyxl 

الوحدة النمطية openpyxl مألوفة بالفعل ، فهي تتيح لك العمل مع Excel ، لكن الآخران جديدان. وتتمثل مهمتها في معالجة الأحرف الروسية بشكل صحيح ، والتي غالبًا ما تتم قراءتها بشكل غير صحيح بواسطة البرامج.

مقدما ، قم بإنشاء ملف excel فارغ جديد خارج البرنامج ، مع تسميته على سبيل المثال revision2.xlsx. سنفتح هذا الملف مع برنامجنا ونكتب البيانات هناك. سيكون هذا هو ملفنا النهائي.
لذلك ، يفتح البرنامج ملف excel ، ويدخله:

 wb = openpyxl.load_workbook('2.xlsx') sheet=wb.get_active_sheet() x=1 y=0 test=[] test2=[] test3=[] 

أعلاه أيضًا ، نقوم بإنشاء 3 قوائم فارغة حيث سنجمع البيانات: اختبار ، اختبار 2 ، اختبار 3.

بعد ذلك ، في المتغير "a" ، سنضع كل شيء قد يقع في شكل اسم التغيير. في ذ - سيكون هناك خط فاصل. هو نفسه في الطول:

 a=('','','','','','','') y='?????????????????????????????????????????????????????????????????????????' 

الآن الجزء الممتع.
 with open ('.txt',encoding='cp1251') as f: lines = (line.strip() for line in f) for line in lines: if line.startswith(''): continue col1=line[:35] col2=line[39:] col3=line[35:39] if line.startswith(a): sheet.cell(row=x, column=1).value=line #   ,  .. sheet.cell(row=x, column=1).font=ft2 #sheet.cell(row=x, column=1).style='20 % - Accent3' x+=1 #  x+=2 elif line==None: continuewith open ('.txt',encoding='cp1251') as f: lines = (line.strip() for line in f) for line in lines: if line.startswith(''): continue col1=line[:35] col2=line[39:] col3=line[35:39] if line.startswith(a): sheet.cell(row=x, column=1).value=line #   ,  .. x+=1 #  x+=2 elif line==None: continue 

لقد فتحنا ملف cp1251 المشفر. txt. تم مسح كل سطر من المسافات من النهاية والبداية بواسطة طريقة الشريط.

إذا كان السطر يبدأ بكلمة "old" ، فإننا نتخطاها. لماذا نحتاج إلى الحفاظ على "القديم" و "الجديد" ، وهذا واضح بالفعل. بعد ذلك ، نقسم السطر: من البداية إلى 35 حرفًا ومن 39 حرفًا إلى النهاية. وهذا هو ، نحن القضاء على الفجوة في الوسط:



نضع محتويات الفضاء في منتصف السطر في col3 ، لأنه قد لا تكون مسافة إذا كان التغيير مكتوبًا في سطر واحد على التوالي:



علاوة على ذلك ، إذا كان السطر يبدأ برأس التغيير (لقد كتبنا هذه الرؤوس إلى متغير أ) ، فسنكتب هذا السطر على الفور للتفوق دون أي تقسيم وإضافة السطر - x + = 1 (أو x = x + 1). الخطوط الفارغة ، الذي صادفنا ، نفتقد.

النظر في مقتطف الشفرة التالي:

 if len(col2)==0: #   1-     2- if line.startswith(a): continue test2.append(col1) #test3.append(col1) if col3==' ' and col2!=None: test.append(line[:35]) test2.append(line[39:]) if col3!=' ' and line!=y and len(line)>60: #print(test3) test3.append(line) if line==y: #   ,   if test!=None: sheet.cell(row=x, column=1).value=(' '.join(test).strip('\?')) sheet.cell(row=x, column=1).font=ft sheet.cell(row=x, column=1).alignment=al sheet.cell(row=x, column=2).value=(' '.join(test2).strip('\?')) sheet.cell(row=x, column=2).font=ft sheet.cell(row=x, column=2).alignment=al test=[] test2=[] x+=1 if len(test3)>0: #print(len(test3)) sheet.cell(row=x, column=2).value=(' '.join(test3).strip('\?')) sheet.cell(row=x, column=2).font=ft sheet.cell(row=x, column=2).alignment=al test3=[] x+=1 else: continue 

إذا كان طول جزأين من السلسلة هو 0 ، فهذا يعني أنه غير موجود ، ثم test2 يحصل على الجزء الأول من السلسلة. إذا كان هناك مسافة في السطر ، ولكن الجزء الثاني من الخط غائب ، فإن الجزء الأول والثاني من السطر ، على التوالي ، يقعان في الاختبار والاختبار 2.

إذا كان هناك مسافة في السطر ، والخط غير فارغ ويبلغ طوله أكثر من 60 حرفًا ، فسيتم إضافته إلى test3.

إذا كان الخط فارغًا ، فقد مررنا بالتغيير بأكمله ، ثم نكتب كل شيء نجمعه في خلايا excel ، ونفحص الفراغ في الاختبار في وقت واحد (بحيث لا يكون فارغًا) وطول test3.

أخيرًا ، احفظ ملف excel:

 wb.save('2.xlsx') 

الأنماط والخط ومحاذاة النص في الثعبان


أضف بعض الجمال إلى طاولتنا.

على وجه الخصوص ، سوف نجعلها بحيث عند إخراج البيانات ، يتم تمييز رؤوس التغيير بخط غامق ، والنص نفسه أصغر وتنسيقه لسهولة القراءة.
بيثون يسمح لك أن تفعل هذا. للقيام بذلك ، نحتاج إلى إضافة وتغيير الكود في الأماكن التي نسجل فيها النتائج في ملف excel:

 from openpyxl.styles import Font, Color,NamedStyle, Alignment 

 al= Alignment(horizontal="justify", vertical="top") ft = Font(name='Calibri', size=9) ft2 = Font(name='Calibri', size=9,bold=True) 

 if line.startswith(a): sheet.cell(row=x, column=1).value=line #   ,  .. sheet.cell(row=x, column=1).font=ft2 

 if line==y: #   ,   if test!=None: sheet.cell(row=x, column=1).value=(' '.join(test).strip('\?')) sheet.cell(row=x, column=1).font=ft sheet.cell(row=x, column=1).alignment=al sheet.cell(row=x, column=2).value=(' '.join(test2).strip('\?')) sheet.cell(row=x, column=2).font=ft sheet.cell(row=x, column=2).alignment=al 


 if len(test3)>0: #print(len(test3)) sheet.cell(row=x, column=2).value=(' '.join(test3).strip('\?')) sheet.cell(row=x, column=2).font=ft sheet.cell(row=x, column=2).alignment=al 

هذا هو ، في الواقع ، أضفنا فقط الأساليب المطبقة .font و. المحاذاة.

استغرق البرنامج بأكمله النموذج:

قانون
 from __future__ import unicode_literals import codecs import openpyxl from openpyxl.styles import Font, Color,NamedStyle, Alignment """ 1.  Consultant+   ,    .txt  ?????????????????????????????????????????????????????????????????????????   15  1  48     15)    15)     excel    .  word      - txt  : .txt  : 2.xlsx """ #file = open ( '2.txt', 'w',encoding='cp1251', newline = '\n') wb = openpyxl.load_workbook('2.xlsx') sheet=wb.get_active_sheet() x=1 y=0 test=[] test2=[] test3=[] a=('','','','','','','') y='?????????????????????????????????????????????????????????????????????????' #  #al= Alignment(horizontal="distributed", vertical="top") al= Alignment(horizontal="justify", vertical="top") ft = Font(name='Calibri', size=9) ft2 = Font(name='Calibri', size=9,bold=True) with open ('.txt',encoding='cp1251') as f: lines = (line.strip() for line in f) for line in lines: if line.startswith(''): continue col1=line[:35] col2=line[39:] col3=line[35:39] if line.startswith(a): sheet.cell(row=x, column=1).value=line #   ,  .. sheet.cell(row=x, column=1).font=ft2 #sheet.cell(row=x, column=1).style='20 % - Accent3' x+=1 #  x+=2 elif line==None: continue #print (line) #print (len(col2)) if len(col2)==0: #   1-     2- if line.startswith(a): continue test2.append(col1) #test3.append(col1) if col3==' ' and col2!=None: test.append(line[:35]) test2.append(line[39:]) if col3!=' ' and line!=y and len(line)>60: #print(test3) test3.append(line) if line==y: #   ,   if test!=None: sheet.cell(row=x, column=1).value=(' '.join(test).strip('\?')) sheet.cell(row=x, column=1).font=ft sheet.cell(row=x, column=1).alignment=al sheet.cell(row=x, column=2).value=(' '.join(test2).strip('\?')) sheet.cell(row=x, column=2).font=ft sheet.cell(row=x, column=2).alignment=al test=[] test2=[] x+=1 if len(test3)>0: #print(len(test3)) sheet.cell(row=x, column=2).value=(' '.join(test3).strip('\?')) sheet.cell(row=x, column=2).font=ft sheet.cell(row=x, column=2).alignment=al test3=[] x+=1 else: continue wb.save('2.xlsx') 


لذلك ، في النهاية ، بعد معالجة الملف من خلال البرنامج ، لدينا جدول لائق إلى حد ما مع تغييرات في القانون:



يمكن تنزيل البرنامج من الرابط - هنا .
مثال ملف للمعالجة من قبل البرنامج هنا .

Source: https://habr.com/ru/post/ar465229/


All Articles