【问题标题】:Issue with parsing csv from Django web form从 Django Web 表单解析 csv 的问题
【发布时间】:2019-07-18 07:35:37
【问题描述】:

我希望有人可以帮助我解决这个问题。我从 Django 的表单中获取一个文件,这个文件是一个 csv,我正在尝试使用 Python 的库 csv 来读取它。这里的问题是,当我应用函数 csv.reader 并将结果转换为列表以打印它时,我发现 csv.reader 不是正确拆分我的文件。 这是一些显示问题的图像

这是我的 csv 文件:

这是我的代码:

这是变量file_readed的打印值:

正如您在图片中看到的,它似乎是逐个字符地拆分我的文件,但有一些例外。 感谢您为我提供的任何帮助。

【问题讨论】:

标签: python django csv


【解决方案1】:

CSV 似乎不正确:有些行的参数比其他行多。

CSV 是逗号分隔值的首字母缩写词,您需要为每一行使用逗号分隔完全相同的参数,否则会搞砸。

我在你的行中看到你可能期望有 3 列,而不是你有 2 或 4 个参数的行,其中一些在一个参数中有一个开头 ",逗号,然后关闭 "在第二个参数中

检查您的脚本是否可以与其他 CSV 一起使用

【讨论】:

  • 我正在手动读取该 csv 并使用函数拆分,问题是那些以 " 开头的列。我搜索并发现 csv 阅读器将正确拆分这些列. 至于空列,我已经使用了具有空列的 csv,并且效果很好。
  • 溢出的怎么办?
【解决方案2】:

您很可能需要指定分隔符。由于您没有明确告知分隔符,我想它很困惑。

csv.reader(csvfile, delimiter=',')

但是,由于引号中包含逗号分隔符,因此您可能需要在 CSV 文件创建时更改默认分隔符以用于制表符或其他内容。

【讨论】:

  • 我已经尝试指定分隔符,但没有成功。
  • 我猜您需要通过将默认分隔符更改为分号或制表符来更改文件创建的分隔符。然后它就可以阅读了。因为您在 CSV 的第 3 行有比 2 更多的逗号。
【解决方案3】:

问题出在这里:

print(list(file_readed)) 

'list' 导致将 csv 中的每个元素作为一个单独的单元打印。

试试这个:

with open('carga_cie10') as f:
reader = csv.reader(f)
for row in reader:
    print(" ".join(row))

编辑:

import pandas as pd
file_readed = pd.read_csv(file_csv)
print(file_readed)

输出应该看起来很干净。 Pandas 在需要读取、操作、更改数据等情况下非常有用。

【讨论】:

  • 问题是我没有物理文件,我是直接从表单中获取的,所以我无法像那样打开文件。
  • 编辑建议改用 Pandas。
【解决方案4】:

如果您从 Web 表单中提取,请尝试将 csv 作为字符串获取,在打印或调试工具中确认结果正确,然后使用 StringIO 将其传递给 csv。

from io import StringIO
import csv

csv_string = form.files['carga_cie10'].file_read().decode(encoding="ISO-88590-1")
csv_file = StringIO(csv_string)
reader = csv.reader(csvfile, delimiter=',', quotechar='"')
for row in reader:
    print(row)

您可以尝试的另一件事是将lineterminator 参数更改为csv.reader()。它可以默认为\r\n,但网络表单可能会使用其他值。检查您从网络表单中获得的字符串以确认。

【讨论】:

  • 我看错了你的问题。您可以尝试从 Web 表单中获取一个字符串,看看这对您来说是否正确?
  • 谢谢你,兄弟,这对我来说非常有效,它可以正确拆分所有内容。你真的拯救了我的一天!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多