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

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

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

نویسنده موضوع: [پایتون]-پردازش فایل  (دفعات بازدید: 2344 بار)

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

آفلاین سالار مقدم

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 2074
  • جنسیت : پسر
  • هر چقدر بدونی بازم کمه.
    • سالار مقدم
[پایتون]-پردازش فایل
« : 15 دی 1392، 01:18 ب‌ظ »
سلام دوستان
من می تونم پرونده ای با دسترسی ترتیبی ایجاد کنم و توش بنویسم و بخونم ولی بلد نیستم ویرایشش کنم، تو فایل های باینری هم که پرتم. برای همین کلی گوگل کردم ولی متوجه نشدم که چجوری باید این کارو بکنم، فقط فهمیدم باید از یه ماژول و دو تابع استفاده کنم و فایل رو باز نویسی کنم. کارایی که می خوام بکنم به شرح زیره:
--در پرونده ای با دسترسی ترتیبی--
۱-پیدا کردن خط خاص
۲-رفتن به خط خاص
۳-ویرایش اون خط
--در پرونده ی دودویی---
--همه ی موارد بالا + ایجادش
میدونم سوالم خیلی کلیه ولی متوجه نشدم
نکته ی جالب اینجاست که از کلی دوست برنامه نویس که پرسیدم هیچ کدوم نتونستن جواب بدن و گفتن که ما کار نکردیم چون کار با پرونده مهم نیست و با پایگاه داده کار راه میفته و ... ولی من برای تنظیمات و دسترسی راحت نیازش دارم، در کل ممنون :)
لطفا با حوصله توضیح بدید :)
« آخرین ویرایش: 15 دی 1392، 01:20 ب‌ظ توسط سالار مقدم »

آفلاین HSN6

  • Hero Member
  • *
  • ارسال: 866
  • جنسیت : پسر
  • یک راَکتیست اسپرانتیست پایتونیست گودوئیست!
    • بلاگ شخصی
پاسخ : [پایتون]-پردازش فایل
« پاسخ #1 : 15 دی 1392، 02:07 ب‌ظ »
برای ذخیره‌ی تنظیماتی که برای دفعات بعد قابل استفاده باشند ، چرا از ماژول Pickle استفاده نمی‌کنی؟

آفلاین ngc0der

  • Full Member
  • *
  • ارسال: 106
پاسخ : [پایتون]-پردازش فایل
« پاسخ #2 : 15 دی 1392، 11:13 ب‌ظ »
ساده ترین راه برای خوندن فایلهای متنی به صورت خط به خط :
f = open("filename.txt", "r")
for line in f:
   print line
f.close()
حالا به جای print از دستورات مقایسه می تونین استفاده کنین یا از ماژول re . اگه فایل رو به جای r با wb باز کنین باینری باز میشه و می تونین توش بنویسین
ولی اگه کلا هدف شما ذخیره و بازیابی تنظیمات خاصی هست بهتره از ConfigParser استفاده کنین،مثالش در این لینک هست : http://pymotw.com/2/ConfigParser
این سایت بالا کلا سایت خیلی خوبی برای یادگیری پایتون هست

آفلاین سالار مقدم

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 2074
  • جنسیت : پسر
  • هر چقدر بدونی بازم کمه.
    • سالار مقدم
پاسخ : [پایتون]-پردازش فایل
« پاسخ #3 : 16 دی 1392، 08:20 ق‌ظ »
من که گفتم تو ایجاد و خوندن و نوشتن فایل مشکل ندارم، من تو تغییرش مشکل دارم ...

آفلاین HSN6

  • Hero Member
  • *
  • ارسال: 866
  • جنسیت : پسر
  • یک راَکتیست اسپرانتیست پایتونیست گودوئیست!
    • بلاگ شخصی
پاسخ : [پایتون]-پردازش فایل
« پاسخ #4 : 16 دی 1392، 09:21 ق‌ظ »
با کد پایتون زیر به متد seek رسیدم :
help(file)

آفلاین بهنام م ک

  • Full Member
  • *
  • ارسال: 215
  • جنسیت : پسر
