python - 未能分隔 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
解决方案
首先,不要这样做:
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 读取它的方式无关。
推荐阅读
- google-cloud-platform - 在同一项目中使用来自两个不同 VPC 的 CloudSQL 私有 IP 访问
- spring-boot - 服务层与控制器层解耦的设计模式最佳实践 Spring boot
- python - 从 url 响应中读取带有 pandas 的 Excel 文件
- api - .net 核心将 null 转换为空字符串以响应 ConfigureServices
- javascript - 如何在 Adobe Acrobat PDF 中突出显示/复制多个文本元素
- python - 逻辑回归模型(二进制)交叉表错误 = 传递值的形状问题
- python - AttributeError:“函数”对象在尝试从函数访问变量时没有属性错误
- apache-kafka - Flink 和非键控窗口状态
- java - 在映射超类中处理 Hibernate 持久性
- javascript - Eclipse IDE v2020-12 (4.18.0) 坚持我的 javascript 文件之一是 HTML 文件,并将每次使用 && 标记为无效字符