使用CSV编写器在分隔符后插入空格

时间:2012-03-19 14:11:08

标签: python csv

f = open("file1.csv", "r")
g = open("file2.csv", "w")

a = csv.reader(f, delimiter=";", skipinitialspace=True)
b = csv.writer(g, delimiter=";")

for line in a:
    b.writerow(line)

在上面的代码中,我尝试使用Python2.7中的csv模块加载file1.csv,然后使用csv.writer将其写入file2.csv。

我的问题来自输入文件中分隔符后面的现有空格(单个空格字符)。我需要删除它们以便稍后进行一些数据操作,所以我使用了skipinitialspace=True参数给读者。但是,我无法让编写器在分隔符后打印空格字符,因此会干扰两个文件的后续diff

我尝试使用Sniffer类自动生成Dialect,但我想我的输入文件(来自大型复杂的遗留系统,包含数十个字段,引用和转义不佳)事实证明这太复杂了。

用更简单的术语来说,我正在寻找以下问题的答案:

  • 如何在writer
  • 中的每个分隔符后插入空格字符
  • 很明显,禁止使用多字符字符串作为分隔符的原因是什么? delimiter="; "会解决我的问题。

4 个答案:

答案 0 :(得分:2)

您可以将file个对象包装在添加空格的代理中:

>>> class DelimitedFile(file):
...     def write(self, value):
...             super(DelimitedFile, self).write(value.replace(";", "; "))
... 
>>> f = DelimitedFile("foo", "w")
>>> f.write("hello;world")
>>> f.close()
>>> open("foo").read()
'hello; world'

答案 1 :(得分:1)

如果你留下你想写的空格(在处理过程中删除/恢复它),或者在处理之后但在写之前把它放回去,那就可以解决它。

答案 2 :(得分:0)

一种解决方案是写入StringIO对象,然后用'; '替换分号,或者在处理行时执行此操作,如果您执行任何其他处理。

答案 3 :(得分:0)

至于第一个,我可能会做这样的事情:

for k, line in enumerate(a):
    if k == 0:
        b.writerow(line)
    else:
        b.writerow(' ' + line) #assuming line is always a string, if not just use str() on it

至于第二个,我不知道。

相关问题