【问题标题】:Python: Read csv file of which one column contains multiple commasPython:读取其中一列包含多个逗号的csv文件
【发布时间】:2020-02-21 17:37:20
【问题描述】:

我有 utf-8 编码的逗号分隔的 csv 文件,其中一列包含多个逗号,但是我需要将它们作为一列导入以进行进一步操作。 数据框看起来像

C1 C2 C3 C4 C5 C6      C7.... C27
1, 2, 3, 4, 5, A,B,C,   2 .......
3, 5, 3, 4, 6, A,B,C,D, 8 .......
1, 2, 2, 5, 8, A,B,     7 .......
3, 5, 3, 4, 6, ABCDE,   8 .......
1, 2, 3, 4, 5, A,B,C,D  2 .......

所以第6列包含一些汉字以及不同数量的逗号。第 5 列和第 7 列都是数字。数据框共有 27 列。 我希望将第 6 列中的字符视为一个单元格中的值,而不是多个变量的值。

我知道你可以先使用引号,但我想知道你会怎么做。我有 1000 多个这样的文件需要打开。

任何建议将不胜感激!

后续问题: 如果不同文件的列数不同怎么办?是否可以用正则表达式定义列的模式,先得到列数,再决定如何拆分列?

我现在正在考虑先获取每个文件的列并将它们保存到 csv 文件中,然后在可能的重复问题中使用该方法。但任何关于更有效方式的建议都将不胜感激!

【问题讨论】:

  • 你不能把分隔符改成分号或制表符吗?
  • 您是否可以控制这些 .CSV 文件的创建,或者它们是否来自封闭源?如果原始源程序遵循定义 .CSV 文件的 RFC 4180,它们会将 C6 括在引号中,如下所示:1,2,3,4,5,"A,B,C",2,.... 或正如 @chatax 在我输入此内容时所说,将字段分隔符更改为类似这样的其他内容:1;2;3;4;5;A,B,C;2.....
  • @chatax 嘿,不,我不能。它是从数据库下载的。所以不可能专门为那些没有逗号的列更改分隔符。
  • @Matthew 感谢 cmets。我不确定它们是如何创建的,但我会先尝试,然后再告诉你它是如何进行的......

标签: python csv


【解决方案1】:

既然您知道所需的行数是多少,那么您要做的就是使用 set() 获取行的后面和前面之间的差异。您可以更改其他文件的 num_cols。

import csv

filename = 'mycsv.csv'
num_cols = 26 # "The data frame has 27 columns in total"

with open(filename, newline='') as f:
    reader = csv.reader(f)
    for row in reader:
        try:
            assert len(row) >= num_cols, f'The csv file does not contain at least {num_cols} columns.'
            after_sixth = row[-21:] # everything after the '6th' column
            before_sixth = row[:5]
            everything_else = after_six + before_sixth
            sixth_row = set(row)- set(everything_else)
            new_row = before_sixth + sixth_row + everything_else
            print(new_row)
        except AssertionError as e:
            print(e)

【讨论】:

  • 您好,感谢您的回答。这只会提取第 5 列之后的所有信息并将它们保存为第 6 列。然后类似的问题仍然存在,我需要将真正的第 6 列从这个新的第 6 列中拆分出来。
  • 没有看到“数据框共有27列”。我更新了解决方案。
  • 嘿,我设法得到了我想要的输出。我的方法和你的有点不同。我首先使用一个循环来确定每个文件有问题的列之前和之后的列数,然后将每个 csv 文件分成三部分。由于您是唯一回答问题的人,因此我将您的设置为已接受的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多