我正在尝试在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
而不是字符串。