پاسخ : [پایتون]-پردازش فایل
« پاسخ #5 : 16 دی 1392، 10:11 ق‌ظ »
ساختار فایل های پایل و معمولی قابلیت ویرایش نداره عزیزم.یعنی نمیتونی مث یه پایگاه داده ویرایشش کنی.ربطی هم به زبان برنامه سازی نداره.
راه اول : فایل های sequential
راه دوم : راه دیگه ش اینه که اگه واقعا مجبوری از اون فایل ها استفاده کنی و باید ویرایشش کنی باید یه کلک بزنی.راهی که من به نظرم میرسه اینه:
مثلا میخوای رکورد ۱۰۰ رو از فایلت ویرایش کنی یعنی به جای کلمه ی حسین اسم محمود رو بنویسی.برا این کار اول خط به خط فایل رو میخونی تا به حسین برسی(برا این کار جوری تو فایلت بنویس که راحت بتونی توش بگردی و مکان کلمات از دستت در نره).حالا همه ی اون چیزایی که تا قبل از حسین خوندی رو بریز تو یه فایل جدید.بعدش به جای حسین کلمه ی محمود رو تو فایل جدید بنویس و ادامه رو(یعنی همه ی اون چیزی که بعد از حسین تو فایل اول اومده)عینا تو فایل جدید بنویس.
حالا مرحله ی آخر اینه که فایل اولیه رو حذف کنی و فایل جدید رو با اسم همون اولی ذخیره کنی.الان فایل ویرایش شده رو داری
البته را سومشم اینه که به صورت باینری با فایلات کار کنی که من خودم یه بار همچین کاری کردم ولی دردسرش خیلی زیاد بود و ازش منصرف شدم
« آخرین ویرایش: 16 دی 1392، 10:18 ق‌ظ توسط کیسه ل »
من از آنچه تو میگویی بیزارم ولی تا پای مرگ از حق تو برای گفتن آن دفاع میکنم

آفلاین امین - am1n

  • Sr. Member
  • *
  • ارسال: 467
  • جنسیت : پسر
  • ... روش دین توضیح شناخته‌ها بوسیله ناشناخته‌هاست!!
    • دات امین / حرف های آزاد من
پاسخ : [پایتون]-پردازش فایل
« پاسخ #6 : 16 دی 1392، 06:40 ب‌ظ »
من می تونم پرونده ای با دسترسی ترتیبی ایجاد کنم و توش بنویسم و بخونم ولی بلد نیستم ویرایشش کنم، تو فایل های باینری هم که پرتم. برای همین کلی گوگل کردم ولی متوجه نشدم که چجوری باید این کارو بکنم، فقط فهمیدم باید از یه ماژول و دو تابع استفاده کنم و فایل رو باز نویسی کنم. کارایی که می خوام بکنم به شرح زیره:
--در پرونده ای با دسترسی ترتیبی--
۱-پیدا کردن خط خاص
۲-رفتن به خط خاص
۳-ویرایش اون خط
--در پرونده ی دودویی---
--همه ی موارد بالا + ایجادش
میدونم سوالم خیلی کلیه ولی متوجه نشدم ...

سلام :) میشه با یه مثال دقیقا توضیح بدی چه چیزی منظورته و دقیقا می‌خوای به چی برسی؟
چون من ۳ بار خوندم پستتو ولی واقعا نفهمیدم کجای کار مشکل داری ؟
ینی فقط می‌خوای یه فایل باینری باز کنی، یه جاشو عوض کنی بعد ذخیره کنی ؟ یا چی ؟؟؟

آفلاین سالار مقدم

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 2074
  • جنسیت : پسر
  • هر چقدر بدونی بازم کمه.
    • سالار مقدم
