我正在尝试在csv文件中写入我的代码的结果,但不知何故它写得不正确。
我的代码是:
const
所以我想得到这样的结果: certainty1 | SENTENCE1 | ccue1 certainty2 | SENTENCE2 | ccue2 ... 所以分隔符是|。
但我当前的代码将所有内容写入1行,这些分隔符无处不在:
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))
为什么会发生这种情况,我该如何解决?谢谢!
答案 0 :(得分:3)
当你这样做时:
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个单元格。< / p>
请注意,您不必重新指定分隔符,它已在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))
编辑:我遗漏了你的另一个问题,一线问题。对于那个,下面的上下文处理程序+ csv writer创建:
with open('new_file.csv', 'w', newline='') as csvfile:
writer = csv.writer(csvfile, delimiter='|',
quotechar='^', quoting=csv.QUOTE_MINIMAL)
应该放在外面 for
循环中,否则你只会看到最后一行(保持原样并且使用追加模式也是可能的,但更少高性能)
答案 1 :(得分:0)
writer.writerow
需要list
而不是字符串。