1. Python / Говнокод #16476

    −101

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    class TestCase(unittest2.TestCase):
       
       def md5Checksum(self,filePath):
            """
            Calculates MD5sum hash of a file.
            It does this as a stream 1k blocks, for large files.
            We checksum the sample LFD we download as a test, in order to check it gave us the right one back, no corruption.
            Returns MD5sum as string.
            """
            try:
                with open(filePath, 'rb') as fh:
                    m = hashlib.md5()
                    while True:
                        data = fh.read(1024) #: Read 1kb chunks, for large files.
                        if not data:
                            break
                        else:
                            m.update(data)
                return str(m.hexdigest())
            except Exception as e:
                self.fail(str( e ))
                return ""

    md5 hash, the hard way

    Запостил: ykhrustalev, 05 Августа 2014

    Комментарии (17) RSS

    • В чем ты видишь быдлокод? return "" и str(e) вместо e.message?
      Ответить
      • с точки зрения pep8 и названия переменных - код отстойный, безусловно
        Ответить
        • да и метод лучше вынести либо в отдельную функцию, либо в статикметод
          Ответить
      • вот как надо http://stackoverflow.com/a/3431835/186912
        Ответить
        • видимо у автор так сделал из-за проблем с большими файлами. код зато читабельный, не в одну строчку всего и сразу :)
          Ответить
    • @guest, как в чем?
      - это код из тест класса
      - try/except который с ретурн после фейла
      - рид по 1к вместо "for line in file"
      - комент гавенный
      - нейминг

      да тут все говно в этом куске
      Ответить
      • - рид по 1к вместо "for line in file"
        for line in file - говно. read норм, надо только поднять константу до 4096 - типичный размер блока.
        Ответить
      • > open(filePath, 'rb')
        > for line in file
        Упрлс?
        Ответить
        • Почему нет? Кстати, 'b' - единственный способ на винде не искалечить переносы строки.
          Ответить
          • Не туда нужно было ответ писать.

            Кэп на связи.

            Борманд намекнул, что двоичный режим и чтение по строкам — нонсенс. Тут нужно либо 'b' убрать (потому что всё равно файл порежется на строки), либо read вернуть.

            Поскольку нужно считать контрольную сумму, то файл нельзя калечить. Следовательно, оставляем и 'b', и read.
            Ответить
            • Позвольте, а питон позволит открыть фаил через b и обращать к линиям? Тогда зачем вообще b? для программиста? или b просто говорит - чувак. ты еще можешь как к бинарному потоку обратиться. А можешь и по другому
              Ответить
              • file.readline([size])
                Read one entire line from the file. A trailing newline character is kept in the string (but may be absent when a file ends with an incomplete line).


                open(name[, mode[, buffering]])
                The default is to use text mode, which may convert '\n' characters to a platform-specific representation on writing and back on reading.


                Похоже, что позволит. Но это имеет смысл, поскольку стандартная библиотека Питона, в отличие от библиотек других языков, сохраняет символ перевода строки в строке. Т. е. в обычных задачах нам ещё придётся отрезать от строки последний символ, означающий её окончание.

                Но если мы не укажем 'b', то он при чтении может заменить \r\n на \n, т. е. потерять \r.
                Ответить
                • >> то он при чтении может заменить


                  Вот он, эталон. Я хотел просто прочитать стандартным методом из стандартной либой, а он взял и поменял символы в файле при чтении. Питон вэй, ау!
                  Ответить
                  • Сишка (fopen и друзья) тоже меняет, если на то пошло.
                    Ответить
                    • хм, и правда. Никогда внимания не обращал. пойду пересоберу мир.
                      Ответить
          • Всё, разобрался. Можно, но в данной конкретной задаче не нужно.
            Ответить
      • Тормоза будут из-за "for line in file", поскольку придётся сканировать входной поток на предмет появления символа конца строки, да и буферы будут разного размера.

        Удачной обработки, если в терабайтном архиве байт "\n" вообще не встретится или наоборот будет встречаться через каждые десять байтов.
        Ответить

    Добавить комментарий