Bebek Adları Python Egzersizi

Vatandaşlık yönetimi, yıla göre ABD'de o yıl doğan bebeklerin en popüler adlarını içeren bu faydalı verilere sahiptir (sosyal güvenlik bebek adları bölümüne bakın).

Bu alıştırmaya ilişkin dosyalar google-python-exercises içindeki "babynames" dizinindedir (daha önce yapmadıysanız google-python-exercises.zip dosyasını indirin, ayrıntılar için Kurulum'a bakın). Kodunuzu Babynames.py dosyasına ekleyin. Baby1990.html baby1992.html ... dosyaları, yukarıdaki sosyal güvenlik sitesini ziyaret ettiğinizde gördüğünüze benzer ham html içeriyor. html'ye göz atın ve içindeki verileri nasıl kazıyabileceğinizi düşünün.

A Bölümü

Babynames.py dosyasında, bir baby*.html dosyasının dosya adını alıp dosyadaki verileri tek bir liste olarak döndüren (listenin başındaki yıl dizesi ve ardından alfabetik sırayla ad sırası dizeleri gelen) extract_names(dosyaadı) işlevini uygulayın. ['2006', 'Aaliyah 91', 'Abagail 895', 'Aaron 57', ...]. Main() işlevini değiştirin. Böylece, Ay. Yıl ve her ad için normal ifadeler üzerinde çalışırken takılırsanız bu dokümanın sonunda çözüm normal ifade kalıpları gösterilir. Genel olarak web sayfalarını ayrıştırmak için normal ifadelerin işe yaramadığını, ancak bu web sayfalarının basit ve tutarlı bir biçime sahip olduğunu unutmayın.

Kız ve erkek adlarını ayrı ayrı ele almak yerine hepsini bir araya getiririz. Bazı yıllarda bir ad html'de birden fazla kez yer alsa da ad başına yalnızca bir sayı kullanacağız. İsteğe bağlı: Bu durum için algoritmanın akıllı olmasını sağlayın ve hangi sayı daha küçükse onu seçin.

Programı, bir dizi küçük ara hedef şeklinde oluşturun. Her adımın, bir sonraki adımı denemeden önce bir şey çalıştırmasını/yazdırmasını sağlayın. Deneyimli programcıların kullandığı kalıp budur. Tüm programı tek bir büyük adımda oluşturmak yerine, her biri kontrol edilecek çıktılar içeren bir dizi artımlı ara hedef oluşturun.

Bir ara hedefin sonunda sahip olduğunuz verileri yazdırmak, bu verileri bir sonraki ara hedef için nasıl yeniden yapılandıracağınızı düşünmenize yardımcı olur. Python bu artımlı geliştirme tarzı için uygundur. Örneğin, öncelikle yılı çıkarıp yazdırdığı ve sys.exit(0) yöntemini çağırdığı noktaya getirin. Önerilen ara hedeflerden bazıları şunlardır:

  • Dosyadan tüm metni çıkarıp yazdırın
  • Yılı bulup çıkarın ve yazdırın
  • Adları ve sıralama numaralarını çıkarıp yazdırın
  • Ad verilerini bir dikteye alın ve yazdırın
  • [Yıl, 'ad sıralaması', ... ] listesini oluşturun ve yazdırın
  • ExtractNames listesini kullanmak için main() komutunu düzeltin

Daha önce, standart olarak yazdırılan işlevlerimiz vardı. Daha sonra tekrar tekrar kullanılabilir ve çıkarılan verileri *döndürür*. Böylece, arayan kişi bunu yazdırma ya da bununla başka bir şey yapma seçeneğine sahip olur. (Geliştirme sırasındaki küçük denemelerinizde doğrudan işlevlerinizin içinden de yazdırabilirsiniz.)

Her komut satırı bağımsız değişkeni için main() çağrısının fit_names() olmasını sağlayın ve bir metin özeti yazdırın. Listeyi makul görünen bir özet metin haline getirmek için şu birleştirme işlemini akıllıca kullanın: text = '\n'.join(mylist) + '\n'

Her dosya için özet metni aşağıdaki gibi görünmelidir:

2006
Aaliyah 91
Aaron 57
Abagail 895
Abbey 695
Abbie 650
...

B Bölümü

Metni standart çıktı olarak yazdırmak yerine metni içeren dosyalar yazmak istediğinizi varsayalım. --summaryfile işareti mevcutsa her "foo.html" giriş dosyası için, standart çıkışa yazdırmak yerine söz konusu dosyanın özet metnini içeren yeni bir "foo.html.summary" dosyası yazın.

--summaryfile özelliği çalışmaya başladığında, aşağıdaki gibi * kullanarak programı tüm dosyalarda çalıştırın: "./babynames.py --summaryfile can*.html". Bu işlem, tüm özetleri tek adımda oluşturur. (Kabuğun standart davranışı, "baby*.html" kalıbını eşleşen dosya adları listesine genişletmesi ve daha sonra, kabuk, sys.argv listesindeki tüm dosya adlarını geçirerek Babynames.py'yi çalıştırmasıdır.)

Veriler özet dosyaları halinde düzenlenirken, aşağıdakiler gibi kabuk komutlarıyla zaman içindeki kalıpları görebilirsiniz:

$ grep 'Trinity ' *.summary
$ grep 'Nick ' *.summary
$ grep 'Miguel ' *.summary
$ grep 'Emily ' *.summary

Normal ifade ipuçları -- yıl: r'Popülerlik\sin\s(\d\d\d\d)' adları: r'<td>(\d+)</td><td>(\w+)</td>\<td>(\w+)</td>'