Python3.9-通过.csv交互时出现列表索引超出范围错误,可通过添加打印语句来解决。可能的错误?
使用python 3.9.3的标准csv库 对于上下文,我正在编写一个快速脚本,用于将.csv文件导入sqlite3数据库。 我在virtualenv中运行,从根python运行也有同样的效果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
# 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)
只返回阅读器
,因此打印与此无关?没有人会坐在那里等待脚本遍历数十万个点,等待它们打印。如果我离开它,同样的错误会在最后出现。所以是的,印刷只是给人一种工作的错觉。