انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: الگو دادن به اسکریپت پایتون برای پیدا کردن قسمتی خاص در متن(حل شد)  (دفعات بازدید: 3600 بار)

0 کاربر و 2 مهمان درحال مشاهده موضوع.

آفلاین Nelliel

  • High Hero Member
  • *
  • ارسال: 2151
  • جنسیت : پسر
  • Nelliel Tu Odelschwanck
سلام

دارم یه اسکریپت می‌نویسم که سورسش این شده تا الان:
#!/bin/python3

# Import needed modules
import sys
import os
import re

# clear Screen
os.system("clear")

# Get Video and Sub from Argument
subtitle = (sys.argv[1])
video = (sys.argv[2])

# Get key from user
key_ints = input("What is your Key? ")

# open file and read it
with open(subtitle, 'r') as open_read:
    for line in open_read:
        if key_ints in line:
            print(line)
           

قسمت آخر سورس ما هر کلمه‌ای را که به عنوان key_input داده ایم پیدا می‌کند برای مثال:

[hossein@ArchLinux Scripts]$ ./subvid Gods.of.Egypt.2016.1080p.WEB-DL.DD5.1.H264-RARBG.srt go.go
What is your Key? help
He'll help us with our task.

i need your help. Please!

I thought he was helping you.

please, help us!

Let me help you.

thoth for help.

But you have to help us!

I didn't want her help.

My duty was to help

I'm helping horus.

he's going to help us.

get you to help him?

Perhaps we can help her.

she's trying to help us.

i ask for your help.

want to help her.

to go help a friend.

[hossein@ArchLinux Scripts]$


حالا من می‌خوام به آن الگویی دهم که به جای این که خط را برای من چاپ کند برود و آخرین قسمت عددی را برای من چاپ کند منظورم اینه که اگر کلمه‌ی Egypt را به عنوان Key_input دادم به جای اینکه اون خط را چاپ کند عبارت 00:01:05,499 --> 00:01:08,500 را چاپ کند که آخرین خط عددی من هست, متن اصلی این است:
00:01:05,499 --> 00:01:08,500
<i> Egypt was the birthplace</i>
<i> of all life.</i>

اما اسکریپت من فقط Egypt was the birthplace را چاپ می‌کند!


« آخرین ویرایش: 06 خرداد 1395، 12:30 ب‌ظ توسط حسین حیدری »
طرفدار انیمه و مانگا - کاربر آرچ لینوکس

آفلاین Geek

  • High Hero Member
  • *
  • ارسال: 1116
  • جنسیت : پسر
  • The answer to life the universe and everything: 42
می‌تونی از counter استفاده کنی. (تنها راه نیست، ولی چیزی هست که سریع به ذهنم رسید...)

myfile = file("/home/geek/Desktop/mysub","r")
mystrings  = myfile.readlines()
c = 0
for i in mystrings:

if 'Egypt' in i:
print mystrings[c-1]
c = c + 1


تا جایی که تست کردم درست کارکرده...

آفلاین Geek

  • High Hero Member
  • *
  • ارسال: 1116
  • جنسیت : پسر
  • The answer to life the universe and everything: 42
الان ۲ بار مجبور شدم کدی رو که گذاشتم اصلاح کنم! یکی اینکه حین تست Iran رو نوشته بودم و دیگه اینکه یه print c هم برای trace کردن.

آفلاین Nelliel

  • High Hero Member
  • *
  • ارسال: 2151
  • جنسیت : پسر
  • Nelliel Tu Odelschwanck
می‌تونی از counter استفاده کنی. (تنها راه نیست، ولی چیزی هست که سریع به ذهنم رسید...)

myfile = file("/home/geek/Desktop/mysub","r")
mystrings  = myfile.readlines()
c = 0
for i in mystrings:

if 'Egypt' in i:
print mystrings[c-1]
c = c + 1


تا جایی که تست کردم درست کارکرده...