پاسخ : [پایتون]-پردازش فایل
« پاسخ #7 : 16 دی 1392، 07:23 ب‌ظ »
من می تونم پرونده ای با دسترسی ترتیبی ایجاد کنم و توش بنویسم و بخونم ولی بلد نیستم ویرایشش کنم، تو فایل های باینری هم که پرتم. برای همین کلی گوگل کردم ولی متوجه نشدم که چجوری باید این کارو بکنم، فقط فهمیدم باید از یه ماژول و دو تابع استفاده کنم و فایل رو باز نویسی کنم. کارایی که می خوام بکنم به شرح زیره:
--در پرونده ای با دسترسی ترتیبی--
۱-پیدا کردن خط خاص
۲-رفتن به خط خاص
۳-ویرایش اون خط
--در پرونده ی دودویی---
--همه ی موارد بالا + ایجادش
میدونم سوالم خیلی کلیه ولی متوجه نشدم ...

سلام :) میشه با یه مثال دقیقا توضیح بدی چه چیزی منظورته و دقیقا می‌خوای به چی برسی؟
چون من ۳ بار خوندم پستتو ولی واقعا نفهمیدم کجای کار مشکل داری ؟
ینی فقط می‌خوای یه فایل باینری باز کنی، یه جاشو عوض کنی بعد ذخیره کنی ؟ یا چی ؟؟؟
یه فایل متنی با دسترسی ترتیبی ساختم بعد می خوام یکی از فیلد هاش رو عوض کنم:
f = open("test.conf", "w")
f.write("test1\ntest2\ntest3")
حالا می خوام test2 رو به test4 تغییر بدم.
یعنی روش دیگه ای جز ایجاد فایل جدید نیست؟ یعنی باید test1 رو بریزم تو یه فایل دیگه بعد test4 بنویسم توش بعد test3 رو بنویسم؟ واقعا انقدر روشش مسخرست؟
حالا با فایل دودویی چطور؟

آفلاین nixoeen

  • ناظر انجمن
  • *
  • ارسال: 4872
  • جنسیت : پسر
  • masoft قدیم
پاسخ : [پایتون]-پردازش فایل
« پاسخ #8 : 16 دی 1392، 08:07 ب‌ظ »
with open("test.conf", "w") as f:
        f.write("test1\ntest2\ntest3\n")

with open("test.conf", "r+") as f:
        f.seek(10)
        f.write("4")

آفلاین ngc0der

  • Full Member
  • *
  • ارسال: 106
پاسخ : [پایتون]-پردازش فایل
« پاسخ #9 : 16 دی 1392، 09:45 ب‌ظ »
برای مثال شما راه بهتر استفاده از روش زیر هست که اگه مثلا بخواین به جای test2 رشته test1234 یا t4 رو هم قرار بدین مشکلی پیش نیاد و چیزی ناخواسته overwrite نشه یا موارد ناخواسته ای باقی نمونه:
f = open("test.conf", "w")
f.write("test1\ntest2\ntest3")
f.close()

f = open("test.conf", "r+")

search_str = "test2"
replace_str = "test1234"

file_str = f.read()
temp_file_str = file_str.replace(search_str, replace_str)
f.seek(0, 0)
f.truncate(0)
f.write(temp_file_str)
f.close()

در حالت دودویی هم شما به نوعی باید بدونین که اطلاعات به چه شکلی ذخیره شده(مثلا رکورد با طول ثابت) تا مثل مثال آقای nixoeen بتونین دقیقا همون اطلاعات مورد نظرتون رو تغییر بدین. به هر حال اگه اطلاعاتی که می خواین در فایل بنویسین بیشتر یا کمتر از اطلاعات فعلی فایل باشه باید با read فایل رو به صورت کلی یا بخش بخش بخونین و در حافظه اونو تغییر بدین و با truncate فایل اصلی رو از بین ببرین و اطلاعات جدید رو جایگزین کنین یا مثلا مثل دیتابیس ها فایل اصلی رو از بین نبرین و به جاش رکوردهای جدید رو با کلید خاصی در انتهای فایل بنویسین و با استفاده از همون کلید جستجو یا تغییر بدین که در این صورت برای اینکه سرعت زیاد بشه باید با ایندکس گذاری دسترسی رو سریعتر کنین که در اینجا در نهایت می بینین که دارین یه دیتابیس جدید می نویسین که اگه بخواین دیگران هم ازش استفاده کنن یه زبون ساده می خواد که میشه یه چیزی مثل SQL !! یعنی مسائلی که شما الان با اون درگیرین سالهاست که وجود داره و راه حلهای اونهم مشخصه و چیز مسخره ای درش دیده نمیشه!

