【问题标题】:Insert whitespace after delimiter with CSV writer使用 CSV 编写器在分隔符后插入空格
【发布时间】:2012-03-19 14:11:07
【问题描述】:
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 参数。但是,我无法让作者在分隔符之后打印空格字符,因此会干扰这两个文件的任何后续 diffing。

我尝试使用Sniffer 类来自动生成Dialect,但我猜我的输入文件(来自一个大型复杂的遗留系统,有几十个字段以及糟糕的引用和转义)被证明也是这很复杂。

简而言之,我正在寻找以下问题的答案:

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

【问题讨论】:

    标签: python csv


    【解决方案1】:

    您可以将 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'
    

    【讨论】:

    • 我喜欢它,非常聪明!谢谢^^
    【解决方案2】:

    如果您留下了要写入的空白(在处理过程中删除/恢复它),或者在处理之后但在写入之前将其放回,这会解决它。

    【讨论】:

    • 谢谢,您的第二个建议正是我所想的。我只是担心这会添加额外的代码行,并想知道 pythonic 这到底是怎么回事。我不想发现模块的一个简单选项可以为我省去麻烦。
    • @rahmu 来自 Python 之禅:“特殊情况不足以打破规则。虽然实用胜过纯粹。”
    【解决方案3】:

    一种解决方案是写入StringIO 对象,然后用'; ' 替换分号,或者在处理行期间这样做,如果您进行任何其他处理。

    【讨论】:

      【解决方案4】:

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

      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
      

      至于第二个,我不知道。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-04
        • 2016-10-03
        • 1970-01-01
        相关资源
        最近更新 更多