如何在"分隔符"中给出2个字符使用' csv'模块?

时间:2016-08-04 03:45:50

标签: python csv

我试图用分隔符生成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

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:1)

在csv documentation中他们说

  

用于分隔字段的单字符字符串。它默认为','。

所以你可以这样做。

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 :(得分:1)

生命太短暂,只需使用pandas

import pandas as pd
df.to_csv('output.csv', sep='|')

默认情况下,定界符为',',这就是它被称为Commasv的原因。但是,通过将sep更改为'|',您可以轻松实现您想要的效果。

答案 2 :(得分:0)

csv.writer构造函数的 csvfile 参数只需要是一个&#34;类似文件的对象&#34;。这意味着您可以提供自己的类的实例,该实例将单个字符更改为具有两个或更多字符的字符(但其他方式则类似于打开的输出文件对象)。

这就是我的意思:

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)