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

کمک و پشتیبانی => نرم‌افزارهای فنی-مهندسی => نویسنده: oostaa در 03 آبان 1394، 06:26 ب‌ظ

عنوان: یه سوال پایتونی توسط یه مبتدی.
ارسال شده توسط: oostaa در 03 آبان 1394، 06:26 ب‌ظ
سلام دوستای گلم  .
من تو اوبونتو میخوام کارایی که تو پایین اوردمو روی یه فایل تکست که 5تا ستون و 100000 تا ردیف داره انجام بدم . اونطوری که فهمیدم این کارا رو پایتون میتونه راحت انجام بده . اگه کسی بتونه کمکم کنه ازش حسابی ممنون میشم  . #-


1.سطرهایی که ستون دومشان برابر است با 1 حذف شوند.
2. از سطرهای باقیمانده ،فقط 4000 تا سطر باقی بمانند و بقیه حذف شوند.
3.از بین سطرهایی که باقی مانده اند،سطری که ردیف پنجم آن بیشترین مقدار را دارد ،انتخاب و نمایش داده شود .
4.عدد ستون اول سطری که در گام 3 همین الگوریتم انتخاب شد منهای 4000 شود و نتیجه نمایش داده شود .

ممنونم ازتون . بسیار.


عنوان: پاسخ : یه کمک کوچولوی چن خطی . در پایتون .
ارسال شده توسط: koosha در 03 آبان 1394، 06:34 ب‌ظ
میتونید از ابزار های خط فرمان استفاده کنید .
اینها ابزار هایی هستند که میتونند کمکتون بکنند :
cut , tail ,
عنوان: پاسخ : یه کمک کوچولوی چن خطی . در پایتون .
ارسال شده توسط: Geek در 03 آبان 1394، 06:35 ب‌ظ
میشه یه نمونهٔ کوچیک از فایلی رو که می‌فرمایید ضمیمه کنید؟ اینطوری راحت‌تر میشه برنامه رو نوشت.
عنوان: پاسخ : یه کمک کوچولوی چن خطی . در پایتون .
ارسال شده توسط: فاروق در 03 آبان 1394، 08:17 ب‌ظ
به زبان فنگلیش بنویس هیچی نفهمیدم. یا اعداد رو به حروف بنویس
عنوان: پاسخ : یه کمک کوچولوی چن خطی . در پایتون .
ارسال شده توسط: oostaa در 03 آبان 1394، 08:21 ب‌ظ
میشه یه نمونهٔ کوچیک از فایلی رو که می‌فرمایید ضمیمه کنید؟ اینطوری راحت‌تر میشه برنامه رو نوشت.
یه نمونه از فایل به شکل زیره :

1  1  0 0 0
2  1 0.358  0.123  1
3  2  0.963  1  0.526
4  1  0.259  0.213  0.140
5  2  0.159  0.351  0.256
6  2  0.258 0.036  0.321
7  2  0.142  1.200  0.651
8  1  0.359  0.142  0.395
9  1  0.126  0.263 0.259
10  1  0.490  0.891 0.984
...

خود فایل حدود هفتاد گیگه .  ](*,)
عنوان: پاسخ : یه کمک کوچولوی چن خطی . در پایتون .
ارسال شده توسط: HSN6 در 03 آبان 1394، 10:09 ب‌ظ
برای جدا کردن اول از \n برای خطوط و از دوتا فاصله برای مقادیر سطرها استفاده کن. (حتماً می‌دونی که تابع جداکردن splitـه…) و با دوتا حلقه که یکی توی اون یکیه پیمایش کن و دیگه بقیه‌ش کاری نداره.
عنوان: پاسخ : یه کمک کوچولوی چن خطی . در پایتون .
ارسال شده توسط: oostaa در 03 آبان 1394، 10:20 ب‌ظ
برای جدا کردن اول از \n برای خطوط و از دوتا فاصله برای مقادیر سطرها استفاده کن. (حتماً می‌دونی که تابع جداکردن splitـه…) و با دوتا حلقه که یکی توی اون یکیه پیمایش کن و دیگه بقیه‌ش کاری نداره.

