Python3.9-通过.csv交互时出现列表索引超出范围错误,可通过添加打印语句来解决。可能的错误?

Python3.9-通过.csv交互时出现列表索引超出范围错误,可通过添加打印语句来解决。可能的错误?,python,csv,Python,Csv,使用python 3.9.3的标准csv库 对于上下文,我正在编写一个快速脚本,用于将.csv文件导入sqlite3数据库。 我在virtualenv中运行,从根python运行也有同样的效果 # Generate sqlite3 database from .csv import sqlite3 import csv data = [] with open('data.csv', newline='') as csvfile: # read .csv file reader = cs

使用python 3.9.3的标准csv库 对于上下文,我正在编写一个快速脚本,用于将.csv文件导入sqlite3数据库。 我在virtualenv中运行,从根python运行也有同样的效果

# Generate sqlite3 database from .csv
import sqlite3
import csv

data = []
with open('data.csv', newline='') as csvfile: # read .csv file
    reader = csv.reader(csvfile, delimiter=',') # read the data into nested lists
    iterreader = iter(reader)
    next(iterreader) # skip one line (heading line in .csv)
    for row in iterreader: # iterate through nested array, each row is a list obj
        # everything is str() must convert certain values in the list as below.
        row[0] = int(row[0]) 
        row[6] = int(row[6])
        row[7] = float(row[7])
        row[8] = float(row[8])
        row[10] = int(row[10])
        data.append(row) # append the updated row to the initialized list
print(data)
产出:

    $ python databasegen.py
    $ row[0] = int(row[0]) Index Error: list index out of range
    $ python databasegen.py
    $ ['1', '2', '3', '4' ...]... and so forth
    $ python databasegen.py
    $ [1, '2', '3', '4' ...]... and so forth
有趣的是,通过在循环中的任意位置添加行的print语句。 它起作用了

# Generate sqlite3 database from .csv
import sqlite3
import csv

data = []
with open('data.csv', newline='') as csvfile: # read .csv file
    reader = csv.reader(csvfile, delimiter=',') # read the data into nested lists
    iterreader = iter(reader)
    next(iterreader) # skip one line (heading line in .csv)
    for row in iterreader: # iterate through nested array, each row is a list obj
        # everything is str() must convert certain values in the list as below.
        print(row) # just prints the row prior to conversion
        row[0] = int(row[0]) 
        row[6] = int(row[6])
        row[7] = float(row[7])
        row[8] = float(row[8])
        row[10] = int(row[10])
        data.append(row) # append the updated row to the initialized list
print(data)
产出:

    $ python databasegen.py
    $ row[0] = int(row[0]) Index Error: list index out of range
    $ python databasegen.py
    $ ['1', '2', '3', '4' ...]... and so forth
    $ python databasegen.py
    $ [1, '2', '3', '4' ...]... and so forth
更改类型后添加打印语句仍然有效

# Generate sqlite3 database from .csv
import sqlite3
import csv

data = []
with open('data.csv', newline='') as csvfile: # read .csv file
    reader = csv.reader(csvfile, delimiter=',') # read the data into nested lists
    iterreader = iter(reader)
    next(iterreader) # skip one line (heading line in .csv)
    for row in iterreader: # iterate through nested array, each row is a list obj
        # everything is str() must convert certain values in the list as below.
        row[0] = int(row[0]) 
        row[6] = int(row[6])
        row[7] = float(row[7])
        row[8] = float(row[8])
        row[10] = int(row[10])
        print(row) # prints the row post conversion
        data.append(row) # append the updated row to the initialized list
print(data)
产出:

    $ python databasegen.py
    $ row[0] = int(row[0]) Index Error: list index out of range
    $ python databasegen.py
    $ ['1', '2', '3', '4' ...]... and so forth
    $ python databasegen.py
    $ [1, '2', '3', '4' ...]... and so forth
我不确定这是否是我的代码中的一个错误,但是我倾向于python中的一个bug。 如果需要的话,我可以使用熊猫,但是我发现它很有趣,而且行为出人意料。 如果此格式不正确,很抱歉,我以前没有使用过stackoverflow,也不需要使用。
谢谢您的时间。

在.csv数据的末尾有一个新行。删除新行解决了这个问题。
这可能是由于
open()
方法造成的。我相信这是使用
newline=''
的结果,这意味着当调用
csv.reader()
方法时,它会将所有行打包到列表中。包括新线。因此在数组的最末端有一个空列表。这意味着,当它使用
list()[0]
调用第一个对象时,由于列表为空,它会返回一个错误。

如果这是Python甚至csv模块中的一个错误,那将令人惊讶。由于您没有提供再现错误的数据,因此除了猜测之外,任何人都无能为力。我无法再现问题。我制作了一个测试CSV文件,并在Python3.9.3 Docker容器中进行了尝试,您的代码运行正常。你能用你正在使用的CSV数据创建一个新的应用程序吗?请验证MRE在没有任何修改或其他环境调整的情况下准确再现问题。顺便说一句,
iterreader=iter(reader)
没有意义,
reader
已经是迭代器,
iter(reader)
只返回
阅读器
,因此打印与此无关?没有人会坐在那里等待脚本遍历数十万个点,等待它们打印。如果我离开它,同样的错误会在最后出现。所以是的,印刷只是给人一种工作的错觉。