بهتر نیست یک الگو باشه؟! حالا شما فکر کن مثلا عدد باشه بعد 4 خط بعدش هم جمله باشه تا دوباره به عدد برسه! این Eygpt یک مثال بود در کل دنبال راهی هستم که حجت را تمام کنه  ;)
طرفدار انیمه و مانگا - کاربر آرچ لینوکس

آفلاین فاروق

  • Hero Member
  • *
  • ارسال: 992
  • جنسیت : پسر
  • <شعار>این یک شعار است</شعار>
    • تارنمای فاروق
تمام متون تگ ‏‎‎‏ و ‏‎‎‏ رو دارن؟
http://pcworms.blog.ir
بعد از بررسی پست های قدیمیم، فکر میکنم یک عذرخواهی بدهکارم! معذرت میخوام و اگر اشتباه کردم مستقیم و روشن راهنمایی کنید تا تکرار نکنم.
کانال IRC

آفلاین Nelliel

  • High Hero Member
  • *
  • ارسال: 2151
  • جنسیت : پسر
  • Nelliel Tu Odelschwanck
تمام متون تگ ‏‎‎‏ و ‏‎‎‏ رو دارن؟

زیرنویس هستند دیگر, بله دارند البته توفیقی هم نمی‌کنه چون تابع get text را داریم :)
طرفدار انیمه و مانگا - کاربر آرچ لینوکس

آفلاین Geek

  • High Hero Member
  • *
  • ارسال: 1116
  • جنسیت : پسر
  • The answer to life the universe and everything: 42
نکته: زیرنویسی که من روش کار کردم Line Ending یونیکس/لینوکسی داشته (زیرنویس ضمیمه شد).

myaddress = '/home/geek/Desktop/mysub2'
myfile = open(myaddress,'r')
with open(myaddress) as f:
    mysum = sum(1 for _ in f)

myprimary = []
mymain = []

for i in xrange(mysum + 1):
mystr = myfile.readline()

if '-->' in mystr:
myprimary.append(mystr)

while True:
mystr = myfile.readline()
if mystr == '\n':
break
else:
myprimary.append(mystr)
mymain.append(myprimary)
myprimary = []

for i in mymain:
for j in i:
if 'biology' in j:
print i[0]





خروجی در واقع یه لیست اصلی هست که چندین زیرلیست داره و عنصر اول هرکدوم از این زیرلیست‌ها زمان شروع و خاتمه جملاتی هست که در اون لیست واقع شده!...

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

شایدم بگی اومدیم و یه جمله --> توش بود! حالا چیکار کنیم؟
فکر کنم راه حلش ساده باشه، تا جایی که من دیدم (اینم در نظر بگیر که اهل فیلم نیستم و بنابراین زیرنویس‌های کمی دیدم!!) قسمت زمان‌بندی زیرنویس یه طول مشخصی داره و همچنین --> در پوزیشن خاصی قرار می‌گیره که میشه از اینا کمک گرفت...


آفلاین Nelliel

  • High Hero Member
  • *
  • ارسال: 2151
  • جنسیت : پسر
  • Nelliel Tu Odelschwanck
سلام

کد را تبدیل کردم به پایتون 3 و اجرا کردم.

سورس:

#!/bin/python3
myaddress = '/home/hossein/Scripts/mysub2'
myfile = open(myaddress,'r')
with open(myaddress) as f:
    mysum = sum(1 for _ in f)

myprimary = []
mymain = []

for i in range(mysum + 1):
mystr = myfile.readline()

if '-->' in mystr:
myprimary.append(mystr)

while True:
mystr = myfile.readline()
if mystr == '\n':
break
else:
myprimary.append(mystr)
mymain.append(myprimary)
myprimary = []

for i in mymain:
for j in i:
if 'biology' in j:
print(i[0])


خطا:

