如何使用csv模块给“delimiter”设置两个字符的分隔符?

5

我试图使用分隔符'@|@'生成csv文件,但是我无法通过以下代码实现。

import csv
ifile  = open('test.csv', "rb")
reader = csv.reader(ifile)
ofile  = open('ttest.csv', "wb")
writer = csv.writer(ofile, delimiter='|', quotechar='"', quoting=csv.QUOTE_ALL)
for row in reader:
    writer.writerow(row)
ifile.close()
ofile.close()

在运行时,它抛出了以下错误。
Traceback (most recent call last):

File "csvfile.py", line 6, in <module>
writer = csv.writer(ofile, delimiter='@|@', quotechar='"', quoting=csv.QUOTE_ALL)
TypeError: "delimiter" must be an 1-character string

我该怎么做才能实现这个目标?

1
将 replace('@|@', '|') 替换为不包含在您的字符串中的其他内容。 - YOU
1
“'@|@'” 看起来像是一个由三个字符组成的分隔符...而回溯中的代码与您片段中的代码不匹配。 - martineau
2个回答

2
在CSV 文档中,他们说:

用于分隔字段的一个字符字符串。默认为“,”。

因此,您可以使用这种方法作为替代方案。
csv.reader((line.replace('@|@', '|') for line in ifile), delimiter='|')

所以完整的代码是:
import csv
ifile  = open('test.csv', "rb")
reader = csv.reader((line.replace('@|@', '|') for line in ifile), delimiter='|')
ofile  = open('ttest.csv', "wb")
writer = csv.writer(ofile, delimiter='|', quotechar='"', quoting=csv.QUOTE_ALL)
for row in reader:
    writer.writerow(row)
ifile.close()
ofile.close()

1
csv.writer 构造函数中的 csvfile 参数只需要是“类似文件的对象”。这意味着您可以提供自己的类实例,将单个字符更改为具有两个或多个字符的字符(但在其他方面像打开输出文件对象一样)。
以下是我的意思:
import csv

class CSV_Translater(object):
    """ Output file-like object that translates characters. """
    def __init__(self, f, old, new):
        self.f = f
        self.old = old
        self.new = new
    def write(self, s):
        self.f.write(s.replace(self.old, self.new))
    def close(self):
        self.f.close()
    def flush(self):
        self.f.flush()

with open('in_test.csv', "rb") as ifile:
    reader = csv.reader(ifile)
    with open('out_test.csv', "wb") as ofile:
        translater = CSV_Translater(ofile, '|', '@|@')
        writer = csv.writer(translater, delimiter='|', quotechar='"',
                            quoting=csv.QUOTE_ALL)
        for row in reader:
            writer.writerow(row)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接