Работа с большими файлами

Timych

Новичок
Пользователь
Май 14, 2020
2
0
1
Всем привет! В данный момент изучаю cgi скрипты на Питоне. Захотелось реализовать сохранение файла на сервере,при отправке его пользователем (нажатие на кнопку в html форме). Реализовал это как в мануале : http://cgi.tutorial.codepoint.net/big-file-upload

Однако при отправке туда файла формата csv,содержащего 100 000 строк я получаю ответ об успешном окончании записи,но записывается очень маленькое количество строк (в среднем около 30000) и процесс как будто бы просто обрывается. В чем могут быть причины?

Скрипт:


Код:
# -*- coding: utf-8 -*-
import cgi, os
import cgitb

cgitb.enable()

try: # Windows needs stdio set for binary mode.
    import msvcrt
    msvcrt.setmode (0, os.O_BINARY) # stdin  = 0
    msvcrt.setmode (1, os.O_BINARY) # stdout = 1
except ImportError:
    pass

form = cgi.FieldStorage()

# Generator to buffer file chunks
def fbuffer(f, chunk_size=1024):
    while True:
        chunk = f.read(chunk_size)
        if not chunk: break
        yield chunk

# A nested FieldStorage instance holds the file
fileitem = form['file']

# Test if the file was uploaded
if fileitem.filename:


    fn = os.path.basename(fileitem.filename)
    f = open('C:/Users/timna/' + fn, 'wb')

    # Read the file in chunks
    for chunk in fbuffer(fileitem.file):
      f.write(chunk)
    f.close()

Настройки сервера самые обычные, из туториалов :

Код:
# -*- coding: utf-8 -*-
from http.server import HTTPServer, CGIHTTPRequestHandler
server_address = ("", 8000)
httpd = HTTPServer(server_address, CGIHTTPRequestHandler)
httpd.serve_forever()

Заранее спасибо за отклик!
 
Последнее редактирование:

MaksimD

Пользователь
Пользователь
Май 12, 2020
51
11
8
f = open('C:/Users/timna/' + fn, 'wb')

Укажы размер буфера. Возможно у тебя происходит потеря данных из-за отключенной буферизации.

f = open('C:/Users/timna/' + fn, 'wb', 1024)
f.flush() # сброс буфера
f.close()
 
Последнее редактирование:

Форум IT Специалистов