【发布时间】: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 时会跳到行。
-
如果第一行是标题,则可选;你没有在你的例子中表明这一点。你能edit给minimal reproducible example吗?例如,仅打印读取的行可能就足够了,而无需显示输出写入器的详细信息。