حسین اخه قضیه اینه که من اولین باریه که کارم به پایتون افتاده . و مشکل اینجاس که کارم عجله ایه و فرصت یادگرفتنشو هم ندارم . سریع باید به استاد گزارش داده ها رو بدم . وگرنه خودمم دوس دارم که پایتون یاد بگیرم . این چیزی که گفتی من ازش سر در نمیارم . متاسفانه . میشه بیشتر توضیح بدی ؟ممنونم ازت .  ](*,)
عنوان: پاسخ : یه کمک کوچولوی چن خطی . در پایتون .
ارسال شده توسط: فاروق در 03 آبان 1394، 10:22 ب‌ظ
نگید کمک کوچولی چند خطی.
این یعنی کاری که برنامه نویس واستون انجام میده کوچولو هست و ارزش چندانی نداره.
البته این نظر منه.
عنوان: پاسخ : یه کمک کوچولوی چن خطی . در پایتون .
ارسال شده توسط: oostaa در 03 آبان 1394، 10:37 ب‌ظ
نگید کمک کوچولی چند خطی.
این یعنی کاری که برنامه نویس واستون انجام میده کوچولو هست و ارزش چندانی نداره.
البته این نظر منه.
فاروق عزیز منظورم کوچیک بودن برنامه س . نه کوچیک بودن ارزش کار بچه ها . هر کسیکه به من کمک کنه قطعا منو مدیون خودش کرده . بدون شک . 
اما به خاطر اینکه سو برداشت نشه تیتر سوالو عوض میکنم .  ;)
عنوان: پاسخ : یه سوال پایتونی توسط یه مبتدی.
ارسال شده توسط: احمد حمزه ئی در 03 آبان 1394، 10:48 ب‌ظ
i = 0
max_num = 0
output = open('out.txt', 'w')

for line in open('file.txt'):
    s1, s2, s3, s4, s5, *tail = map(float, line.split())
   
    if s2 == 1: continue
   
    i += 1
    if i == 4000: break

    if s5 > max_num:
        max_num = s5
        found_line = line

    output.write(line)

output.close()
print('OUT3:', found_line.rstrip())
chu = found_line.split()
print('OUT4:', float(chu[0]) - 4000)

ورودی file.txt
خروجی out.txt

برای اون داده هایی که گذاشتید خروجی برنامه:
OUT3: 7  2  0.142  1.200  0.651
OUT4: -3993.0

و محتویات out.txt
3  2  0.963  1  0.526
5  2  0.159  0.351  0.256
6  2  0.258 0.036  0.321
7  2  0.142  1.200  0.651
عنوان: پاسخ : یه سوال پایتونی توسط یه مبتدی.
ارسال شده توسط: oostaa در 04 آبان 1394، 12:32 ق‌ظ
i = 0
max_num = 0
output = open('out.txt', 'w')

for line in open('file.txt'):
    s1, s2, s3, s4, s5, *tail = map(float, line.split())
   
    if s2 == 1: continue
   
    i += 1
    if i == 4000: break

    if s5 > max_num:
        max_num = s5
        found_line = line

    output.write(line)

output.close()
print('OUT3:', found_line.rstrip())
chu = found_line.split()
print('OUT4:', float(chu[0]) - 4000)

ورودی file.txt
خروجی out.txt

برای اون داده هایی که گذاشتید خروجی برنامه:
OUT3: 7  2  0.142  1.200  0.651
OUT4: -3993.0

