Python IO Gurus: каковы различия между этими двумя методами? - PullRequest
1 голос
/ 07 декабря 2009

У меня есть два метода для записи бинарных файлов: первый работает с данные, полученные сервером, соответствующие загрузке файла (т. е. обработке формы, чей enctype = "multipart / form-data"), а вторая работает с данными файла, отправленными в виде вложений электронной почты (т. е. данными файла, полученными путем анализа сообщения электронной почты тело сообщения с использованием get_payload ()).

Странно то, что они не являются взаимозаменяемыми: если я использую первый, чтобы сохранить данные, проанализированные из вложения электронной почты, произойдет сбой; аналогично, вторая функция завершается ошибкой при работе с данными загруженного файла.

Каковы критические различия?

Это первый метод:

def write_binary_file (folder, filename, f, chunk_size=4096):
    """Write the file data f to the folder and filename combination"""
    result = False
    if confirm_folder(folder):
        try:
            file_obj = open(os.path.join(folder, file_base_name(filename)), 'wb', chunk_size)
            for file_chunk in read_buffer(f, chunk_size):
                file_obj.write(file_chunk)
            file_obj.close()
            result = True
        except (IOError):
            print "file_utils.write_binary_file: could not write '%s' to '%s'" % (file_base_name(filename), folder)
    return result

Это второй метод:

def write_binary_file (folder, filename, filedata):
    """Write the binary file data to the folder and filename combination"""
    result = False
    if confirm_folder(folder):
        try:
            file_obj = open(os.path.join(folder, file_base_name(filename)), 'wb')
            file_obj.write(filedata)
            file_obj.close()
            result = True
        except (IOError):
            print "file_utils.write_binary_file: could not write '%s' to '%s'" % (file_base_name(filename), folder)
    return result

Ответы [ 3 ]

2 голосов
/ 07 декабря 2009

Разница в том, что метод HTTP-загрузки (первый) - получает в качестве своих параметров сам файл-подобный объект (переменная "f") и создает специфический для модуля CGI "read_buffer" для чтения данных из этого фрагмента. объект файла, чтобы скопировать их в фактический файл.

Это может иметь смысл в приложении загрузки http, так как это позволит начать копирование файла во время его загрузки - лично я не думаю, что это будет иметь значение, за исключением случаев загрузки нескольких мегабайт, поскольку ваш ответ http будет остановлен до тех пор, пока вся загрузка не будет выполнена, простым скриптом CGI.

Другой метод получает "file_data" в качестве параметров: все, что ему нужно сделать, это записать эти данные в новый файл. (Другой должен прочитать данные из файла-объекта-объекта, и он все еще создает промежуточный объект для этого)

Вы можете использовать второй метод для сохранения данных HTTP, просто передайте тип объекта, который он ожидает, в качестве параметров, поэтому вместо вызова второй функции с аргументом "f", предоставленным значениями поля CGI, вызовите это с помощью "f.read ()" - это приведет к тому, что все данные будут считаны из файла, подобного файлу "f", и соответствующие данные будут видны методом.

т.е:.

#second case:
write_binary_file(folder, filename, f.read() )
1 голос
/ 07 декабря 2009

Первый, вероятно, ожидает файл-подобный объект в качестве параметра, из которого он считывает данные. Второй ожидает, что этот параметр будет строкой с фактическими данными для записи.

Чтобы убедиться, что вам нужно посмотреть, что делает ваша read_buffer функция.

0 голосов
/ 07 декабря 2009

Самым очевидным отличием является частичное чтение данных. Вы не указываете ошибку, но я предполагаю, что метод chunked завершается ошибкой при вызове read_buffer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...