Fișierul I/O
Iată un exemplu simplu de fișier I/O (intrare/ieșire):
# Scrie un fișier
with open("test.txt", "wt") as out_file:
out_file.write("This Text is going to out file\nLook at it and see!")
# Citește un fișier
with open("test.txt", "rt") as in_file:
text = in_file.read()
print(text)
Ieșirea și conținutul fișierului test.txt
sunt:
This Text is going to out file Look at it and see!
Observați că s-a scris un fișier numit test.txt
în directorul din care ați rulat programul. \n
din șir îi spune lui Python să pună o linie nouă acolo unde este.
O prezentare generală a fișierelor I/O este:
- Obțineți un obiect fișier cu funcția
open
- Citiți sau scrieți în obiectul fișier (în funcție de modul în care a fost deschis)
- Dacă nu ați folosit
with
pentru a deschide fișierul, va trebui să îl închideți manual.
Primul pas este să obțineți un obiect fișier. Modul de a face acest lucru este să utilizați funcția open
. Formatul este file_object =
unde
open(filename, mode)file_object
este variabila pentru a pune obiectul fișierului, filename
este un șir cu numele fișierului și mode
este "rt"
pentru a citi un fișier ca text sau „wt” pentru a scrie un fișier ca text (și alte câteva pe care le vom sări aici). În continuare pot fi apelate funcțiile obiectelor fișierului. Cele mai comune două funcții sunt read
și write
. Funcția write
adaugă un șir la sfârșitul fișierului. Funcția read
citește următorul lucru din fișier și îl returnează ca șir. Dacă nu este dat niciun argument, va returna întregul fișier (așa cum se face în exemplu).
Acum, iată o nouă versiune a programului de numere de telefon pe care l-am creat mai devreme:
def print_numbers(numbers):
print("Telephone Numbers:")
for k, v in numbers.items():
print("Name:", k, "\tNumber:", v)
print()
def add_number(numbers, name, number):
numbers[name] = number
def lookup_number(numbers, name):
if name in numbers:
return "The number is " + numbers[name]
else:
return name + " was not found"
def remove_number(numbers, name):
if name in numbers:
del numbers[name]
else:
print(name," was not found")
def load_numbers(numbers, filename):
in_file = open(filename, "rt")
while True:
in_line = in_file.readline()
if not in_line:
break
in_line = in_line[:-1]
name, number = in_line.split(",")
numbers[name] = number
in_file.close()
def save_numbers(numbers, filename):
out_file = open(filename, "wt")
for k, v in numbers.items():
out_file.write(k + "," + v + "\n")
out_file.close()
def print_menu():
print('1. Print Phone Numbers')
print('2. Add a Phone Number')
print('3. Remove a Phone Number')
print('4. Lookup a Phone Number')
print('5. Load numbers')
print('6. Save numbers')
print('7. Quit')
print()
phone_list = {}
menu_choice = 0
print_menu()
while True:
menu_choice = int(input("Type in a number (1-7): "))
if menu_choice == 1:
print_numbers(phone_list)
elif menu_choice == 2:
print("Add Name and Number")
name = input("Name: ")
phone = input("Number: ")
add_number(phone_list, name, phone)
elif menu_choice == 3:
print("Remove Name and Number")
name = input("Name: ")
remove_number(phone_list, name)
elif menu_choice == 4:
print("Lookup Number")
name = input("Name: ")
print(lookup_number(phone_list, name))
elif menu_choice == 5:
filename = input("Filename to load: ")
load_numbers(phone_list, filename)
elif menu_choice == 6:
filename = input("Filename to save: ")
save_numbers(phone_list, filename)
elif menu_choice == 7:
break
else:
print_menu()
print("Goodbye")
Observați că acum include salvarea și încărcarea fișierelor. Iată câteva rezultate ale rulării mele de două ori:
1. Print Phone Numbers 2. Add a Phone Number 3. Remove a Phone Number 4. Lookup a Phone Number 5. Load numbers 6. Save numbers 7. Quit Type in a number (1-7): 2 Add Name and Number Name: Jill Number: 1234 Type in a number (1-7): 2 Add Name and Number Name: Fred Number: 4321 Type in a number (1-7): 1 Telephone Numbers: Name: Jill Number: 1234 Name: Fred Number: 4321 Type in a number (1-7): 6 Filename to save: numbers.txt Type in a number (1-7): 7 Goodbye
1. Print Phone Numbers 2. Add a Phone Number 3. Remove a Phone Number 4. Lookup a Phone Number 5. Load numbers 6. Save numbers 7. Quit Type in a number (1-7): 5 Filename to load: numbers.txt Type in a number (1-7): 1 Telephone Numbers: Name: Jill Number: 1234 Name: Fred Number: 4321 Type in a number (1-7): 7 Goodbye
Noile părți ale acestui program sunt:
def load_numbers(numbers, filename):
in_file = open(filename, "rt")
while True:
in_line = in_file.readline()
if not in_line:
break
in_line = in_line[:-1]
name, number = in_line.split(",")
numbers[name] = number
in_file.close()
def save_numbers(numbers, filename):
out_file = open(filename, "wt")
for k, v in numbers.items():
out_file.write(k + "," + v + "\n")
out_file.close()
Mai întâi ne vom uita la porțiunea de salvare a programului. Mai întâi creează un obiect fișier cu comanda open(filename, "wt")
. Apoi parcurge și creează o linie pentru fiecare dintre numerele de telefon cu comanda out_file.write(k + "," + v + "\n")
. Aceasta scrie o linie care conține numele, o virgulă, numărul și urmează o nouă linie.
Porțiunea de încărcare este puțin mai complicată. Începe prin obținerea unui obiect fișier. Apoi folosește o buclă while True:
pentru a continua bucla până când este întâlnită o instrucțiune break
. Apoi primește o linie cu linia in_line = in_file.readline()
. Funcția
va returna un șir gol când se ajunge la sfârșitul fișierului. Declarația
readlineif
verifică acest lucru și scoate break
s din bucla while
când se întâmplă asta. Desigur, dacă funcția
nu returnează linia nouă la sfârșitul liniei, nu ar exista nicio modalitate de a spune dacă un șir gol este o linie goală sau sfârșitul fișierului, astfel încât linia nouă este lăsată în ceea ce returnează
readline
. Prin urmare, trebuie să scăpăm de noua linie. Linia
readline
face acest lucru pentru noi prin eliminarea ultimului caracter. În continuare, linia
in_line = in_line[:-1]name, number = in_line.split(",")
împarte linia la virgulă într-un nume și un număr. Acesta este apoi adăugat la dicționarul de numere.
Utilizarea avansată a fișierelor .txt
S-ar putea să vă spuneți: „Ei bine, știu să citesc și să scriu într-un fișier text, dar ce se întâmplă dacă vreau să imprim fișierul fără a deschide alt program?”
Există câteva moduri diferite de a realiza acest lucru. Cel mai simplu mod este de a deschide un alt program, dar totul este preluat de codul Python și nu necesită ca utilizatorul să specifice un fișier care urmează să fie imprimat. Această metodă implică invocarea subprocesului altui program.
Vă amintiți fișierul în care am scris rezultat în programul de mai sus? Să folosim acel fișier. Rețineți, pentru a preveni unele erori, acest program folosește concepte din capitolul următor. Vă rugăm să nu ezitați să revedeți acest exemplu după următorul capitol.
import subprocess
def main():
try:
print("This small program invokes the print function in the Notepad application")
#Lets print the file we created in the program above
subprocess.call(['notepad','/p','numbers.txt'])
except WindowsError:
print("The called subprocess does not exist, or cannot be called.")
main()
subprocess.call
are trei argumente. Primul argument în contextul acestui exemplu ar trebui să fie numele programului din care doriți să invocați subprocesul de imprimare. Al doilea argument ar trebui să fie subprocesul specific din acel program. Pentru simplitate, înțelegeți doar că în acest program, '/p'
este subprocesul folosit pentru a vă accesa imprimanta prin aplicația specificată. Ultimul argument ar trebui să fie numele fișierului pe care doriți să-l trimiteți la subprocesul de imprimare. În acest caz, este același fișier folosit mai devreme în acest capitol.
Exerciții
Acum modificați programul de note din secțiunea Dicționare, astfel încât să folosească fișierul I/O pentru a păstra o evidență a studenților.
Soluție
Acum modificați programul de note din secțiunea Dicționare, astfel încât să folosească fișierul I/O pentru a păstra o evidență a studenților.
assignments = ['hw ch 1', 'hw ch 2', 'quiz ', 'hw ch 3', 'test']
students = { }
def load_grades(gradesfile):
inputfile = open(gradesfile, "r")
grades = [ ]
while True:
student_and_grade = inputfile.readline()
student_and_grade = student_and_grade[:-1]
if not student_and_grade:
break
else:
studentname, studentgrades = student_and_grade.split(",")
studentgrades = studentgrades.split(" ")
students[studentname] = studentgrades
inputfile.close()
print("Grades loaded.")
def save_grades(gradesfile):
outputfile = open(gradesfile, "w")
for k, v in students.items():
outputfile.write(k + ",")
for x in v:
outputfile.write(str(x) + " ")
outputfile.write("\n")
outputfile.close()
print("Grades saved.")
def print_menu():
print("1. Add student")
print("2. Remove student")
print("3. Load grades")
print("4. Record grade")
print("5. Print grades")
print("6. Save grades")
print("7. Print Menu")
print("9. Quit")
def print_all_grades():
if students:
keys = sorted(students.keys())
print('\t', end=' ')
for x in assignments:
print(x, '\t', end=' ')
print()
for x in keys:
print(x, '\t', end=' ')
grades = students[x]
print_grades(grades)
else:
print("There are no grades to print.")
def print_grades(grades):
for x in grades:
print(x, '\t', end=' ')
print()
print_menu()
menu_choice = 0
while menu_choice != 9:
print()
menu_choice = int(input("Menu Choice: "))
if menu_choice == 1:
name = input("Student to add: ")
students[name] = [0] * len(assignments)
elif menu_choice == 2:
name = input("Student to remove: ")
if name in students:
del students[name]
else:
print("Student:", name, "not found")
elif menu_choice == 3:
gradesfile = input("Load grades from which file? ")
load_grades(gradesfile)
elif menu_choice == 4:
print("Record Grade")
name = input("Student: ")
if name in students:
grades = students[name]
print("Type in the number of the grade to record")
print("Type a 0 (zero) to exit")
for i,x in enumerate(assignments):
print(i + 1, x, '\t', end=' ')
print()
print_grades(grades)
which = 1234
while which != -1:
which = int(input("Change which Grade: "))
which -= 1
if 0 <= which < len(grades):
grade = input("Grade: ") # Change from float(input()) to input() to avoid an error when saving
grades[which] = grade
elif which != -1:
print("Invalid Grade Number")
else:
print("Student not found")
elif menu_choice == 5:
print_all_grades()
elif menu_choice == 6:
gradesfile = input("Save grades to which file? ")
save_grades(gradesfile)
elif menu_choice != 9:
print_menu()
(Include texte din Wikibooks traduse și adaptate de Nicolae Sfetcu)
Lasă un răspuns