و محتویات out.txt
3  2  0.963  1  0.526
5  2  0.159  0.351  0.256
6  2  0.258 0.036  0.321
7  2  0.142  1.200  0.651
احمد اقا ممنونم ازت . خیلی خیلی لطف کردی. دمت گرم .
عنوان: پاسخ : یه سوال پایتونی توسط یه مبتدی.
ارسال شده توسط: فاروق در 04 آبان 1394، 03:30 ب‌ظ
خواننده تیتر رو میبینه نه دلت رو.
خوبه حالا سوء برداشت نمیشه.
عنوان: پاسخ : یه سوال پایتونی توسط یه مبتدی.
ارسال شده توسط: oostaa در 04 آبان 1394، 06:13 ب‌ظ
سلام اقای حمزه ئی
کد بالایی رو همه ی فایلا  کار میکنه اما برا بعضی از اونا خطا میده . نمونه ی فایلو زیر همین جا اپلود کردم .
خطاش به صورت زیره  :
mhmud@mhmud-X55VD:~/Desktop/python$ python3 p.py
Traceback (most recent call last):
  File "p.py", line 20, in <module>
    print('OUT3:', found_line.rstrip())
NameError: name 'found_line' is not defined
فک میکنید مشکل کجاس ؟ بازم ممنون  .
عنوان: پاسخ : یه سوال پایتونی توسط یه مبتدی.
ارسال شده توسط: احسان فعالپور در 04 آبان 1394، 06:31 ب‌ظ
لابد توی یکی از سطر ها تون ۵امی وجود نداره
عنوان: پاسخ : یه سوال پایتونی توسط یه مبتدی.
ارسال شده توسط: oostaa در 04 آبان 1394، 07:54 ب‌ظ
لابد توی یکی از سطر ها تون ۵امی وجود نداره
فک نمیکنم . چون این فایل توسط نرم افزار شبیه سازی  ایجاد شده .
عنوان: پاسخ : یه سوال پایتونی توسط یه مبتدی.
ارسال شده توسط: احسان فعالپور در 04 آبان 1394، 08:29 ب‌ظ
خب با اجازه آقای حمزه ئی، من کد رو اینجوری تغییر دادم و الان دیگه مشکلش حل شده:

#!/usr/bin/python3.5
i=0
max_num=0
output=open('out.txt','w')
line_number=0
for l in open('./file.txt'):
line_number+=1
try:
s1,s2,s3,s4,s5,*tail=map(float,l.split())
if s2==1:
continue
i+=1
if i==4000:
break
if s5>max_num:
max_num=s5
found_line=l
output.write('line number in original file:'+str(line_number)+'\tData:'+found_line)
except ValueError:
print('error while reading line',line_number)
output.close()
print('out3:',found_line.rstrip())
ch=found_line.split()
print('out4:',float(ch[0])-4000)

این اصل فایله:

ehsan@ehsan-SVF152190X:~/Desktop/python$ cat -n file.txt |tail
  2691 7049 2 168.96 105.6 3.52
  2692 7050 2 172.48 105.6 3.52
  2693 7051 2 176 105.6 3.52
  2694 7052 2 179.52 105.6 3.52
  2695 7053 2 183.04 105.6 3.52
  2696 7054 2 186.56 105.6 3.52
  2697 7055 2 190.08 105.6 3.52
  2698 7056 2 193.6 105.6 3.52
  2699 7057 2 197.12 105.6 3.52
  2700

و اینم نتایج:

ehsan@ehsan-SVF152190X:~/Desktop/python$ ./simple.py
error while reading line 2700
out3: 4901 2 0 0 3.52
out4: 901.0

محتویات فایل خروجی:

ehsan@ehsan-SVF152190X:~/Desktop/python$ cat out.txt
line number in original file:543 Data:4901 2 0 0 3.52


البته الان فهمیدم یه سوتی هم دادم که اون این بود که اون خطی که اطلاعات رو توی فایل خروجی مینوشت باید میرفت داخل if آخر.(الان دیگه کد درسته)
عنوان: پاسخ : یه سوال پایتونی توسط یه مبتدی.
ارسال شده توسط: oostaa در 04 آبان 1394، 09:13 ب‌ظ
واقعا کیف کردم . دمت گرم . یه چیزی میگم از ته دل ، بادیدن ادمایی مثل شما و اقای حمزئی، ادمیزاد کلی به برنامه نویسی علاقه پیدا میکنه .
 ;)