【问题标题】:Writing List to a csv file in Python在 Python 中将列表写入 csv 文件
【发布时间】:2016-09-02 08:41:36
【问题描述】:

我目前正在使用 Python v2.10。我无法将数据写入 csv 文件。想知道是否有人可以告诉我我做错了什么。我收到以下错误:"TypeError: list indices must be integers, not tuple" - 不知道如何更正。另外,我想写入一个csv文件,数据必须是字符串格式?

理想情况下,我希望每一行都像: 姓名,X1,Y1,X2,Y2,X3,Y3

这是我的代码:

import csv

def main():
    my_coords = open('Geo_Coords.csv', 'a')
    coords = csv.reader(my_coords)

    how_many = raw_input("How many Geometries do you wish to enter? ")
    counter = 0
    coords = []

    while counter < how_many:
        geometry = raw_input("Geometry Name  ")
        first_coordE = raw_input("1st Co-ord (Easting) ")
        first_coordN = raw_input("1st Co-ord (Northing) ")
        sec_coordE = raw_input("2nd Co-ord (Easting) ")
        sec_coordN = raw_input("2nd Co-ord (Northing) ")
        third_coordE = raw_input("3rd Co-ord (Easting) ")
        third_coordN = raw_input("3rd Co-ord (Northing) ")
        counter = counter + 1

        my_coords.write(coords[[geometry],[first_coordE,first_coordN], [sec_coordE,sec_coordN], [third_coordE,third_coordN]] )

    my_coords.close()
    print my_coords

main()

【问题讨论】:

  • 问题似乎出在coords[[geometry],[first_coordE,first_coordN], [sec_coordE,sec_coordN], [third_coordE,third_coordN]]这行。您正在创建一个元组[geometry],[first_coordE,first_coordN], [sec_coordE,sec_coordN], [third_coordE,third_coordN],然后使用它来索引列表coords。你想用那个元组/列表列表做什么?

标签: python csv python-2.x


【解决方案1】:

您的代码包含一些问题,在它是 csv 对象之前将坐标重新分配为列表,您使用的是 csv.reader 而不是 csv.writer,我鼓励您阅读那里的文档:https://docs.python.org/2/library/csv.html

也许这对你有帮助,我保留你使用的结构,我只是稍微修改了一下。

import csv

def main():
    with open('Geo_Coords.csv', 'a') as my_coords:
        coords = csv.writer(my_coords)

        how_many = int(raw_input("How many Geometries do you wish to enter? "))
        # TODO: Check user input
        rows = []

        for _ in range(how_many):
            geometry = raw_input("Geometry Name  ")
            first_coordE = raw_input("1st Co-ord (Easting) ")
            first_coordN = raw_input("1st Co-ord (Northing) ")
            sec_coordE = raw_input("2nd Co-ord (Easting) ")
            sec_coordN = raw_input("2nd Co-ord (Northing) ")
            third_coordE = raw_input("3rd Co-ord (Easting) ")
            third_coordN = raw_input("3rd Co-ord (Northing) ")

            rows.append([geometry, first_coordE,
                         first_coordN, sec_coordE,
                         sec_coordN, third_coordE,
                         third_coordN])

        coords.writerows(rows)


if __name__ == "__main__":
    main()

【讨论】:

    【解决方案2】:
    import csv
    
    def main():
        my_coords = open('Geo_Coords.csv', 'a')
        coords = csv.reader(my_coords)
    

    好的,coordscsv.reader() 对象的名称

        how_many = raw_input("How many Geometries do you wish to enter? ")
    

    how many 是一个字符串的名称,比如"15"

        counter = 0
        coords = []
    

    在这里你做了一件奇怪的事情,coords 现在是一个空列表的名称,csv.reader() 没有更多的名称来引用它...

        while counter < how_many:
    

    上面的陈述也很奇怪......你正在将一个 int 与一个字符串进行比较!在 Python 2 中,逻辑表达式 string &lt; integer 始终为 True!

            geometry = raw_input("Geometry Name  ")
            first_coordE = raw_input("1st Co-ord (Easting) ")
            first_coordN = raw_input("1st Co-ord (Northing) ")
            sec_coordE = raw_input("2nd Co-ord (Easting) ")
            sec_coordN = raw_input("2nd Co-ord (Northing) ")
            third_coordE = raw_input("3rd Co-ord (Easting) ")
            third_coordN = raw_input("3rd Co-ord (Northing) ")
            counter = counter + 1
    

    到目前为止,一切都很好 — 但请注意,您尚未修改 coords 的值,因此当您使用名称 coords 时,您只是引用了一个空列表

            my_coords.write(coords[[geometry],[first_coordE,first_coordN], [sec_coordE,sec_coordN], [third_coordE,third_coordN]] )
    

    你在这里,通过寻址来引用一个空列表的内容;此外,寻址的语法是错误的,它必须是整数或 slice 对象 - 此外,.write(...) 方法需要一个字符串,而您正在尝试编写一个列表一次字符串...

        my_coords.close()
        print my_coords
    

    这将打印类似的东西

    <closed file 'Geo_Coords.csv', mode 'a' at 0x7efc8946a540>
    

    KoffeeThe answer Koffee 对我来说似乎完全足够了,所以我建议你接受它并可能投票。

    【讨论】:

    • 良好而完整的解释@gboffi (y)
    • @Sнаđошƒаӽ 回滚您的编辑,因为进一步缩进不是错误,它完全反映了 OP 代码的正确缩进。
    • 对不起!我现在看到您已经逐部分解释了代码,因此您的缩进使它变得更好。抱歉,我之前没有注意到这一点。感谢您通知我!
    猜你喜欢
    • 2016-03-26
    • 2012-12-11
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    相关资源
    最近更新 更多