Wpis z mikrobloga

==============================
#wyzwaniepython rozwiązania Zad 2.
==============================

Mirki dziś dobiega konca drugie zadanie #wyzwaniepython. W komentarzach podajecie linki do swoich programów.
Możecie je wrzucać na pastebin.com lub inne podobne strony.
UWAGA
**Podawajcie linki "raw" czyli dla np pastebin.com jest to http://pastebin.com/raw/xxxxxx
Oraz napiszcie swój poziom trudności( łatwe/trudne) Czekamy na linki do jutra do 18:00(termin ostateczny).
Przypominam o głosowaniu na trzecie zadanie które będzie ostatnie z tematyki plikow. Link do głosowania
  • 47
  • Odpowiedz
### Częste problemy ###

1) Korzystaj z konstrukcji:

if __name__ == '__main__':
# domyslnie uruchamiany kod

Pozwala to m.in. na łatwe importowanie kodu, który napiszesz, np. pojedynczej
funkcji do innego pliku.

2) Korzystaj z wysokopoziomowych funkcji; tutaj: do pobierania rozmiaru pliku
os.path.getsize(path) zamiast os.stat(path).

3) Do tworzenia ścieżek używaj funkcji os.path.join(), nie konkatenacji
napisów.

4) Zamiast funkcji os.listdir() i rekurencji możesz skorzystać z funkcji
os.walk() - przejdzie ona po całym drzewie
  • Odpowiedz
@brunix

Z tego co wyżej: 1), 2), 5), 7), 8)

Dodatkowo:
- zamiast filetype_summary wystarczyłby słownik - tak wygląda na Javę ;-),
- zbieranie informacji o plikach jest bardzo nieintuicyjne: znacznie lepiej
byłoby mieć jeden obiekt, który zajmuje się ich zbieraniem, zamiast tworzyć
tymczasowy obiekt, który zajmuje się jedynie aktualizacją zmiennych
statycznych klasy,
- zmienna line wypisywana przed przypisaniem oraz importowanie
modułu test - bez małych poprawek się nie uruchamiało.
  • Odpowiedz
@k0lasz
Pamiętam komentarz o pythongolf, więc ze względu na to nie zwracam uwagi na
jednoznakowe nazwy zmiennych ;-).

Rozwiązanie bardzo mi się podoba - niektórzy w łatwym naklepali 150 linijek :O,
tutaj jest 10, są tylko dwa problemy:
9):
przez rzutowanie do inta zamiast użycie funkcji round,
np. dla hpp nie wypisuje żadnego #, a powinnien być jeden (51/2881 plików:
(51/2881) * 50 ~ 0.89).
10)
histogram jest zawsze zapisywany
  • Odpowiedz
@GitLog: dzięki za review, pisałem tak dosyć na szybko, prawdę mówiąc nawet tego nie przetestowałem porządnie.
O tym rzutowaniu pomyslałem już po udostępnieniu (poszło, więc trudno się mówi).
Odnośnie hardkodowania nazwy pliku, to tak jak z nazwami zmiennych - oszczędność miejsca w tym przypadku ;)

Rękawicy pythongolf chyba nikt nie podjął, więc nie wiem czy jest sens przy kolejnych zadaniach iść typowo w liczbę znaków, czy właśnie bardziej skupić się na
  • Odpowiedz
@k0lasz: na to nalega @GlenPL (on jest naszym pythonowym guru, zdecydowanie najlepiej ogarnia) i na tym chcemy się skupić. Późnym wieczorem przejrzę następne rozwiązania (mały problem z czasem miałem :/ ) i wrzucę ich review. Staram się wszystko odpalać, testować i sprawdzać błędy - powinniśmy mieć to niedługo ładnie zautomatyzowane. Przy zadaniach z wątkami będzie z tym (tj. testowaniem) problem, ale za to będziemy mieć czas, by popracować na frameworkiem i
  • Odpowiedz
@GitLog: schlebiasz mi :P

@k0lasz: fajne rozwiązanie, w pierwszym zadaniu ktoś też pisał rozwiązanie nastawione na ilość znaków - możesz zawołać tamtą osobę i zapytać czy chce się bawić :) ale tak poza tym to tak jak mówi @GitLog ja najchętniej widziałbym to pisane właśnie ładnym, pythonicznym kodem
  • Odpowiedz
@terror_blade

