在python中写入csv - 分隔符



我正在尝试在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|CCUE1 确定性2|句子2|CCUE2 ...所以分隔符是 |。

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

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

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

当你这样做时:

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 ,这需要一个可迭代对象,因此它会迭代您的字符串,并且每个字符获得 1 个单元格。

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

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 编写器创建如下:

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

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

writer.writerow采用list而不是字符串。

最新更新