آفلاین امین - am1n

  • Sr. Member
  • *
  • ارسال: 467
  • جنسیت : پسر
  • ... روش دین توضیح شناخته‌ها بوسیله ناشناخته‌هاست!!
    • دات امین / حرف های آزاد من
پاسخ : [پایتون]-پردازش فایل
« پاسخ #10 : 16 دی 1392، 10:43 ب‌ظ »
یه فایل متنی با دسترسی ترتیبی ساختم بعد می خوام یکی از فیلد هاش رو عوض کنم:
f = open("test.conf", "w")
f.write("test1\ntest2\ntest3")
حالا می خوام test2 رو به test4 تغییر بدم.
یعنی روش دیگه ای جز ایجاد فایل جدید نیست؟ یعنی باید test1 رو بریزم تو یه فایل دیگه بعد test4 بنویسم توش بعد test3 رو بنویسم؟ واقعا انقدر روشش مسخرست؟
حالا با فایل دودویی چطور؟

درود بر تو برادر

اینکه بخوای یه فایل رو باز کنی، یه خط رو ادیت کنی و بعد فایل رو save کنی، خیالت راحت امکانش نیست. ( به این فکر کن که در این حالت چه تاثیری داره وقتی خطی که ادیت کردی کمتر از حالت قبلی بوده و یه فضایی اون وسط باقی می‌مونه! یا اگر خط ادیت شده طول بیشتری داشته باشه !! ...)

عملا باید خط رو ادیت کنی، کل فایل رو دوباره ذخیره کنی. ساده ترین روشش همونیه که دوستمون گفت. از اول کپی می‌کنی تا برسی به خط مورد نظر. از اینجا به بعد تغییرات خودتو می‌نویسی، بعد از اون دوباره شروع می‌کنی به کپی کردن تا انتهای فایل !!

روی این کد که ngc0der گفت کار کن و دو سه تا function درست حسابی از توش در بیار واسه کار خودت. که از اون به بعد فقط هر وقت خواستی یه فایل رو ادیت کنی فقط اون function رو صدا بزنی و اون خط مورد نظر ادیت بشه :) دیگه واسه ادامه ی کد زدن نگران ذخیره کردن و اینجور مسایل مربوط به io نباشی ...

file_str = f.read()
temp_file_str = file_str.replace(search_str, replace_str)
f.seek(0, 0)
f.truncate(0)
f.write(temp_file_str)
f.close()

موفق باشی
« آخرین ویرایش: 16 دی 1392، 10:49 ب‌ظ توسط amin/~: »

آفلاین vandu

  • Hero Member
  • *
  • ارسال: 741
  • جنسیت : پسر
پاسخ : [پایتون]-پردازش فایل
« پاسخ #11 : 21 دی 1392، 09:06 ب‌ظ »
این رو الان دیدم گفتم شاید بکار کسی که بعدا مطلب رو میخونه بیاد. برای فایل متنی:
f = open('test.txt'.'r')
lines = f.readlines()
f.close()
lines[6] = "blahblah\n"
f = open('test.txt','w')
f.writelines(lines)
f.close()
Nothing is particularly hard if you divide it into small jobs

Henry Ford

آفلاین امین - am1n

  • Sr. Member
  • *
  • ارسال: 467
  • جنسیت : پسر
  • ... روش دین توضیح شناخته‌ها بوسیله ناشناخته‌هاست!!
    • دات امین / حرف های آزاد من
پاسخ : [پایتون]-پردازش فایل
« پاسخ #12 : 21 دی 1392، 10:45 ب‌ظ »
این رو الان دیدم گفتم شاید بکار کسی که بعدا مطلب رو میخونه بیاد. برای فایل متنی:
f = open('test.txt'.'r')
lines = f.readlines()
f.close()
lines[6] = "blahblah\n"
f = open('test.txt','w')
f.writelines(lines)
f.close()

اینم خوبه :) همون کاری که باید بکنیمه. کل فایل رو بگیریم و دوباره کل فایل رو ذخیره کنیم :)