ورود

View Full Version : کار با بافرها و نوع داده memoryview



ASedJavad
شنبه 28 شهریور 1394, 16:43 عصر
سلام
تو محیط ویندوز یک فایل اگزه دارم که دارای یک تکست باکس هست. و من میخوام متن درون این تکسن باکس رو بدست بیارم. مطابق شکل زیر:

135327

برای استخراج متنش، تابع زیر رو نوشتم:


from win32gui import SendMessage
from win32con import EM_GETLINE
def getText(h,LineNumber):
b=b' '*255
buffer=memoryview(b)
x= SendMessage(h,EM_GETLINE,LineNumber,buffer)
return (bytes(buffer[0:2*x]))

خود تابع، به نظر درست کار میکنه، اما متن استخراج شده، دقیقا اونی نیست که من میخوام. برا متون فارسی، که کلا یه چیز دیگه خروجی میده و برا متون انگلیسی، یه فاصله قبل از هر کاراکتر درج میکنه:

135328

خود فایل اگزه مورد نظر رو هم ضمیمه میکنم که اگه کسی خواست، بتونه تست کنه:

َAhmad Hamzeei
شنبه 28 شهریور 1394, 20:14 عصر
برای انگلیسی میتونی از فاصله ها صرف نظر کنی:

>>> s='s a l a m'
>>> s[::2]
'salam'

ویرایش: الان کامل تست کردم تو فارسیش یکی در میون یه dash میده
اون رو با دستور قبلی حذف میکنی
بعد به ازای هر کاراکتر فارسی یه کاراکتر دیگه میده که میتونی یه دیکشنری درست کنی و کاراکتر ها رو جایگزین کنی
مثلا من زدم "سسس" خروجی که داد اینه:

3-3-3-
یعنی به جای "س" کاراکتر "3" رو میده.

َAhmad Hamzeei
شنبه 28 شهریور 1394, 21:15 عصر
اینم کدش خدمت شما:

from win32gui import SendMessage
from win32con import EM_GETLINE

def fixText(text):
farsi_chr = {39 : 'ا', 40 : 'ب', 126 : 'پ', 42 : 'ت', 43 : 'ث', 44 : 'ج'
, 134 : 'چ', 45 : 'ح', 46 : 'خ', 47 : 'د', 48 : 'ذ', 49 : 'ر'
, 50 : 'ز', 152 : 'ژ', 51 : 'س', 52 : 'ش', 53 : 'ص', 54 : 'ض'
, 55 : 'ط', 56 : 'ظ', 57 : 'ع', 58 : 'غ', 65 : 'ف', 66 : 'ق'
, 169 : 'ک', 175 : 'گ', 68 : 'ل', 69 : 'م', 70 : 'ن', 72 : 'و'
, 71 : 'ه', 74 : 'ي'}
is_english = True if text[1] == 0 else False
fixed_chars = map(chr, text[::2]) if is_english else map(lambda x: farsi_chr[x], text[::2])
return ''.join(fixed_chars)

def getText(h,LineNumber):
b=b' '*255
buffer=memoryview(b)
x= SendMessage(h,EM_GETLINE,LineNumber,buffer)
return fixText(bytes(buffer[0:2*x]))



اینم نتیجه تستی که گرفتم:
135335

ASedJavad
شنبه 28 شهریور 1394, 22:35 عصر
اینم کدش خدمت شما:

ممنون از لطفتون.
اما مشکلی که هست اینه که این فایل اگزه ای که خدمتتون فرستادم، فقط یک نمونه برا تسته.
تو برنامه اصلی که قراره متن رو از توش بخونم، انواع کاراکترهای یونیکد توش پیدا میشه. (صرفا فارسی و انگلیسی نیست)
و منطقی نیست که برا تک تک کاراکترها، بیایم معادلش رو پیدا کنیم و جایگزین کنیم.

ASedJavad
جمعه 03 مهر 1394, 15:55 عصر
خب، خودم درستش کردم :)

def getText(h,LineNumber):
b=b' '*255
buffer=memoryview(b)
x= SendMessage(h,EM_GETLINE,LineNumber,buffer)
a=bytes(buffer[0:2*x])
lst=[]
for i in range(0,len(a),2):
tmp=int.from_bytes(a[i:i+2],'little')
lst.append(chr(tmp))
return ''.join(lst)