8 min lexim
Leximi dhe shkrimi i skedarëve
Të dhëna që jetojnë përtej programit
Gjithçka që ke ruajtur deri tani jeton në memorie, që do të thotë se zhduket në çastin që programi mbaron. Një skedar është mënyra si i mban të dhënat në disk, që të jenë aty edhe nesër. Për ta përdorur ndjek tri hapa me radhë: e hap, lexon prej tij ose shkruan në të, pastaj e mbyll.
Hapja e një skedari kërkon dy copa informacioni, emrin e tij dhe një mode që thotë çfarë ke ndër mend të bësh:
"r"për lexim (read), kur do vetëm të shohësh çfarë është aty."w"për shkrim (write), që nis një skedar të freskët e bosh. Kujdes: nëse skedari ekziston tashmë, kjo e fshin plotësisht."a"për shtim (append), që shton në fund të skedarit dhe mban çfarë ishte tashmë brenda.
shenimet = open("shenime.txt", "w")
shenimet.write("Rreshti i parë\n")
shenimet.write("Rreshti i dytë\n")
shenimet.close()
Çdo write shton saktësisht tekstin që i jep, ndaj \n e vendos vetë kudo që do një rresht të ri. Të harrosh close() mund ta lërë tekstin gjysmë të shkruar, ndaj duhet të ndodhë gjithmonë.
Leximi mbrapsht
Hap të njëjtin skedar në mode leximi dhe nxirr përmbajtjen jashtë. read() të jep gjithë skedarin si një varg të vetëm:
shenimet = open("shenime.txt", "r")
permbajtja = shenimet.read()
shenimet.close()
print(permbajtja)
Shpesh do të parapëlqeje ta trajtosh një rresht në një kohë, gjë që një cikël for mbi skedarin e bën pastër:
shenimet = open("shenime.txt", "r")
for rreshti in shenimet:
print(rreshti.strip())
shenimet.close()
.strip() e pret rreshtin e ri në fund, që të mos shtypësh rreshta bosh mes secilit.
Mënyra më e sigurt: një bllok with
Është e lehtë të harrosh close(), dhe nëse godet një gabim mes hapjes dhe mbylljes, skedari mund të mos mbyllet fare. Python të jep një model më të pastër që e mbyll skedarin për ty automatikisht, edhe nëse diçka shkon keq. Është blloku with, dhe është forma që duhet të parapëlqesh:
with open("shenime.txt", "r") as shenimet:
for rreshti in shenimet:
print(rreshti.strip())
Kur mbaron blloku me dhëmbëzim, skedari mbyllet për ty. S'ka close() për të mbajtur mend dhe s'ka mënyrë ta kapërcesh pa dashje. Përdor with çdo herë që hap një skedar.
Mëso më shumë
Të provosh të lexosh një skedar që nuk ekziston nxjerr një FileNotFoundError dhe e ndal programin. Nëse ka gjasa reale që skedari mungon, kape atë rast dhe vazhdo në vend që të rrëzohesh:
try:
with open("pikat.txt", "r") as f:
te_dhenat = f.read()
except FileNotFoundError:
te_dhenat = ""
print("Ende s'ka pika të ruajtura, po nis nga e para.")Nëse skedari hapet, te_dhenat mban përmbajtjen e tij. Nëse jo, bie te dega except, vendos një vlerë të paracaktuar të arsyeshme, dhe programi vazhdon.
Një shembull i punuar: ruajtja e një liste, ngarkimi mbrapsht
Le të themi se një program i vogël mbledh një listë pazari dhe duhet ta mbajë mend mes ekzekutimeve. Shkrimi i listës jashtë është një cikël, një njësi për rresht:
def ruaj_listen(njesite, emri):
with open(emri, "w") as f:
for njesi in njesite:
f.write(njesi + "\n")
def ngarko_listen(emri):
try:
with open(emri, "r") as f:
njesite = []
for rreshti in f:
njesite.append(rreshti.strip())
return njesite
except FileNotFoundError:
return []
ruaj_listen(["bukë", "ullinj", "djathë"], "pazar.txt")
print(ngarko_listen("pazar.txt")) # ['bukë', 'ullinj', 'djathë']
ruaj_listen shkruan çdo njësi të ndjekur nga një rresht i ri. ngarko_listen i lexon rreshtat mbrapsht, ia pret secilit rreshtin e ri, dhe të kthen sërish një listë, duke kthyer një listë bosh nëse skedari s'u krijua kurrë. Së bashku i lejojnë një liste të mbijetojë pasi programi mbyllet, që është arsyeja e vetme pse skedarët ekzistojnë.
Kujdes
Hapja e një skedari ekzistues me mode "w" e fshin atë në çastin që e hap, para se të shkruash asgjë. Kur ke ndër mend të mbash çfarë është tashmë aty dhe t'i shtosh, përdor "a" në vend të saj. Ngatërrimi i këtyre të dyjave është një mënyrë klasike për të humbur të dhëna.
Do ta shohësh të shpjeguar? Ja leksioni i regjistruar i Code for Albania për këtë temë.
Provo veten
- Cili është ndryshimi praktik mes hapjes së një skedari me mode
"w"dhe mode"a", dhe cilin do të zgjidhje për të mbajtur një ditar në rritje pa humbur hyrjet e vjetra? - Pse një bllok
with open(...)është më i sigurt se të thërrasëshopen()dheclose()vetë? Çfarë garanton edhe kur ndodh një gabim? - Në shembullin e punuar,
ngarko_listenkthen një listë bosh brenda degës së sajexcept. Pse kjo është një zgjedhje më miqësore se ta lëshFileNotFoundErrorta ndalë programin?
Nga vjen ky mësim
Ndërtuar mbi
- Data Structures and Algorithms
- Për të lexuar më tej: Brian Heinold, A Practical Introduction to Python Programming
Kurset e alphaPlan ndërtohen mbi programe të zhvilluara në klasë, e nuk shpiken për web-in. Kur një pohim mbështetet mbi një standard të jashtëm ose mbi një rast të raportuar, ai emërtohet më sipër që ta kontrollosh vetë e të mos na besosh në fjalë.
Ky kurs u zhvillua nga alphaPlan Center mbi bazën e programeve të realizuara në partneritet me rrjetin American Corners.
Gjete diçka të paqartë, të vjetruar ose që mund të përmirësohet? Sugjero një përmirësim