【问题标题】:Writing to csv in python — delimiters在 python 中写入 csv — 分隔符
【发布时间】:2017-05-15 19:21:39
【问题描述】:

我正在尝试在 csv 文件中写入我的代码结果,但不知何故它写入不正确。

我的代码是:

import xml.etree.ElementTree as ET
import csv

with open('myfile.xml', 'rt') as f:
tree = ET.parse(f)

for sentence in tree.iter('sentence'):
    certainty = sentence.attrib.get('certainty')
    ccue = sentence.find('ccue')
    with open('new_file.csv', 'w', newline='') as csvfile:
       writer = csv.writer(csvfile, delimiter='|',
                            quotechar='^', quoting=csv.QUOTE_MINIMAL)
       if certainty and (ccue is not None):
           writer.writerow('  %s | %s | %s' % (certainty, ''.join(sentence.itertext()), ccue.text))
       else:
           writer.writerow('  %s | | %s' % (certainty,sentence.text))

所以我想得到这样的结果: 确定性1|句子1|cue1 确定性2|句子2|cue2 ... 所以分隔符是|。

但我当前的代码将所有内容都写在 1 行中,并且这些分隔符无处不在:

| |c|e|r|t|a|i|n|

为什么会发生,我该如何解决?谢谢!

【问题讨论】:

  • 请修正你的缩进
  • writerow 接受一个可迭代的。阅读文档
  • 另外一个问题:为什么要(重新)打开 CSV 文件并(重新)在循环中创建编写器?这些应该在循环外初始化。
  • @njzk2:严格来说,一个字符串一个可迭代的。在这种情况下,它只会给出(咳咳)意想不到的结果。
  • @ZverArt:我怀疑你的缩进是错误的,所以with 被终止(并且文件关闭)你进入循环之前。整个for 循环需要with 的上下文中。

标签: python csv text


【解决方案1】:

当你这样做时:

if certainty and (ccue is not None):
  writer.writerow('  %s | %s | %s' % (certainty, ''.join(sentence.itertext()), ccue.text))
else:
  writer.writerow('  %s | | %s' % (certainty,sentence.text))

您将 str 传递给 writerow,它需要一个 iterable,因此它会在您的字符串上进行迭代,并且每个字符都有 1 个单元格。

请注意,您不必重新指定分隔符,它已在 csv.writer 中设置。您只需将元素作为 listtuple 传递,例如:

if certainty and ccue: # let's simplify your test (ccue is an object or None)
    writer.writerow((certainty,''.join(sentence.itertext()),ccue.text))
else:
    writer.writerow((certainty,'',sentence.text))

编辑:我忽略了您的另一个问题,即 1 行问题。对于那个,上下文处理程序 + csv writer 创建如下:

with open('new_file.csv', 'w', newline='') as csvfile:
   writer = csv.writer(csvfile, delimiter='|',
                        quotechar='^', quoting=csv.QUOTE_MINIMAL)

应该放在外部 for 循环否则你只会看到最后一行(保持原样并使用附加模式也是可能的,但性能较差)

【讨论】:

  • 是的,现在写得很好。但是文件在每次迭代后都被关闭,所以文件不完整:(
  • 谢谢!你帮了我很多!
【解决方案2】:

writer.writerow 接受 list 而不是字符串。

【讨论】:

  • 它实际上需要一个可迭代的(元组、列表、生成器理解......)
  • 这正是问题所在:字符串 is 是可迭代的,因此对其进行迭代会得到每个字符。
猜你喜欢
  • 2016-10-03
  • 2015-12-06
  • 2012-08-27
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多