使用io.TextIOWrapper从内存中的CSV文件中读取第一行

时间:2017-08-21 21:17:52

标签: django python-3.x csv

我可以使用Django表单成功上传和访问CSV文件,并循环遍历文件中的行。但是,第一行包含列标题,当代码开始读取文件时,它们会以某种方式跳过。

from io import TextIOWrapper

if request.method == 'POST':

    form = UploadFileForm(request.POST, request.FILES)

    if form.is_valid():

        csvfile = TextIOWrapper(request.FILES['file'], encoding="utf-8")

        logger.info('Position: {}'.format(csvfile.tell())) # <-- This returns 0

        for line in csvfile:

            logger.info('line: {}'.format(line)) # <-- The first iteration actually logs the second line in the CSV file.

什么会导致第一次调用for循环中的文件返回文件中的第二行?

2 个答案:

答案 0 :(得分:0)

您的代码看起来像文件,但我不确定它为什么不起作用。您可以发布样本CSV文件,也可以尝试使用Python的CSV阅读器。这是一个比io更好的图书馆。请参阅下面的示例。

假设您的文件看起来像这样。

std::vector<uint8_t> newVec(oldvec.begin(),oldvec.end());

这段代码可以给你一两个想法:

workers,constant,age
w0,7.334,-1.406
w1,5.235,-4.936
w2,3.2225,-1.478
w3,0,0

您可以使用.next()函数获取标题,然后您可以遍历行以获取后续行中的值。

答案 1 :(得分:0)

问题最终出现在上传的CSV文件中。打开测试CSV文件以清除数据并在发布之前以新名称重新保存数据后,我能够从清理的CSV文件中读取列标题行。

原始来源CSV是来自Excel的电子邮件CSV导出。在LibreOffice Calc中打开CSV并重新保存为CSV文件,删除几个隐藏的字符。