Acest articol va arăta în detaliu cum să lucrați cu fișiere Excel și cum să modificați anumite date cu Python.

Mai întâi vom învăța cum să lucrăm cu fișiere CSV citindu-le, scriindu-le și actualizându-le. Apoi vom arunca o privire cum să citiți fișierele, să le filtrați după foi, să căutăm rânduri / coloane și să actualizăm celulele fișierelor xlsx.

Să începem cu cel mai simplu format de foaie de calcul: CSV.

Partea 1 – Fișierul CSV

Un fișier CSV este un fișier de valori separate prin virgulă, unde datele text simplu sunt afișate într-un format tabelar. Acestea pot fi utilizate cu orice program de foi de calcul, cum ar fi Microsoft Office Excel, Google Spreadsheets sau LibreOffice Calc.

Fișierele CSV nu seamănă cu alte fișiere de calcul tabelar, deoarece nu vă permit să salvați celule, coloane, rânduri sau formule. Limita lor este că permit, de asemenea, o singură foaie pe fișier. Planul meu pentru această primă parte a articolului este să vă arăt cum să creați fișiere CSV folosind Python 3 și modulul de bibliotecă standard CSV.

ad-banner

Acest tutorial se va încheia cu două depozite GitHub și o aplicație web live care utilizează de fapt codul celei de-a doua părți a acestui tutorial (încă actualizat și modificat pentru a fi pentru un anumit scop).

Scrierea în fișiere CSV

Mai întâi, deschideți un nou fișier Python și importați modulul Python CSV.

import csv

Modul CSV

Modulul CSV include toate metodele necesare încorporate. Acestea includ:

  • csv.cititor
  • csv.writer
  • csv.DictReader
  • csv.DictWriter
  • si altii

În acest ghid ne vom concentra asupra metodelor de scriitor, DictWriter și DictReader. Acestea vă permit să editați, să modificați și să manipulați datele stocate într-un fișier CSV.

În primul pas trebuie să definim numele fișierului și să-l salvăm ca variabilă. Ar trebui să facem același lucru cu antetul și informațiile de date.

filename = "imdb_top_4.csv"
header = ("Rank", "Rating", "Title")
data = [
(1, 9.2, "The Shawshank Redemption(1994)"),
(2, 9.2, "The Godfather(1972)"),
(3, 9, "The Godfather: Part II(1974)"),
(4, 8.9, "Pulp Fiction(1994)")
]

Acum trebuie să creăm o funcție numită scriitor care va lua în trei parametri: antet, date și nume de fișier.

def writer(header, data, filename):
  pass

Următorul pas este modificarea fișierului scriitor funcție astfel încât să creeze un fișier care conține date din antet și date variabile. Acest lucru se face scriind primul rând din antet variabilă și apoi scriind patru rânduri din date variabilă (există patru rânduri, deoarece există patru tupluri în listă).

def writer(header, data, filename):
  with open (filename, "w", newline = "") as csvfile:
    movies = csv.writer(csvfile)
    movies.writerow(header)
    for x in data:
      movies.writerow(x)

documentație oficială Python descrie modul în care funcționează metoda csv.writer. Aș sugera cu tărie să luați un minut pentru ao citi.

Și voilà! Ați creat primul fișier CSV numit imdb_top_4.csv. Deschideți acest fișier cu aplicația dvs. de calcul tabelar preferată și ar trebui să vedeți așa ceva:

Cum sa creati sa cititi sa actualizati si sa cautati
Folosind LibreOffice Calc pentru a vedea rezultatul.

Rezultatul ar putea fi scris astfel dacă alegeți să deschideți fișierul în altă aplicație:

1612074909 312 Cum sa creati sa cititi sa actualizati si sa cautati
Folosind SublimeText pentru a vedea rezultatul.

Actualizarea fișierelor CSV

Pentru a actualiza acest fișier ar trebui să creați o nouă funcție numită actualizator care va lua doar un parametru numit nume de fișier.

def updater(filename):
    with open(filename, newline= "") as file:
        readData = [row for row in csv.DictReader(file)]
        # print(readData)
        readData[0]['Rating'] = '9.4'
        # print(readData)

    readHeader = readData[0].keys()
    writer(readHeader, readData, filename, "update")

Această funcție deschide mai întâi fișierul definit în fișierul nume de fișier variabilă și apoi salvează toate datele pe care le citește din fișierul din interiorul unei variabile numite readData. Al doilea pas este să codificați noua valoare și să o plasați în locul celei vechi în readData[0][‘Rating’] poziţie.

Ultimul pas al funcției este să apelați scriitor funcție prin adăugarea unui nou parametru Actualizați care va spune funcției că faceți o actualizare.

csv.DictReader este explicat mai mult în documentația oficială Python Aici.

Pentru scriitor pentru a lucra cu un nou parametru, trebuie să adăugați un nou parametru peste tot scriitor este definit. Întoarce-te la locul în care ai sunat pentru prima dată scriitor funcția și adăugați „scrie” ca un nou parametru:

writer(header, data, filename, "write")

