Grote Bestanden Verwerken
Het efficiënt verwerken van grote bestanden is essentieel bij het werken met datasets die te groot zijn om in het geheugen te passen. Python biedt hulpmiddelen zoals open() en map(), waarmee bestanden lui verwerkt kunnen worden, wat geheugen bespaart en de prestaties verbetert.
Wat zijn iterators?
Voordat we verder gaan met de open()-functie, moeten we eerst begrijpen wat een iterator is. Een iterator is een object dat een stroom van gegevens vertegenwoordigt, waarmee je één item tegelijk kunt benaderen. Iterators implementeren twee methoden:
__iter__(): retourneert het iterator-object zelf;__next__(): retourneert het volgende item in de stroom en geeft eenStopIteration-fout als er geen items meer zijn.
Stel dat we een iterator hebben genaamd iterator_object. We kunnen hierover itereren met een gewone for-lus:
for element in iterator_object:
... # Process the element
In feite gebeurt het volgende onder de motorkap (de functie next() roept intern de methode __next__() van de iterator aan):
while True:
try:
element = next(iterator_object)
... # Process the element
except StopIteration:
break
In tegenstelling tot standaardcollecties worden iterators gekenmerkt door luie evaluatie, wat betekent dat ze gegevens alleen genereren of ophalen wanneer dat nodig is, in plaats van alles tegelijk in het geheugen te laden. Deze aanpak maakt ze zeer geheugenefficiënt, vooral bij het werken met grote datasets.
Bestandsobjecten als iterators
De functie open() retourneert een bestandsobject, dat een iterator is. Dit maakt het mogelijk om:
- Regel voor regel door een bestand te itereren met een
for-lus; - Eén regel tegelijk in het geheugen te lezen, waardoor het geschikt is voor grote bestanden (zolang individuele regels in het geheugen passen).
Als bijvoorbeeld een logbestand met 1,000,000 regels zowel INFO- als ERROR-meldingen bevat, kunnen we nog steeds het aantal ERROR-voorkomens tellen door het bestand regel voor regel te doorlopen, zelfs als het bestand niet volledig in het geheugen past (wat het geval zal zijn als we er veel meer logs aan toevoegen).
1234567891011log_lines = [f"INFO: Log entry {i}" if i % 100 != 0 else f"ERROR: Critical issue {i}" for i in range(1, 1000001)] with open("large_log.txt", "w") as log_file: log_file.write("\n".join(log_lines)) # Process the file to count error entries error_count = 0 for line in open("large_log.txt"): if "ERROR" in line: error_count += 1 print(f"Total error entries: {error_count}")
Regels in bestanden transformeren met map()
Zoals vermeld in het vorige hoofdstuk, retourneert map() een iterator die een transformatiefunctie lui toepast op elke regel in een bestand. Net als bij bestandsobjecten verwerkt map() gegevens één item tegelijk zonder alles in het geheugen te laden, waardoor het een efficiënte optie is voor het verwerken van grote bestanden.
Bijvoorbeeld: stel een bestand samen met 1000000 e-mailadressen, waarvan sommige hoofdletters bevatten. Het doel is om alle e-mails naar kleine letters om te zetten en de genormaliseerde resultaten op te slaan in een nieuw bestand ('normalized_emails.txt'). Hiervoor wordt map() gebruikt, zodat het script efficiënt blijft en geschikt is voor het verwerken van nog grotere bestanden.
12345678910111213141516171819202122# Create a file with mixed-case email addresses email_lines = [ "John.Doe@example.com", "Jane.SMITH@domain.org", "BOB.brown@anotherexample.net", "ALICE.williams@sample.com" ] * 250000 # Repeat to simulate a large file with open("email_list.txt", "w") as email_file: email_file.write("\n".join(email_lines)) # Process the file to standardize email addresses (convert to lowercase) with open("email_list.txt") as input_file, open("normalized_emails.txt", "w") as output_file: # Use map() to convert each email to lowercase lowercase_emails = map(str.lower, input_file) for email in lowercase_emails: output_file.write(email) # Print the last email to verify the results print(email) print('Done')
1. Je moet alle e-mailadressen in een bestand omzetten naar kleine letters en deze opslaan in een nieuw bestand zonder alles in het geheugen te laden. Welke aanpak is het meest efficiënt?
2. Welke van de volgende uitspraken over bestandsobjecten is correct?
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.
Awesome!
Completion rate improved to 7.69
Grote Bestanden Verwerken
Veeg om het menu te tonen
Het efficiënt verwerken van grote bestanden is essentieel bij het werken met datasets die te groot zijn om in het geheugen te passen. Python biedt hulpmiddelen zoals open() en map(), waarmee bestanden lui verwerkt kunnen worden, wat geheugen bespaart en de prestaties verbetert.
Wat zijn iterators?
Voordat we verder gaan met de open()-functie, moeten we eerst begrijpen wat een iterator is. Een iterator is een object dat een stroom van gegevens vertegenwoordigt, waarmee je één item tegelijk kunt benaderen. Iterators implementeren twee methoden:
__iter__(): retourneert het iterator-object zelf;__next__(): retourneert het volgende item in de stroom en geeft eenStopIteration-fout als er geen items meer zijn.
Stel dat we een iterator hebben genaamd iterator_object. We kunnen hierover itereren met een gewone for-lus:
for element in iterator_object:
... # Process the element
In feite gebeurt het volgende onder de motorkap (de functie next() roept intern de methode __next__() van de iterator aan):
while True:
try:
element = next(iterator_object)
... # Process the element
except StopIteration:
break
In tegenstelling tot standaardcollecties worden iterators gekenmerkt door luie evaluatie, wat betekent dat ze gegevens alleen genereren of ophalen wanneer dat nodig is, in plaats van alles tegelijk in het geheugen te laden. Deze aanpak maakt ze zeer geheugenefficiënt, vooral bij het werken met grote datasets.
Bestandsobjecten als iterators
De functie open() retourneert een bestandsobject, dat een iterator is. Dit maakt het mogelijk om:
- Regel voor regel door een bestand te itereren met een
for-lus; - Eén regel tegelijk in het geheugen te lezen, waardoor het geschikt is voor grote bestanden (zolang individuele regels in het geheugen passen).
Als bijvoorbeeld een logbestand met 1,000,000 regels zowel INFO- als ERROR-meldingen bevat, kunnen we nog steeds het aantal ERROR-voorkomens tellen door het bestand regel voor regel te doorlopen, zelfs als het bestand niet volledig in het geheugen past (wat het geval zal zijn als we er veel meer logs aan toevoegen).
1234567891011log_lines = [f"INFO: Log entry {i}" if i % 100 != 0 else f"ERROR: Critical issue {i}" for i in range(1, 1000001)] with open("large_log.txt", "w") as log_file: log_file.write("\n".join(log_lines)) # Process the file to count error entries error_count = 0 for line in open("large_log.txt"): if "ERROR" in line: error_count += 1 print(f"Total error entries: {error_count}")
Regels in bestanden transformeren met map()
Zoals vermeld in het vorige hoofdstuk, retourneert map() een iterator die een transformatiefunctie lui toepast op elke regel in een bestand. Net als bij bestandsobjecten verwerkt map() gegevens één item tegelijk zonder alles in het geheugen te laden, waardoor het een efficiënte optie is voor het verwerken van grote bestanden.
Bijvoorbeeld: stel een bestand samen met 1000000 e-mailadressen, waarvan sommige hoofdletters bevatten. Het doel is om alle e-mails naar kleine letters om te zetten en de genormaliseerde resultaten op te slaan in een nieuw bestand ('normalized_emails.txt'). Hiervoor wordt map() gebruikt, zodat het script efficiënt blijft en geschikt is voor het verwerken van nog grotere bestanden.
12345678910111213141516171819202122# Create a file with mixed-case email addresses email_lines = [ "John.Doe@example.com", "Jane.SMITH@domain.org", "BOB.brown@anotherexample.net", "ALICE.williams@sample.com" ] * 250000 # Repeat to simulate a large file with open("email_list.txt", "w") as email_file: email_file.write("\n".join(email_lines)) # Process the file to standardize email addresses (convert to lowercase) with open("email_list.txt") as input_file, open("normalized_emails.txt", "w") as output_file: # Use map() to convert each email to lowercase lowercase_emails = map(str.lower, input_file) for email in lowercase_emails: output_file.write(email) # Print the last email to verify the results print(email) print('Done')
1. Je moet alle e-mailadressen in een bestand omzetten naar kleine letters en deze opslaan in een nieuw bestand zonder alles in het geheugen te laden. Welke aanpak is het meest efficiënt?
2. Welke van de volgende uitspraken over bestandsobjecten is correct?
Bedankt voor je feedback!