runfile('/home/hossein/Scripts/subtest.py', wdir='/home/hossein/Scripts')
Traceback (most recent call last):

  File "<ipython-input-2-c562019338cb>", line 1, in <module>
    runfile('/home/hossein/Scripts/subtest.py', wdir='/home/hossein/Scripts')

  File "/usr/lib/python3.5/site-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 714, in runfile
    execfile(filename, namespace)

  File "/usr/lib/python3.5/site-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 89, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "/home/hossein/Scripts/subtest.py", line 5, in <module>
    mysum = sum(1 for _ in f)

  File "/home/hossein/Scripts/subtest.py", line 5, in <genexpr>
    mysum = sum(1 for _ in f)

  File "/usr/lib/python3.5/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 689: ordinal not in range(128)

تازه اگر کار کنه باید یه جوری اضافش کنم به اسکریپت خودم .... که فعلا این بحث را می‌ذاریم برای بعد :)
طرفدار انیمه و مانگا - کاربر آرچ لینوکس

آفلاین Geek

  • High Hero Member
  • *
  • ارسال: 1116
  • جنسیت : پسر
  • The answer to life the universe and everything: 42
پس چرا برای من داره با پایتون ۳ مثل ساعت کار می‌کنه؟

آفلاین Nelliel

  • High Hero Member
  • *
  • ارسال: 2151
  • جنسیت : پسر
  • Nelliel Tu Odelschwanck
پس چرا برای من داره با پایتون ۳ مثل ساعت کار می‌کنه؟

برای من به این خط گیر میده:

mysum = sum(1 for _ in f)
ویرایش:

جا داره همین‌ جا احسان فعالپور را صدا بزنم :)
طرفدار انیمه و مانگا - کاربر آرچ لینوکس

آفلاین Geek

  • High Hero Member
  • *
  • ارسال: 1116
  • جنسیت : پسر
  • The answer to life the universe and everything: 42
اونو الان چک می‌کنم ولی آدرس مفسر اینجا نیست؟

/usr/bin/python3
یا تو آرچ اون آدرسی هست که گذاشتی؟

آفلاین Geek

  • High Hero Member
  • *
  • ارسال: 1116
  • جنسیت : پسر
  • The answer to life the universe and everything: 42
اون کد رو می‌تونی با این جایگزین کنی:

with open(myaddress) as f:
    mysum = len(f.readlines())

آفلاین Nelliel

  • High Hero Member
  • *
  • ارسال: 2151
  • جنسیت : پسر
  • Nelliel Tu Odelschwanck
اونو الان چک می‌کنم ولی آدرس مفسر اینجا نیست؟

/usr/bin/python3
یا تو آرچ اون آدرسی هست که گذاشتی؟

با جفتش کار می‌کنه ....
طرفدار انیمه و مانگا - کاربر آرچ لینوکس

آفلاین hamidrezakp

  • Sr. Member
  • *
  • ارسال: 432
  • جنسیت : پسر
  • Life is Good With GNU/Linux
    • Hamidrezakp Web Site
سلام بفرمایید اینم برنامه :
#!/bin/python3

# Import needed modules
import sys
import os
import re

# clear Screen
os.system("clear")

# Get Video and Sub from Argument
subtitle = (sys.argv[1])
video = (sys.argv[2])

# Get key from user
key_ints = input("What is your Key? ")

# Saving line time in this variable
subLineNum = ''

# open file and read it
with open(subtitle, 'r') as open_read:
    for line in open_read:
        if "<--" in line[0:17] or "-->" in line[0:17]:
            subLineNum = line
        else:
            if key_ints in line:
                print(subLineNum)
HamidRezaKP.ir
Any fool can write code that a computer can understand. Good programmers write code that humans can understand.

آفلاین Nelliel

  • High Hero Member
  • *
  • ارسال: 2151
  • جنسیت : پسر
  • Nelliel Tu Odelschwanck
اون کد رو می‌تونی با این جایگزین کنی:

with open(myaddress) as f:
    mysum = len(f.readlines())


مشکل از کدینگ زیرنویس شماست با زیرنویس خودم تست کردم و سالم کار کرد :)
طرفدار انیمه و مانگا - کاربر آرچ لینوکس