Chiar sub funcția de scriere numiți funcția actualizator și treceți nume de fișier parametru în el:

writer(header, data, filename, "write")
updater(filename)

Acum trebuie să modificați fișierul scriitor funcția pentru a lua un nou parametru numit opțiune:

def writer(header, data, filename, option):

De acum înainte ne așteptăm să primim două opțiuni diferite pentru scriitor funcție (scrieți și actualizați). Din acest motiv, ar trebui să adăugăm două instrucțiuni if ​​pentru a sprijini această nouă funcționalitate. Prima parte a funcția sub „dacă opțiunea ==„ scrieți: ” este deja cunoscut de tine. Trebuie doar să adăugați „opțiunea elif == „actualizare”: secțiunea codului și altceva parte la fel cum sunt scrise mai jos:

def writer(header, data, filename, option):
        with open (filename, "w", newline = "") as csvfile:
            if option == "write":

                movies = csv.writer(csvfile)
                movies.writerow(header)
                for x in data:
                    movies.writerow(x)
            elif option == "update":
                writer = csv.DictWriter(csvfile, fieldnames = header)
                writer.writeheader()
                writer.writerows(data)
            else:
                print("Option is not known")

Bravo! Ai terminat!

Acum, codul dvs. ar trebui să arate cam așa:

0*vPoREgLGJU8VmB5k
Codul.

Puteți găsi și codul aici:

https://github.com/GoranAviani/CSV-Viewer-and-Editor

În prima parte a acestui articol am văzut cum să lucrați cu fișiere CSV. Am creat și actualizat un astfel de fișier.

Partea 2 – Fișierul xlsx

De câteva săptămâni am lucrat la acest proiect. Am început să lucrez la asta pentru că era nevoie de acest tip de soluție în compania mea. Prima mea idee a fost să construiesc această soluție direct în sistemul companiei mele, dar nu aș mai avea de ce să scriu, nu?

Construiesc această soluție folosind Python 3 și openpyxl bibliotecă. Motivul pentru care am ales openpyxl este pentru că reprezintă o soluție completă pentru crearea foilor de lucru, încărcarea, actualizarea, redenumirea și ștergerea acestora. De asemenea, ne permite să citim sau să scriem pe rânduri și coloane, să îmbinăm sau să ne unim celulele sau să creăm diagrame Python excel etc.

Terminologie Openpyxl și informații de bază

  • Cartea de lucru este numele unui fișier Excel în Openpyxl.
  • Un registru de lucru este format din foi (implicit este 1 coală). Foi sunt menționate prin numele lor.
  • O foaie este formată din rânduri (linii orizontale) care încep de la numărul 1 și coloane (linii verticale) începând de la litera A.
  • Rândurile și coloanele au ca rezultat o grilă și formează celule care pot conține unele date (valoare numerică sau șir) sau formule.

Openpyxl este bine documentat și v-aș sfătui să aruncați o privire Aici.

Primul pas este să vă deschideți mediul Python și să instalați openpyxl în terminalul dvs.:

pip install openpyxl

Apoi, importați openpyxl în proiectul dvs. și apoi să încărcați un registru de lucru în fișierul variabil.

import openpyxl

theFile = openpyxl.load_workbook('Customers1.xlsx')
print(theFile.sheetnames)
currentSheet = theFile['customers 1']
print(currentSheet['B4'].value)

După cum puteți vedea, acest cod tipărește toate foile după numele lor. Apoi selectează foaia numită „clienții 1” și o salvează într-un currentSheet variabil. În ultima linie, codul imprimă valoarea care se află în poziția B4 a foii „clienții 1”.

Acest cod funcționează așa cum ar trebui, dar este foarte greu codificat. Pentru a face acest lucru mai dinamic, vom scrie un cod care va:

  • Citiți fișierul
  • Obțineți toate numele foilor
  • Parcurgeți toate colile
  • În ultimul pas, codul va imprima valorile care se află în câmpurile B4 ale fiecărei foi găsite în registrul de lucru.
import openpyxl

theFile = openpyxl.load_workbook('Customers1.xlsx')
allSheetNames = theFile.sheetnames

print("All sheet names {} " .format(theFile.sheetnames))


for x in allSheetNames:
    print("Current sheet name is {}" .format(x))
    currentSheet = theFile[x]
    print(currentSheet['B4'].value)

Acest lucru este mai bun decât înainte, dar este încă o soluție codificată greu și își asumă în continuare valoarea pe care o veți căuta este în celula B4, care este doar o prostie 🙂

Sper că proiectul dvs. va trebui să caute în toate foile din fișierul Excel o anumită valoare. Pentru a face acest lucru, vom adăuga încă o buclă pentru gama „ABCDEF” și apoi vom imprima pur și simplu numele celulelor și valorile acestora.

import openpyxl

theFile = openpyxl.load_workbook('Customers1.xlsx')
allSheetNames = theFile.sheetnames

print("All sheet names {} " .format(theFile.sheetnames))