Z listy: 10) - w ogóle nie sprawdzasz argumentów, z którymi skrypt został
wywołany.

Dodatkowo:
- with open(newFileName, 'w') as f: automatycznie zamknie plik za Ciebie;
wydaje mi się, że to po prostu pozostałość po wcześniejszym podejśćiu
- zamiast if-else w liniach 9-13 możesz wykorzystać metodę get słownika, której
możesz podać domyślnie zwracaną wartość
- nie przechodzisz po wszystkich katalogach, przez co wypisany wynik jest
nieprawidłowy - zerknij na funkcję os.walk()
  • Odpowiedz
@loorens

Z listy wyżej: 6) i 9).

Odnośnie formatu, to masz dwa błędy:
- maksymalnie ma być 50 znaków # - gdy jest tylko jedno rozszerzenie; między
poprzednią kolumną a tą ma być 10 spacji,
- zaokrąglenie robimy funkcją round, nie przez rzutowanie na inta, czyli
zamiast:

int((item[1] / all_files_count) * 60)
powinno być:

round((item[1] / all_files_count) * 50)
Dodatkowo, tak jak komentarz wyżej, możesz użyć metody get() udostępnianej
przez dict()
  • Odpowiedz
@g33k

Z listy: 3) (przez to Twój program nie działał pod Linuksem), 4), 9)
(rozszerzenia z wielkimi literami powinny takie pozostać) oraz 11).

Dodatkowo:
- przekazywanie części sys.argv do funkcji main jest bardzo mylące; lepiej
je wcześniej przeparsować (np. modułem argparse),
- możesz spróbować użyć konstrukcji:

a = b if c else d
  • Odpowiedz
@orbitpl

Twoje rozwiązanie działa... dziwnie. Stworzyło u mnie 473 pliki (co mnie
ucieszyło w jakiś sposób - utwierdziło w przekonaniu, że rozwiązania należy
odpalać w wirtualnym środowisku ;-) ). Wygląda na to, że zrobiłeś osobny
histogram dla każdego katalogu. Przeczytaj jeszcze raz
specyfikację
i spróbuj to do niej dopasować.

Kod wygląda w miarę ok, można by go dość solidnie skrócić przy użyciu dict i
przerobieniu pętli.

W rozwiązaniu trudnym brakuje sqlalchemy oraz
  • Odpowiedz
@Dewastators

Z listy: 1), 4), 10), 11) - pobierasz nazwę katalogu, ale pliku wyjściowego już nie.

Dodatkowo:
- szerokość kolumny czy 'B' możesz zapisać w stringu, na którym wywołujesz
format() - moim zdaniem jest to czytelniejsze.
  • Odpowiedz
@oko_strusia

Z listy:
4) w Twoim przypadku wykorzystywane jest scandir, nie listdir
5) zauważ, że i u Ciebie nie jest wywoływana funkcja close na pliku -
brakuje ()!
,
9) - kolumna z '#' powinna mieć maksymalnie 50 znaków i 10 spacji z lewej
strony, czyli powinieneś mnożyć przez 50, nie 60 (u Ciebie MAX_GRAPH_COUNT)
11)

Dodatkowo:
- przekazywanie części sys.argv do funkcji pod tą samą nazwą jest bardzo
  • Odpowiedz
@Calvert

Podoba mi się wykorzystanie informacji z bazy danych z wersji trudnej do
wypisania histogramu z wersji łatwej.

Z listy:
3) tak jak w którymś komentarzu poprzednio pisałem, przez to Twój program nic nie
wypluwał, 5), 6), 8) (nie wypisujesz 'B'), 11)

Dodatkowo:
- nazywasz zmienne nazwami funkcji wbudowanych i je zasłaniasz, np. all,
przejrzyj spis funkcji wbudowanych (w Pythonie 2 do listy należy też file):
https://docs.python.org/3.5/library/functions.html
- zamiast sklejać ścieżki
  • Odpowiedz
@barteb

Z listy: 1), 2), 4), 5) (wywołujesz tutaj wprawdzie close()), 11).

Dodatkowo:
- zamiast list, możesz użyć słowników, patrz: mój przedostatni komentarz,
- nie musisz sprawdzać, czy wartość logiczna w ifie jest True czy False,
wystarczy:
if entry.is_dir()
zamiast
if entry.is_dir() is True
i nie musisz się zastanawiać, czy użyć == czy is
  • Odpowiedz