【问题标题】:Commas and double-quotes in CSV filesCSV 文件中的逗号和双引号
【发布时间】:2017-09-28 18:56:09
【问题描述】:

我有一个带有逗号和双引号的 csv 文件。然而,双引号仅在字符串中有逗号时使用。像这样:

AAA, BBB, "ACB,BCA", 123, "1,987"
DDC, CHA, ACH;HDC, "2,34", 192

我不想解析双引号中的逗号并希望得到以下输出:

x1    x2    x3       x4    x5
AAA   BBB   ACB,BCA  123   1,987
DDC   CHA   ACH;HDC  2,34  192 

简而言之,忽略带双引号的值的逗号,考虑不带双引号的值的逗号。

我正在使用它来将多个 CSV 文件合并为一个 CSV 文件,同时添加一些引用文件名的列:

with open(outfile, "wb") as outfile:
    writer = None
    for input_filename in filenames:
        with open(input_filename, "rb") as infile:
            reader = csv.DictReader(infile, quotechar='"', delimiter=',')
            if writer is None:
                field_names = ["index1"] + ["index2"] + reader.fieldnames
                writer = csv.DictWriter(outfile, field_names)
                writer.writeheader()
            for row in reader:
                row["index1"] = input_filename[1:10]
                row["index2"] = input_filename[10:20]
                writer.writerow(row)

我阅读 CSV 的具体解决方案是:

csv.DictReader(infile, quotechar='"', delimiter=',')

但这显然行不通。

有什么建议吗?

编辑:下面是一个更好的例子:

我尝试打开的 csv 文件结构如下:

x 1,x 2,x 3,x 4,x5 AAA, “BB,B”, CCC, DDD, EEE AA1, B;B2, CC3, DD4, EE5

到目前为止,我尝试过的解析器 csv.DictReader、pd.read_csv 或 csv.reader 似乎可以读取“;”在 B;B2 作为行断路器,它弄乱了所有以下列。

以下代码解决了“BB,B”问题,但仍然将 B;B2 分解为新行

csv.reader(fileObject, quotechar='"', delimiter=',',
             quoting=csv.QUOTE_ALL, skipinitialspace=True)

【问题讨论】:

  • “这显然行不通” - 不是吗?相反,它做了什么? DictReader 需要标头,您是否尝试过提供这些标头?否则,您只会从该输入中获得一行 {'AAA': 'DDC', ' "ACB': ' ACH;HDC', '987"': None, ' BBB': ' CHA', 'BCA"': ' "2', ' 123': '34"', ' "1': ' 192'}
  • 我认为 fieldname 对读者来说是可选的,但在我写它时,大部分情况都放在了正确的列中。除了 x3 列中的那些。它将 ""ACB,BCA" 放入 x3,但在看到 ACH;HDC 时会跳到行。
  • 如果第一行是标题,则可选;你没有在你的例子中表明这一点。你能editminimal reproducible example吗?例如,仅打印读取的行可能就足够了,而无需显示输出写入器的详细信息。

标签: python csv


【解决方案1】:

下面的代码 sn-p 仍然对我有用,并且没有在“;”上中断符号

csv.DictReader(fileObject, quotechar='"', delimiter=',',
                 quoting=csv.QUOTE_ALL, skipinitialspace=True)

对我有用。

这是我收到的输出:

{'x1': 'AAA', 'x2': 'BBB', 'x4': '123', 'x5': '1,987', 'x3': 'ACB,BCA'}
{'x1': 'DDC', 'x2': 'CHA', 'x4': '2,34', 'x5': '192', 'x3': 'ACH;HDC'}

【讨论】:

  • csv.DictReader 也可以使用相同的参数。我确实对其进行了测试,并在此过程中了解了 .DictReader() 函数的实用性。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
  • 2018-07-27
  • 2022-08-06
  • 1970-01-01
  • 2012-05-14
相关资源
最近更新 更多