首页 > 解决方案 > 未能分隔 csv 文件

问题描述

我有一个不定界的 csv 文件。csv 文件的屏幕截图。 这意味着所有数据都保留在 row[0] 中,并且不会分成 6 列。有谁知道如何解决这个问题?

import csv

n=1048576

id=[]*n
a=[]*n
date=[]*n
b=[]*n
c=[]*n

with open('C:\\Users\\andsc\\data_1.csv') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    line_count = 0
    for row in csv_reader:
        id[line_count] = row[0]
        a[line_count] = row[1]
        date[line_count] = row[2]
        b[line_count] = row[3]
        c[line_count] = row[4]
        
        line_count += 1

标签: pythoncsv

解决方案


首先,不要这样做:

id=[]*n
a=[]*n
...etc...

您要做的是模拟一个固定长度的数组。那是行不通的。如果您在命令提示符下执行此操作,您将看到:

>>> [] * 9
[]

这是因为* 真的是一个 multiply,就像[1] * 3[1, 1, 1](列表的三个重复[1])doing[] * 9给出了空列表的 9 个重复,它和一个重复一样是空的。

而是创建空列表:

id=[]
a=[]
...etc...

然后,在您的循环中,不要索引到这些列表中,append()而是为它们添加新值:

id.append(row[0])
a.append(row[1])
...etc...

这意味着您不需要跟踪line_count,即使您确实需要这样做,也可以使用提供的方法csv_reader.line_num()

使用 Excel 屏幕截图查看 CSV 通常会产生误导。很明显,您的 Excel 版本要求 CSV 的分隔符是分号而不是逗号,这就是为什么数据都在一个列中的原因。要 100% 确定文件中的内容,请在 Notepad 或 Notepad++ 等文本编辑器中打开它。这避免了 Excel 的激进类型强制转换,它将任何看起来像日期或十六进制字符串的内容更改为数字。最重要的是不要将 CSV 从 Excel 中保存回来,并假设文件仍然符合预期。

很明显,您提供的代码不会运行。它将IndexError第一次通过循环。您必须在代码运行之前对其进行修复,当您这样做时,您会发现 Python 确实尊重逗号作为分隔符。

但是在 Excel 中打开输入文件会让您错误地了解问题出在哪里。您说得很对,逗号显然是文件中的预期分隔符。但是当您在 Excel 中打开 CSV 时,Excel 会使用您的系统小数点和分隔符设置,对于欧洲安装的 Windows 和 MacOS,通常是和.,;

Excel 不够聪明,无法自行判断这些设置不适合给定文件;它需要你的帮助。您可以通过更改系统设置来更改 Excel 的File | Open行为,但如果将分隔符更改为,,则必须将小数点更改为.(对于每个应用程序,而不仅仅是 Excel),您不太可能想要这样做。

解决方法是通过导入CSV 而不是简单地打开它来为特定文件手动设置它。在“数据”选项卡上选择“来自文本/CSV”,然后 Excel 将尝试从前 2000 行中猜测设置。如果它猜错了,你有机会修复它。

但是让Excel 以您期望的方式显示文件与Python 读取它的方式无关。


推荐阅读