انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: سالار مقدم در 15 دی 1392، 01:18 بظ
-
سلام دوستان
من می تونم پرونده ای با دسترسی ترتیبی ایجاد کنم و توش بنویسم و بخونم ولی بلد نیستم ویرایشش کنم، تو فایل های باینری هم که پرتم. برای همین کلی گوگل کردم ولی متوجه نشدم که چجوری باید این کارو بکنم، فقط فهمیدم باید از یه ماژول و دو تابع استفاده کنم و فایل رو باز نویسی کنم. کارایی که می خوام بکنم به شرح زیره:
--در پرونده ای با دسترسی ترتیبی--
۱-پیدا کردن خط خاص
۲-رفتن به خط خاص
۳-ویرایش اون خط
--در پرونده ی دودویی---
--همه ی موارد بالا + ایجادش
میدونم سوالم خیلی کلیه ولی متوجه نشدم
نکته ی جالب اینجاست که از کلی دوست برنامه نویس که پرسیدم هیچ کدوم نتونستن جواب بدن و گفتن که ما کار نکردیم چون کار با پرونده مهم نیست و با پایگاه داده کار راه میفته و ... ولی من برای تنظیمات و دسترسی راحت نیازش دارم، در کل ممنون :)
لطفا با حوصله توضیح بدید :)
-
برای ذخیرهی تنظیماتی که برای دفعات بعد قابل استفاده باشند ، چرا از ماژول Pickle استفاده نمیکنی؟
-
ساده ترین راه برای خوندن فایلهای متنی به صورت خط به خط :
f = open("filename.txt", "r")
for line in f:
print line
f.close()
حالا به جای print از دستورات مقایسه می تونین استفاده کنین یا از ماژول re . اگه فایل رو به جای r با wb باز کنین باینری باز میشه و می تونین توش بنویسین
ولی اگه کلا هدف شما ذخیره و بازیابی تنظیمات خاصی هست بهتره از ConfigParser استفاده کنین،مثالش در این لینک هست : http://pymotw.com/2/ConfigParser
این سایت بالا کلا سایت خیلی خوبی برای یادگیری پایتون هست
-
من که گفتم تو ایجاد و خوندن و نوشتن فایل مشکل ندارم، من تو تغییرش مشکل دارم ...
-
با کد پایتون زیر به متد seek رسیدم :
help(file)
-
ساختار فایل های پایل و معمولی قابلیت ویرایش نداره عزیزم.یعنی نمیتونی مث یه پایگاه داده ویرایشش کنی.ربطی هم به زبان برنامه سازی نداره.
راه اول : فایل های sequential
راه دوم : راه دیگه ش اینه که اگه واقعا مجبوری از اون فایل ها استفاده کنی و باید ویرایشش کنی باید یه کلک بزنی.راهی که من به نظرم میرسه اینه:
مثلا میخوای رکورد ۱۰۰ رو از فایلت ویرایش کنی یعنی به جای کلمه ی حسین اسم محمود رو بنویسی.برا این کار اول خط به خط فایل رو میخونی تا به حسین برسی(برا این کار جوری تو فایلت بنویس که راحت بتونی توش بگردی و مکان کلمات از دستت در نره).حالا همه ی اون چیزایی که تا قبل از حسین خوندی رو بریز تو یه فایل جدید.بعدش به جای حسین کلمه ی محمود رو تو فایل جدید بنویس و ادامه رو(یعنی همه ی اون چیزی که بعد از حسین تو فایل اول اومده)عینا تو فایل جدید بنویس.
حالا مرحله ی آخر اینه که فایل اولیه رو حذف کنی و فایل جدید رو با اسم همون اولی ذخیره کنی.الان فایل ویرایش شده رو داری
البته را سومشم اینه که به صورت باینری با فایلات کار کنی که من خودم یه بار همچین کاری کردم ولی دردسرش خیلی زیاد بود و ازش منصرف شدم
-
من می تونم پرونده ای با دسترسی ترتیبی ایجاد کنم و توش بنویسم و بخونم ولی بلد نیستم ویرایشش کنم، تو فایل های باینری هم که پرتم. برای همین کلی گوگل کردم ولی متوجه نشدم که چجوری باید این کارو بکنم، فقط فهمیدم باید از یه ماژول و دو تابع استفاده کنم و فایل رو باز نویسی کنم. کارایی که می خوام بکنم به شرح زیره:
--در پرونده ای با دسترسی ترتیبی--
۱-پیدا کردن خط خاص
۲-رفتن به خط خاص
۳-ویرایش اون خط
--در پرونده ی دودویی---
--همه ی موارد بالا + ایجادش
میدونم سوالم خیلی کلیه ولی متوجه نشدم ...
سلام :) میشه با یه مثال دقیقا توضیح بدی چه چیزی منظورته و دقیقا میخوای به چی برسی؟
چون من ۳ بار خوندم پستتو ولی واقعا نفهمیدم کجای کار مشکل داری ؟
ینی فقط میخوای یه فایل باینری باز کنی، یه جاشو عوض کنی بعد ذخیره کنی ؟ یا چی ؟؟؟
-
من می تونم پرونده ای با دسترسی ترتیبی ایجاد کنم و توش بنویسم و بخونم ولی بلد نیستم ویرایشش کنم، تو فایل های باینری هم که پرتم. برای همین کلی گوگل کردم ولی متوجه نشدم که چجوری باید این کارو بکنم، فقط فهمیدم باید از یه ماژول و دو تابع استفاده کنم و فایل رو باز نویسی کنم. کارایی که می خوام بکنم به شرح زیره:
--در پرونده ای با دسترسی ترتیبی--
۱-پیدا کردن خط خاص
۲-رفتن به خط خاص
۳-ویرایش اون خط
--در پرونده ی دودویی---
--همه ی موارد بالا + ایجادش
میدونم سوالم خیلی کلیه ولی متوجه نشدم ...
سلام :) میشه با یه مثال دقیقا توضیح بدی چه چیزی منظورته و دقیقا میخوای به چی برسی؟
چون من ۳ بار خوندم پستتو ولی واقعا نفهمیدم کجای کار مشکل داری ؟
ینی فقط میخوای یه فایل باینری باز کنی، یه جاشو عوض کنی بعد ذخیره کنی ؟ یا چی ؟؟؟
یه فایل متنی با دسترسی ترتیبی ساختم بعد می خوام یکی از فیلد هاش رو عوض کنم:
f = open("test.conf", "w")
f.write("test1\ntest2\ntest3")
حالا می خوام test2 رو به test4 تغییر بدم.
یعنی روش دیگه ای جز ایجاد فایل جدید نیست؟ یعنی باید test1 رو بریزم تو یه فایل دیگه بعد test4 بنویسم توش بعد test3 رو بنویسم؟ واقعا انقدر روشش مسخرست؟
حالا با فایل دودویی چطور؟
-
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")
-
برای مثال شما راه بهتر استفاده از روش زیر هست که اگه مثلا بخواین به جای 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 !! یعنی مسائلی که شما الان با اون درگیرین سالهاست که وجود داره و راه حلهای اونهم مشخصه و چیز مسخره ای درش دیده نمیشه!
-
یه فایل متنی با دسترسی ترتیبی ساختم بعد می خوام یکی از فیلد هاش رو عوض کنم:
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()
موفق باشی
-
این رو الان دیدم گفتم شاید بکار کسی که بعدا مطلب رو میخونه بیاد. برای فایل متنی:
f = open('test.txt'.'r')
lines = f.readlines()
f.close()
lines[6] = "blahblah\n"
f = open('test.txt','w')
f.writelines(lines)
f.close()
-
این رو الان دیدم گفتم شاید بکار کسی که بعدا مطلب رو میخونه بیاد. برای فایل متنی:
f = open('test.txt'.'r')
lines = f.readlines()
f.close()
lines[6] = "blahblah\n"
f = open('test.txt','w')
f.writelines(lines)
f.close()
اینم خوبه :) همون کاری که باید بکنیمه. کل فایل رو بگیریم و دوباره کل فایل رو ذخیره کنیم :)