Przykłady: https://automatetheboringstuff.com/chapter0/
Chcesz mieć możliwość uruchamiania tego programu z argumentem wiersza poleceń, którym jest nazwa konta — na przykład e-mail lub blog. Hasło tego konta zostanie skopiowane do schowka, aby użytkownik mógł je wkleić w polu Hasło. W ten sposób użytkownik może mieć długie, skomplikowane hasła bez konieczności zapamiętywania ich.
Przykład początkowego kodu
#!/usr/bin/python
PASSWORDS = {'email': 'F7minlBDDuvMJuxESSKHFhTxFtjVB6',
'blog': 'VmALvQyKAxiVH5G8v01if1MLZF3sdt',
'luggage': '12345'}
Argumenty wiersza poleceń będą przechowywane w zmiennej sys.argv. Pierwsza pozycja na liście sys.argv powinna zawsze być łańcuchem zawierającym nazwę pliku programu („pw.py”), a być pierwszym argumentem wiersza poleceń. W przypadku tego programu tym argumentem jest nazwa konta, do którego chcesz uzyskać hasło. Ponieważ argument wiersza poleceń jest obowiązkowy, wyświetlasz użytkownikowi komunikat o użyciu, jeśli zapomni go dodać (to znaczy, jeśli lista sys.argv zawiera mniej niż dwie wartości). Spraw, aby Twój program wyglądał następująco:
PASSWORDS = {'email': 'F7minlBDDuvMJuxESSKHFhTxFtjVB6',
'blog': 'VmALvQyKAxiVH5G8v01if1MLZF3sdt',
'luggage': '12345'}
import sys
if len(sys.argv) < 2:
print('Usage: python pw.py [account] - copy account password')
sys.exit()
account = sys.argv[1] # first command line arg is the account name
Teraz, gdy nazwa konta jest przechowywana jako łańcuch w zmiennej account, musisz sprawdzić, czy istnieje ona w słowniku HASŁA jako klucz. Jeśli tak, chcesz skopiować wartość klucza do schowka za pomocą funkcji pyperclip.copy(). (Ponieważ używasz modułu pyperclip, musisz go zaimportować.) Zauważ, że tak naprawdę nie potrzebujesz zmiennej account; możesz po prostu użyć sys.argv[1] wszędzie tam, gdzie używane jest konto w tym programie. Ale zmienna o nazwie account jest o wiele bardziej czytelna niż coś tajemniczego, takiego jak sys.argv[1].
Spraw, aby Twój program wyglądał następująco:
pip install pyperclip
Requirement already satisfied: pyperclip in c:\users\karro\anaconda3\lib\site-packages (1.8.2) Note: you may need to restart the kernel to use updated packages.
PASSWORDS = {'email': 'F7minlBDDuvMJuxESSKHFhTxFtjVB6',
'blog': 'VmALvQyKAxiVH5G8v01if1MLZF3sdt',
'luggage': '12345'}
import sys, pyperclip
if len(sys.argv) < 2:
print('Usage: py pw.py [account] - copy account password')
sys.exit()
account = sys.argv[1] # first command line arg is the account name
if account in PASSWORDS:
pyperclip.copy(PASSWORDS[account])
print('Password for ' + account + ' copied to clipboard.')
else:
print('There is no account named ' + account)
There is no account named -f
Ten nowy kod szuka w słowniku PASSWORDS nazwy konta. Jeśli nazwa konta jest kluczem w słowniku, pobieramy wartość odpowiadającą temu kluczowi, kopiujemy ją do schowka i drukujemy komunikat, że skopiowaliśmy tę wartość. W przeciwnym razie drukujemy komunikat, że nie ma konta o tej nazwie.
Oczywiście prawdopodobnie nie chcesz przechowywać wszystkich swoich haseł w jednym miejscu, w którym każdy mógłby je łatwo skopiować. Ale możesz zmodyfikować ten program i użyć go do szybkiego skopiowania zwykłego tekstu do schowka. Załóżmy, że wysyłasz kilka e-maili, które mają wiele wspólnych akapitów. Mógłbyś umieścić każdy akapit jako wartość w słowniku HASŁA (prawdopodobnie w tym momencie chciałbyś zmienić nazwę słownika), a wtedy miałbyś sposób na szybkie zaznaczenie i skopiowanie jednego z wielu standardowych fragmentów tekstu do schowka.
Pierwszym krokiem jest utworzenie skryptu szkieletowego i wypełnienie go danymi quizu. Utwórz plik o nazwie randomQuizGenerator.py i nadaj mu następujący wygląd:
import random
capitals = {'Alabama': 'Montgomery', 'Alaska': 'Juneau', 'Arizona': 'Phoenix',
'Arkansas': 'Little Rock', 'California': 'Sacramento', 'Colorado': 'Denver',
'Connecticut': 'Hartford', 'Delaware': 'Dover', 'Florida': 'Tallahassee',
'Georgia': 'Atlanta', 'Hawaii': 'Honolulu', 'Idaho': 'Boise', 'Illinois':
'Springfield', 'Indiana': 'Indianapolis', 'Iowa': 'Des Moines', 'Kansas':
'Topeka', 'Kentucky': 'Frankfort', 'Louisiana': 'Baton Rouge', 'Maine':
'Augusta', 'Maryland': 'Annapolis', 'Massachusetts': 'Boston', 'Michigan':
'Lansing', 'Minnesota': 'Saint Paul', 'Mississippi': 'Jackson', 'Missouri':
'Jefferson City', 'Montana': 'Helena', 'Nebraska': 'Lincoln', 'Nevada':
'Carson City', 'New Hampshire': 'Concord', 'New Jersey': 'Trenton', 'New
Mexico': 'Santa Fe', 'New York': 'Albany', 'North Carolina': 'Raleigh',
'North Dakota': 'Bismarck', 'Ohio': 'Columbus', 'Oklahoma': 'Oklahoma City',
'Oregon': 'Salem', 'Pennsylvania': 'Harrisburg', 'Rhode Island': 'Providence',
'South Carolina': 'Columbia', 'South Dakota': 'Pierre', 'Tennessee':
'Nashville', 'Texas': 'Austin', 'Utah': 'Salt Lake City', 'Vermont':
'Montpelier', 'Virginia': 'Richmond', 'Washington': 'Olympia', 'West
Virginia': 'Charleston', 'Wisconsin': 'Madison', 'Wyoming': 'Cheyenne'}
for quizNum in range(35):
# TODO: Create the quiz and answer key files.
# TODO: Write out the header for the quiz.
# TODO: Shuffle the order of the states.
# TODO: Loop through all 50 states, making a question for each.
Input In [5] 'Carson City', 'New Hampshire': 'Concord', 'New Jersey': 'Trenton', 'New ^ SyntaxError: EOL while scanning string literal
Ponieważ ten program będzie losowo porządkował pytania i odpowiedzi, będziesz musiał zaimportować losowy moduł, aby skorzystać z jego funkcji. Zmienna wielkich liter zawiera słownik ze stanami USA jako kluczami i ich dużymi literami jako wartościami. A ponieważ chcesz utworzyć 35 quizów, kod, który faktycznie generuje pliki quizu i odpowiedzi (oznaczone na razie komentarzami TODO), wejdzie do pętli for, która zapętla się 35 razy. (Liczbę tę można zmienić, aby wygenerować dowolną liczbę plików quizów).
Teraz nadszedł czas, aby zacząć wypełniać te TODO. Kod w pętli zostanie powtórzony 35 razy — raz dla każdego quizu — więc musisz się martwić tylko o jeden quiz na raz w pętli. Najpierw utworzysz rzeczywisty plik quizu. Musi mieć unikalną nazwę pliku i powinien również zawierać jakiś standardowy nagłówek z miejscami, w których uczeń może wpisać imię i nazwisko, datę i okres zajęć. Następnie musisz uzyskać listę stanów w losowej kolejności, którą można później wykorzystać do stworzenia pytań i odpowiedzi do quizu. Dodaj następujące wiersze kodu do randomQuizGenerator.py:
for quizNum in range(35):
# Create the quiz and answer key files.
quizFile = open('capitalsquiz%s.txt' % (quizNum + 1), 'w')
answerKeyFile = open('capitalsquiz_answers%s.txt' % (quizNum + 1), 'w')
# Write out the header for the quiz.
quizFile.write('Name:\n\nDate:\n\nPeriod:\n\n')
quizFile.write((' ' * 20) + 'State Capitals Quiz (Form %s)' % (quizNum + 1))
quizFile.write('\n\n')
# Shuffle the order of the states.
states = list(capitals.keys())
random.shuffle(states)
Nazwy plików quizów będą miały postać capitalsquiz
Teraz musisz wygenerować opcje odpowiedzi dla każdego pytania, które będą wielokrotnego wyboru od A do D. Musisz utworzyć kolejną pętlę for — tę, aby wygenerować treść dla każdego z 50 pytań w quizie. Następnie będzie zagnieżdżona trzecia pętla for, aby wygenerować opcje wielokrotnego wyboru dla każdego pytania. Spraw, aby Twój kod wyglądał następująco:
for questionNum in range(50):
# Get right and wrong answers.
correctAnswer = capitals[states[questionNum]]
wrongAnswers = list(capitals.values())
del wrongAnswers[wrongAnswers.index(correctAnswer)]
wrongAnswers = random.sample(wrongAnswers, 3)
answerOptions = wrongAnswers + [correctAnswer]
random.shuffle(answerOptions)
Poprawną odpowiedź łatwo znaleźć — jest ona przechowywana jako wartość w słowniku wielkich liter. Ta pętla przejdzie przez stany na liście przetasowanych stanów, od stanów [0] do stanów [49], znajdzie każdy stan wielkimi literami i zapisze odpowiednią stolicę tego stanu w poprawnej odpowiedzi. Lista możliwych błędnych odpowiedzi jest trudniejsza. Możesz go uzyskać, powielając wszystkie wartości ze słownika wielkich liter, usuwając poprawną odpowiedź i wybierając trzy losowe wartości z tej listy. Funkcja random.sample() ułatwia dokonanie tego wyboru. Jej pierwszym argumentem jest lista, z której chcesz dokonać wyboru; drugim argumentem jest liczba wartości, które chcesz wybrać. Pełna lista opcji odpowiedzi to połączenie tych trzech błędnych odpowiedzi z poprawnymi odpowiedziami. Wreszcie, odpowiedzi muszą być losowane, aby poprawną odpowiedzią nie zawsze był wybór D.
Pozostaje tylko wpisać pytanie do pliku quizu i odpowiedź do pliku klucza odpowiedzi. Spraw, aby Twój kod wyglądał następująco:
#! python3
# randomQuizGenerator.py - Creates quizzes with questions and answers in
# random order, along with the answer key.
--snip--
# Loop through all 50 states, making a question for each.
for questionNum in range(50):
--snip--
# Write the question and the answer options to the quiz file.
quizFile.write('%s. What is the capital of %s?\n' % (questionNum + 1,
states[questionNum]))
for i in range(4):
quizFile.write(' %s. %s\n' % ('ABCD'[i], answerOptions[i]))
quizFile.write('\n')
# Write the answer key to a file.
answerKeyFile.write('%s. %s\n' % (questionNum + 1, 'ABCD'[
answerOptions.index(correctAnswer)]))
quizFile.close()
answerKeyFile.close()
Pętla for przechodząca przez liczby całkowite od 0 do 3 zapisze opcje odpowiedzi na liście answerOptions. Wyrażenie „ABCD”[i] w traktuje ciąg „ABCD” jako tablicę i będzie oceniany jako „A”, „B”, „C”, a następnie „D” w każdej odpowiedniej iteracji w pętli. W ostatnim wierszu wyrażenie answerOptions.index(correctAnswer) znajdzie całkowity indeks poprawnej odpowiedzi w losowo uporządkowanych opcjach odpowiedzi, a 'ABCD'[answerOptions.index(correctAnswer)] oceni literę poprawnej odpowiedzi do zostać zapisane w pliku klucza odpowiedzi.
Być może znasz pliki ZIP (z rozszerzeniem .zip ), w których można przechowywać skompresowaną zawartość wielu innych plików. Kompresja pliku zmniejsza jego rozmiar, co jest przydatne podczas przesyłania go przez Internet. Iponieważ plik ZIP może również zawierać wiele plików i podfolderów, jest to wygodny sposób spakowania kilku plików w jeden. Ten pojedynczy plik, zwany plikiem archiwum , można następnie dołączyć do wiadomości e-mail. Twoje programy w Pythonie mogą zarówno tworzyć, jak i otwierać (lub wyodrębniać ) pliki ZIP przy użyciu funkcji w zipfilemodule. Załóżmy, że masz plik ZIP o nazwie example.zip
Aby odczytać zawartość pliku ZIP, najpierw musisz utworzyć obiekt ZipFile(zwróć uwagę na duże litery Z i F ). ZipFileobiekty są koncepcyjnie podobne do Fileobiektów zwracanych przez open()funkcję w poprzednim rozdziale: Są to wartości, za pomocą których program wchodzi w interakcję z plikiem. Aby utworzyć ZipFileobiekt, wywołaj zipfile.ZipFile()funkcję, przekazując jej ciąg nazwy pliku .zip . Zauważ, że zipfilejest to nazwa modułu Pythona i ZipFile()nazwa funkcji. Na przykład wprowadź następujące polecenie w powłoce interaktywnej:
>>> import zipfile, os
>>> os.chdir('C:\\') # move to the folder with example.zip
>>> exampleZip = zipfile.ZipFile('example.zip')
>>> exampleZip.namelist()
['spam.txt', 'cats/', 'cats/catnames.txt', 'cats/zophie.jpg']
>>> spamInfo = exampleZip.getinfo('spam.txt')
>>> spamInfo.file_size
13908
>>> spamInfo.compress_size
3828
❶ >>> 'Compressed file is %sx smaller!' % (round(spamInfo.file_size / spamInfo
.compress_size, 2))
'Compressed file is 3.63x smaller!'
>>> exampleZip.close()
Obiekt ZipFilema namelist()metodę, która zwraca listę ciągów dla wszystkich plików i folderów zawartych w pliku ZIP. Ciągi te można przekazać do getinfo() ZipFilemetody w celu zwrócenia ZipInfoobiektu dotyczącego tego konkretnego pliku. ZipInfoobiekty mają swoje własne atrybuty, takie jak file_sizei compress_sizew bajtach, które przechowują odpowiednio liczby całkowite oryginalnego rozmiaru pliku i rozmiaru skompresowanego pliku. Podczas gdy ZipFileobiekt reprezentuje cały plik archiwum, ZipInfoobiekt zawiera przydatne informacje o pojedynczym pliku w archiwum. Polecenie ❶ oblicza, jak wydajnie kompresowany jest plik example.zip , dzieląc rozmiar oryginalnego pliku przez rozmiar pliku skompresowanego i wypisuje te informacje, używając łańcucha sformatowanego za pomocą %s.
Metoda extractall()dla ZipFileobiektów wyodrębnia wszystkie pliki i foldery z pliku ZIP do bieżącego katalogu roboczego.
>>> import zipfile, os
>>> os.chdir('C:\\') # move to the folder with example.zip
>>> exampleZip = zipfile.ZipFile('example.zip')
>>> exampleZip.extractall()
>>> exampleZip.close()
Aby utworzyć własne skompresowane pliki ZIP, musisz otworzyć ZipFileobiekt w trybie zapisu , przekazując 'w'jako drugi argument. (Jest to podobne do otwierania pliku tekstowego w trybie zapisu przez przejście 'w'do open()funkcji.) Kiedy przekazujesz ścieżkę do write()metody obiektu ZipFile, Python skompresuje plik w tej ścieżce i doda go do pliku ZIP. Pierwszym argumentem metody write()jest ciąg nazwy pliku do dodania. Drugim argumentem jest parametr typu kompresji , który mówi komputerowi, jakiego algorytmu powinien użyć do kompresji plików; zawsze możesz po prostu ustawić tę wartość na zipfile.ZIP_DEFLATED. (Określa to algorytm kompresji deflate , który działa dobrze na wszystkich typach danych). W powłoce interaktywnej wprowadź następujące polecenie
>>> import zipfile
>>> newZip = zipfile.ZipFile('new.zip', 'w')
>>> newZip.write('spam.txt', compress_type=zipfile.ZIP_DEFLATED)
>>> newZip.close()