【问题标题】:copying contents between two csv files django在两个 csv 文件 django 之间复制内容
【发布时间】:2015-06-02 09:17:10
【问题描述】:

我试图将csvfile 的内容复制到csvfile2。我看不到有关此主题的任何帮助。我还想将值 value 附加到 csvfile2 的第一行。例如:value = 1 输出应该像

`1_dog 1_cat 1_frog `

当value=2结果应该是

2_dog 2_cat 2_frog

取值范围在 1 到 csv 文件总行数之间。(totalrows)

我的试用码:

def csvupload(request, template_name='upload_csv.html'):

if request.method == 'POST':
    form = CSVUploadForm(request.POST, request.FILES)
    if form.is_valid():
        error_list = set()
        value = 1
        csvfile = request.FILES['file']
        file_name = csvfile.name
        file_name = unicodedata.normalize('NFKD', file_name).encode('ascii','ignore')
        csvfile2 = settings.MEDIA_ROOT + '/new/sample.csv'
        writer = csv.writer(outfile, dialect='excel')
        csvfile.open()
        line_entries = csv.DictReader(csvfile, dialect='excel')
        try:
            csvfile.read()
            line_entries = csv.DictReader(csvfile, dialect='excel', delimiter=',')
            rows1 = list(csvfile)
            totalrows = len(rows1)
            success = True
        except:
            messages.error(request, "Could not parse file, invalid format")
            success = False
            return redirect('home')


        if success:
            messages.success(request, "File read..")
        else:
            for err in error_list:
                messages.error(request, err)
    else:
        messages.error(request, "No file selected")
else:
    form = CSVUploadForm()
context = {
    'form': form
}
return render_to_response(template_name, context, context_instance=RequestContext(request))

这段代码不完整。我是python新手,很困惑。有人可以帮忙吗?

【问题讨论】:

  • 1_dog 1_cat 1_frog 似乎不是 csv。你能给我们看几行吗?
  • 我的意思是如果 csv 文件中的数据是 dog,cat,frog.. 那么新的 csv 文件应该显示像 1_dog 这样的值
  • 看起来您在如何打开文件以及如何使用 csv 模块方面存在问题。首先让你的代码在 django 之外工作,然后你可能有机会让它在 django 内部工作......

标签: python django csv


【解决方案1】:

我手边没有 python 解释器,所以我无法测试。稍后我可以提供更完整的答案。

你需要这样的东西 -

阅读 -

>>> import csv
>>> with open('names.csv') as csvfile:
...     reader = csv.DictReader(csvfile)
...     for row in reader:
...         print(row['first_name'], row['last_name'])

写 -

import csv

with open('names.csv', 'w') as csvfile:
    fieldnames = ['first_name', 'last_name']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    writer.writeheader()
    writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})
    writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})
    writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})

所以,首先,将文件保存在服务器的临时位置 -

def handle_uploaded_file(f): # method to save to a temporary location
    with open('some/file/name.csv', 'wb+') as destination:
        for chunk in f.chunks():
            destination.write(chunk)

然后加载它并按照文档中所述逐行阅读。 https://docs.python.org/2/library/csv.html#csv.DictReader

所以你的代码可能类似于 -

def csvupload(request, template_name='upload_csv.html'):

if request.method == 'POST':
    form = CSVUploadForm(request.POST, request.FILES)
    if form.is_valid():
        error_list = set()
        value = 1
        handle_uploaded_file(request.FILES['file']) # save the file

        file_name = csvfile.name
        file_name = unicodedata.normalize('NFKD', file_name).encode('ascii','ignore')
        csvfile2 = settings.MEDIA_ROOT + '/new/sample.csv'
        writer = csv.writer(outfile)
        row_number = 0
        try:
            with open(csvfile2, 'w') as writtenFile:
                fieldnames = ... # use some code to determine the column names dynamically, may be read the first row and then populate the field names
                writer = csv.DictWriter(writtenFile, fieldnames=fieldnames)
                    writer.writerow({...})  # write header row
                with open('some/file/name.csv') as csvfile:
                    line_entries = csv.DictReader(csvfile)
                    for row in line_entries:
                        row_number = row_number + 1
                        valueDict = [...] # populate the rows as a dict
                        writer.writerow(valueDict);
            success = True
        except:
            messages.error(request, "Could load file, invalid format")
            success = False
            return redirect('home')


        if success:
            messages.success(request, "File read..")
        else:
            for err in error_list:
                messages.error(request, err)
    else:
        messages.error(request, "No file selected")
else:
    form = CSVUploadForm()
context = {
    'form': form
}
return render_to_response(template_name, context, context_instance=RequestContext(request))

【讨论】:

    猜你喜欢
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 2013-03-28
    相关资源
    最近更新 更多