for sheet in allSheetNames:
    print("Current sheet name is {}" .format(sheet))
    currentSheet = theFile[sheet]
    # print(currentSheet['B4'].value)

    #print max numbers of wors and colums for each sheet
    #print(currentSheet.max_row)
    #print(currentSheet.max_column)

    for row in range(1, currentSheet.max_row + 1):
        #print(row)
        for column in "ABCDEF":  # Here you can add or reduce the columns
            cell_name = "{}{}".format(column, row)
            #print(cell_name)
            print("cell position {} has value {}".format(cell_name, currentSheet[cell_name].value))

Am făcut acest lucru prin introducerea „pentru rând în raza …”Buclă. Intervalul buclei for este definit de la celula din rândul 1 până la numărul sau rândurile maxime ale foii. A doua pentru căutări în buclă în cadrul unor nume de coloane predefinite „ABCDEF”. În a doua buclă vom afișa poziția completă a celulei (numele coloanei și numărul rândului) și o valoare.

Cu toate acestea, în acest articol sarcina mea este să găsesc o coloană specifică care se numește „telefon” și apoi să parcurg toate rândurile acelei coloane. Pentru a face acest lucru, trebuie să modificăm codul ca mai jos.

import openpyxl

theFile = openpyxl.load_workbook('Customers1.xlsx')
allSheetNames = theFile.sheetnames

print("All sheet names {} " .format(theFile.sheetnames))


def find_specific_cell():
    for row in range(1, currentSheet.max_row + 1):
        for column in "ABCDEFGHIJKL":  # Here you can add or reduce the columns
            cell_name = "{}{}".format(column, row)
            if currentSheet[cell_name].value == "telephone":
                #print("{1} cell is located on {0}" .format(cell_name, currentSheet[cell_name].value))
                print("cell position {} has value {}".format(cell_name, currentSheet[cell_name].value))
                return cell_name

for sheet in allSheetNames:
    print("Current sheet name is {}" .format(sheet))
    currentSheet = theFile[sheet]

Acest cod modificat trece prin toate celulele fiecărei foi și, exact ca înainte, intervalul de rânduri este dinamic și gama de coloane este specifică. Codul trece prin celule și caută o celulă care conține un „telefon” text. Odată ce codul găsește celula specifică, acesta notifică utilizatorul în ce celulă se află textul. Codul face acest lucru pentru fiecare celulă din toate foile care se află în fișierul Excel.

Următorul pas este să parcurgeți toate rândurile respectivei coloane și să imprimați valorile.

import openpyxl

theFile = openpyxl.load_workbook('Customers1.xlsx')
allSheetNames = theFile.sheetnames

print("All sheet names {} " .format(theFile.sheetnames))


def find_specific_cell():
    for row in range(1, currentSheet.max_row + 1):
        for column in "ABCDEFGHIJKL":  # Here you can add or reduce the columns
            cell_name = "{}{}".format(column, row)
            if currentSheet[cell_name].value == "telephone":
                #print("{1} cell is located on {0}" .format(cell_name, currentSheet[cell_name].value))
                print("cell position {} has value {}".format(cell_name, currentSheet[cell_name].value))
                return cell_name

def get_column_letter(specificCellLetter):
    letter = specificCellLetter[0:-1]
    print(letter)
    return letter

def get_all_values_by_cell_letter(letter):
    for row in range(1, currentSheet.max_row + 1):
        for column in letter:
            cell_name = "{}{}".format(column, row)
            #print(cell_name)
            print("cell position {} has value {}".format(cell_name, currentSheet[cell_name].value))



for sheet in allSheetNames:
    print("Current sheet name is {}" .format(sheet))
    currentSheet = theFile[sheet]
    specificCellLetter = (find_specific_cell())
    letter = get_column_letter(specificCellLetter)

    get_all_values_by_cell_letter(letter)

Acest lucru se face prin adăugarea unei funcții numite get_column_letter care găsește o literă a unei coloane. După ce se găsește litera coloanei, parcurgem toate rândurile din coloana respectivă. Acest lucru se face cu get_all_values_by_cell_letter funcție care va imprima toate valorile acelor celule.

Înfășurându-se

Bra gjort! Există multe lucruri pe care le puteți face după aceasta. Planul meu a fost să construiesc o aplicație online care să standardizeze toate numerele de telefon suedeze preluate dintr-o casetă text și să ofere utilizatorilor posibilitatea de a copia pur și simplu rezultatele din aceeași casetă text. Al doilea pas al planului meu a fost extinderea funcționalității aplicației web pentru a susține încărcarea fișierelor Excel, prelucrarea numerelor de telefon din acele fișiere (standardizarea acestora într-un format suedez) și oferirea fișierelor procesate utilizatorilor.

Am îndeplinit ambele sarcini și le puteți vedea live în pagina Instrumente a mea Incodaq.com site:

https://tools.incodaq.com/

De asemenea, codul din a doua parte a acestui articol este disponibil pe GitHub:

https://github.com/GoranAviani/Manipulate-Excel-spreadsheets

Mulțumesc că ai citit! Vedeți mai multe articole de acest gen în profilul meu mediu: https://medium.com/@goranaviani și alte lucruri distractive pe care le construiesc pe pagina mea GitHub: https://github.com/GoranAviani