头在CSV文件中每隔一行打印一次



我一直在解决这个问题太久了,请向我解释为什么标题在我的输出csv中不断重复。

我有一个输入csv的数据:

  1. 的名字,房子
  2. "雅培,Hannah"赫奇帕奇
  3. "贝尔,Katie"格兰芬多
  4. "骨头,Susan",赫奇帕奇
  5. "启动,Terry",拉文克劳

这个问题需要反转姓氏和名字,将名字分成两列,并为输出csv创建一个包含3列的新标题。我有:

while True:
try:
# open file
with open(sys.argv[1]) as file:
# make reader
reader = csv.reader(file)
# skip first line (header row)
next(reader)
# for each row
for row in reader:
# identify name
name = row[0]
# split at ,
name = name.split(", ")
# create var last and first, identify var house
last = name[0]
first = name[1]
house = row[1]

# writing the new csv
with open(sys.argv[2], "a") as after:
writer = csv.DictWriter(after, fieldnames=["first", "last", "house"])
# HEADER ONLY NEEDS TO OCCUR ONCE
writer.writeheader()
writer.writerow({"first": first, "last": last, "house": house})
sys.exit(0)

my output csv:

  1. 首先,最后,房子
  2. 汉娜,雅培,赫奇帕奇
  3. 首先,最后,房子
  4. 凯蒂·贝尔,格兰芬多
  5. 首先,最后,房子
  6. 苏珊,骨头,赫奇帕奇

我试过删除while循环,取消缩进和缩进,用头名手动写一行(这会导致错误)。请帮助。谢谢!

您可以添加一个变量来保存标题是否被打印,例如write_header

while True:
try:
write_header = True
# open file
with open(sys.argv[1]) as file:
# make reader
reader = csv.reader(file)
# skip first line (header row)
next(reader)
# for each row
for row in reader:
# identify name
name = row[0]
# split at ,
name = name.split(", ")
# create var last and first, identify var house
last = name[0]
first = name[1]
house = row[1]

# writing the new csv
with open(sys.argv[2], "a") as after:
writer = csv.DictWriter(after, fieldnames=["first", "last", "house"])
# HEADER ONLY NEEDS TO OCCUR ONCE
if write_header:
writer.writeheader()
write_header = False
writer.writerow({"first": first, "last": last, "house": house})
sys.exit(0)

看我如何使用write_header

在另一个注意事项上,您可以重构您的代码,在for循环之前打开csv写入器,在那里写入头,然后像现在一样写入值,而无需每次想要写入一行时重新打开文件

最新更新