Home » Articole » Articole » Calculatoare » Programare » Python » Programarea în Python: Fișierul I/O

Programarea în Python: Fișierul I/O

postat în: Python 0

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 =
open(filename, mode)
unde 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
readline
va returna un șir gol când se ajunge la sfârșitul fișierului. Declarația if verifică acest lucru și scoate breaks din bucla while când se întâmplă asta. Desigur, dacă funcția
readline
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
in_line = in_line[:-1]
face acest lucru pentru noi prin eliminarea ultimului caracter. În continuare, linia 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)

Rolul social media în democrație, noul management public, și guvernanța electronică
Rolul social media în democrație, noul management public, și guvernanța electronică

O resursă esențială pentru oricine dorește să înțeleagă intersecția în evoluție dintre tehnologie și guvernare.

Nu a fost votat 9.10 lei20.02 lei Selectează opțiunile Acest produs are mai multe variații. Opțiunile pot fi alese în pagina produsului.
Căutarea, extragerea, organizarea și evaluarea informațiilor
Căutarea, extragerea, organizarea și evaluarea informațiilor

Transformă informația în putere cu ajutorul acestei cărți indispensabile!

Nu a fost votat 18.24 lei43.92 lei Selectează opțiunile Acest produs are mai multe variații. Opțiunile pot fi alese în pagina produsului.
Introducere în inteligența artificială
Introducere în inteligența artificială

Pășește în era digitală pregătit să înțelegi și să aplici conceptele care schimbă lumea!

Nu a fost votat 13.67 lei23.95 lei Selectează opțiunile Acest produs are mai multe variații. Opțiunile pot fi alese în pagina produsului.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *