首页 > 解决方案 > 将多个列表中的多行写入 CSV

问题描述

我正在尝试从 csv 中提取数据,对其进行一些格式化,然后将其写回相同的 csv 或新的 csv(无偏好)。原始 csv 中有大约 1500 行,我无法以相同的方式将其写回。

我的代码是

OBJECTID = []
KKOD = []
KATEGORI = []
SHAPE_Length = []

with open(tempcsv, 'r') as f:
    reader = csv.DictReader(f)
    for row in reader:
        OBJECTID.append(row.get('OBJECTID'))
        KKOD.append(row.get('KKOD'))
        KATEGORI.append(row.get('KATEGORI'))
        SHAPE_Length.append(row.get('SHAPE_Length'))

#Puts data in lower case
KATEGORI = [kategori.lower() for kategori in KATEGORI]
#finds all non standard characters
catstrip = ([s.strip('¤') for s in KATEGORI]) 
#delets all non standard characters
categories = ([s.replace('¤', '') for s in KATEGORI])
print(categories)

with open('mycsv.csv', 'w', newline='') as k:
    fieldnames = ['OBJECTID', 'KKOD','KATEGORI','SHAPE_Length']
    writer = csv.DictWriter(k, fieldnames=fieldnames)
    writer.writeheader()
    for i in tempcsv(OBJECTID):
        writer.writerow({"OBJECTID" : OBJECTID, "KKOD" : KKOD, "KATEGORI" : categories, "SHAPE_Length" : SHAPE_Length})

对象 ID 是我想在迭代器中使用的行数,但它返回 TypeError 的错误:'str' object is not callable。

如果我把迭代器拿走,它会将所有输出写入一行。

标签: python-3.xcsv

解决方案


根据我对给定代码的理解,您可能希望最后一部分是这样的:

with open('mycsv.csv', 'w', newline='') as k:
    fieldnames = ['OBJECTID', 'KKOD','KATEGORI','SHAPE_Length']
    writer = csv.DictWriter(k, fieldnames=fieldnames)
    writer.writeheader()
    for i in range(len(OBJECTID)): # <- starting this line
        writer.writerow({"OBJECTID" : OBJECTID[i], "KKOD" : KKOD[i], "KATEGORI" : categories[i], "SHAPE_Length" : SHAPE_Length[i]})

更多解释

从这句话中注意到:“如果我把迭代器拿走,它会将所有输出写入一行。”,那是因为你这样做writer.writerow({"OBJECTID" : OBJECTID, "KKOD" : KKOD, "KATEGORI" : categories, "SHAPE_Length" : SHAPE_Length})了,回想一下你将上面的每个值定义[]为一个列表,所以你基本上将所有项目写入 1 行.

您可能想查看官方文档以获取更多信息和示例:) https://docs.python.org/3/library/csv.html#writer-objects


推荐阅读