Bebek Adları Python Egzersizi

Sosyal Güvenlik yönetiminin, o yıl ABD'de doğan bebekler için en popüler olan isimleri gösteren yıl bazında bu düzenli verileri vardır (bkz. sosyal güvenlik bebek adları) yönlendirmesi gerekir.

Bu alıştırmaya ilişkin dosyalar "babynames" içindedir google-python-exercises içindeki dizin (önceden yapmadıysanız google-python-exercises.zip dosyasını indirin, ayrıntılar için Kurulum bölümüne bakın). Kodunuzu babynames.py'ye ekleyin. Baby1990.html Baby1992.html ... dosyaları, yukarıdaki sosyal güvenlik sitesini ziyaret ettiğinize benzer RAW html içeriyor. HTML'ye göz atın ve verileri buradan 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(listenin başındaki yıl dizesi ve ardından alfabetik sırayla ad-sıralama dizeleri) döndüren ayıklama işlevini uygulayın. ["2006", "Aaliyah 91", "Abagil 895", "Harun 57", ...]. Main() işlevini, ayıklama_names() işlevinizi çağıracak ve döndürdüğü şeyi yazdıracak şekilde değiştirin (ana sayfada, komut satırı bağımsız değişkeni ayrıştırma kodu zaten vardır). Yıla ve her ada ilişkin normal ifadeleri üzerinde çalışırken takılırsanız, çözüm normal ifade kalıpları bu dokümanın sonunda gösterilmiştir. Genel olarak web sayfalarını ayrıştırmak için normal ifadelerin iyi bir iş çıkarmadığını ancak bu web sayfalarının basit ve tutarlı bir biçime sahip olduğunu unutmayın.

Erkek ve kız adlarını ayrı ayrı ele almak yerine, hepsini bir araya getireceğiz. Bazı yıllarda bir ad html'de birden çok kez görünse de her ad için yalnızca bir rakam kullanırız. İsteğe bağlı: Algoritmayı bu durum konusunda akıllı hale getirin ve daha küçük olan sayıyı seçin.

Programı bir dizi küçük ara hedef olarak oluşturun ve bir sonraki adıma geçmeden önce her adımı bir şeyi yayınlamak/yazmak için alın. Deneyimli programcıların kullandığı kalıp budur. Tüm programı tek bir büyük adımda oluşturmak yerine, her birinde kontrol edilmesi gereken çıktılar içeren bir dizi artımlı ara hedef oluşturun.

Bir ara hedefin sonunda sahip olduğunuz verileri yazdırmak, o 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 çok uygundur. Örneğin, ilk olarak yılı çıkarıp yazdırdığı ve sys.exit(0) çağrısı yaptığı noktaya getirin. Önerilen ara hedeflerden bazıları şunlardır:

  • Dosyadaki tüm metni çıkarıp yazdırın
  • Yılı bulup ayıklama ve yazdırma
  • Adları ve sıralama numaralarını çıkarıp yazdırın
  • Ad verilerini bir metne dönüştürüp yazdırın
  • [yıl, 'ad sıralaması', ... ] listesini oluşturun ve yazdırın
  • ExtractNames listesini kullanmak için main() işlevini düzeltin

Daha önce standart olarak yazdırılan işlevler vardı. İşlevin, ayıklanmış verileri *döndürmesi* daha kolaydır. Böylece çağrıyı yapana, bu verileri yazdırma veya başka bir işlem yapma seçeneği sunulur. (Geliştirme sırasında küçük denemeleriniz için doğrudan işlevlerinizin içinden yazdırmaya devam edebilirsiniz.)

Her bir komut satırı bağımsız değişkeni için Main() çağrısının ayıklama_names() yapmasını sağlayın ve bir metin özeti yazdırın. Listeyi makul bir özet metnine dönüştürmek için birleştirmeyle ilgili şu bilgilerden yararlanabilirsiniz: text = '\n'.join(mylist) + '\n'

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

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

B Bölümü

Metni standart olarak yazdırmak yerine, metni içeren dosyalar yazmak istediğimizi varsayalım. --summaryfile varsa şunu yapın: "foo.html" giriş dosyaları için, standart çıkışa yazdırmak yerine "foo.html.summary" adlı yeni bir dosya yazın dosyanın özet metnini içeren bir dosya oluşturur.

--summaryfile özelliği çalışmaya başladıktan sonra, * işaretini kullanarak programı tüm dosyalarda şu şekilde çalıştırın: "./babynames.py --summaryfile baby*.html". Bu işlem, tüm özetleri tek bir 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, babynames.py'yi çalıştırarak tüm bu dosya adlarını sys.argv listesine iletmesidir.)

Özet dosyaları halinde düzenlenen veriler sayesinde aşağıdaki 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>'