python - numpy.loadtxt : how to ignore comma delimiters that appear inside quotes?

标签 python csv numpy

我有一个 csv 文件,其中一行数据可能如下所示:

10,"苹果、香蕉",20,...

当我在 Python 中加载数据时,引号内的额外逗号会移动我所有的列索引,因此我的数据不再是一致的结构。虽然我可能会编写一个复杂的算法来遍历每一行并解决问题,但我希望有一种优雅的方法可以将一个额外的参数传递给 loadtxt(或其他一些函数),它将正确地忽略引号内的逗号并处理整个报价作为一个值。

请注意,当我将 CSV 文件加载到 Excel 中时,Excel 正确地将字符串识别为一个值。

最佳答案

使用单个 numpy 函数调用的一种方法是使用 np.fromregex ,它允许您使用 Python 的 regular expression syntax以任意方式解析文本文件的内容。例如:

np.fromregex('tmp.csv', r'(\d+),"(.+)",(\d+)', np.object)

给你:

array([['10', 'Apple, Banana', '20'],
       ['30', 'Orange, Watermelon', '40']], dtype=object)

为了稍微解压缩正则表达式,'(\d+)' 将匹配一个或多个数字,而 '"(.+)"' 将匹配一个或更多双引号内的任何字符。 np.fromregex 尝试在您的 .csv 文件的每一行中匹配此表达式,括号内的部分被视为每行中的单个元素输出数组。

如果您想要一个记录数组作为您的输出,在您的 .csv 文件中的三个“列”具有不同的“字段”,您可以指定单独的 dtypes对于正则表达式中的每组括号:

np.fromregex('tmp.csv', r'(\d+),"(.+)",(\d+)', 'i8, S20, i8')

给你:

array([(10, 'Apple, Banana', 20), (30, 'Orange, Watermelon', 40)], 
      dtype=[('f0', '<i8'), ('f1', 'S20'), ('f2', '<i8')])

关于python - numpy.loadtxt : how to ignore comma delimiters that appear inside quotes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28444272/

相关文章:

php - 添加 mysql 列以在 csv php 中输出?

python - 打印来自 2 个不同列表的数据及其索引

python - 如何将异构数据 (np.genfromtxt) 作为二维数组加载?

python - 如何将带有索引的选定列转换为 Pandas 中的元组列表

python - 如何在 Python 中获取视频文件的方向

python - 我可以将 libVLC 的 Python 绑定(bind)与 Python 3.x 一起使用吗?

python - 了解显式添加 () 以获得评估的必要性

c++ - CLion 不支持 CSV 文件?

python - numpy 数组中后续对的元素之间的差异(不是 numpy.diff)

python - 在 Numpy 数组的列上应用条件/过滤器