Python:写入文件失败,无错误-导致文件为空

Python:写入文件失败,无错误-导致文件为空,python,django,Python,Django,我正在使用Django处理上传的文件,并将其写入项目中的某个位置 处理文件上载的视图为: def add_data(request): # If something was posted upload_form = DataImportUploadForm(request.POST, request.FILES) if request.method == 'POST' else DataImportUploadForm() if request.method ==

我正在使用Django处理上传的文件,并将其写入项目中的某个位置

处理文件上载的视图为:

def add_data(request):
    # If something was posted

    upload_form = DataImportUploadForm(request.POST, request.FILES) if request.method == 'POST' else DataImportUploadForm() 

    if request.method == 'POST':
        if upload_form.is_valid():
            upload_form.handle_uploaded_file()
            return HttpResponseRedirect(request, '/path/' ) 
        else:
            messages.error(request, ugettext(u"Could not import data"))

    return render_to_response('folder/add.html', {'upload_form': upload_form}, context_instance=RequestContext(request))
表格为:

class DataImportUploadForm(forms.Form):
    file = forms.FileField(label=_(u"File"), required=True)

    def __init__(self, *args, **kwargs):
        super(DataImportUploadForm, self).__init__(*args, **kwargs)
        self.max_upload_size = 1024*1024 #1 MB
        self.fileformat = None
        self.filename = None


    def clean_file(self):
        f = self.cleaned_data.get('file')
        if not f:
            raise forms.ValidationError(_(u"No file uploaded"))

        if f._size > self.max_upload_size:
            raise forms.ValidationError(_(u"Uploaded file is too large ( > 1MB )"))

        try:
            reader = csv.reader(f, csv.get_dialect('excel'))
            reader.next()
            self.fileformat = 'excel'
        except:
            reader = None

        if reader is None:
            try:
                dialect = csv.Sniffer().sniff(f.read(1024))
                f.seek(0)
                reader = csv.reader(f, dialect)
                self.fileformat = 'sniff'
            except:
                reader = None

        if reader is None:
            raise forms.ValidationError(_(u"Unknown data format"))

        self.filename = f._name

        return f

    def handle_uploaded_file(self):
        media_root = settings.MEDIA_ROOT
        file_location = media_root + 'CSV/'
        from core.helpers import ensure_dir
        ensure_dir(file_location)
        f = self.cleaned_data.get('file')
        dest = open(file_location + f._name, 'w+')
        logger.debug(dest)
        for chunk in f.chunks():
            logger.debug(chunk)
            dest.write(chunk)
        logger.debug(dest.closed)
        dest.seek(0)
        logger.debug(dest.read())
        dest.close()
当我上传文件时会发生什么(根据日志文件):


我使用的Django版本是1.4.2,python版本是2.7.5+。ubuntu 13.10中的Nginx+uwsgi&virutalenv+virtualenvwrapper。

尝试刷新内部i/o缓冲区:

    # … your code …
    with open(file_location + f._name, 'w+') as dest:
        logger.debug(dest)
        for chunk in f.chunks():
            logger.debug(chunk)
            dest.write(chunk)
        dest.flush()
等等…在您的日志中显示:

    dest.seek(0)
    logger.debug(dest.read())
真的有效吗?然后内容就写好了

因此,要么:

  • 由于打字错误或其他错误,它被写入错误的路径
  • 由于输入错误或其他错误,您没有打开正确的文件
  • 或者您的文件被代码中的其他内容覆盖

谢谢你的建议。我试过了,结果完全一样。你试过在你的代码中打印出
f
的内容吗?因为您肯定是在
dest
文件中编写的。所以如果里面什么都没有,那应该是因为你不在里面写。是的,我写了。f是django.core.files.uploadedfile.InMemoryUploadedFile,如果我记录f.read(),那么它可以很好地读取其内容。正如日志记录显示的,同样的内容被写入到文件中——毕竟我从写入文件中读取了同样的内容。我不明白为什么文件会变成空的……嗯,你说了3点——我测试的前两个——我删除了文件。我通过从文件夹中删除空文件对前两个进行了测试-它们是在运行视图后再次创建的。所以我猜它们被写入了正确的路径,并且打开/创建了正确的文件。第三个-文件在某处被覆盖。我没有想到这一点,但这怎么可能呢?内存文件也正在被csv阅读器读取。目标文件正在下一个视图中打开。也许那里出了点问题……哦,谢谢你的帮助:)。我非常感激:)建议:为什么不使用CSV编写器?因为我不想开始弄乱文件的原始格式。客户端可能希望在下一个视图中使用不同的csv方言。
    # … your code …
    with open(file_location + f._name, 'w+') as dest:
        logger.debug(dest)
        for chunk in f.chunks():
            logger.debug(chunk)
            dest.write(chunk)
        dest.flush()
    dest.seek(0)
    logger.debug(dest.read())