我是一个绝对的编程新手,试图使用一些csv文件。虽然我想要做的总体上更复杂,但我目前仍然坚持这个问题:
我拥有的csv文件包含固定数量的“列”和可变数量的行。我想要做的是打开目录中的每个csv文件,而在内存中将文件值存储到2d列表,然后从该列表中提取一个“列”数据。通过在循环中执行此操作,我可以附加一个列表,其中包含来自每个csv文件的一列数据。
当我为单个文件执行此操作时,它可以工作:
csvFile = 'testdata.csv'
currentFile = csv.reader(open(csvFile), delimiter=';')
errorValues = []
for data in currentFile:
rows = [r for r in currentFile] #Store current csv file into a 2d list
errorColumn = [row[34] for row in rows] #Get position 34 of each row in 2D list
errorColumn = filter(None, errorColumn) #Filter out empty strings
errorValues.append(errorColumn) #Append one 'column' of data to overall list
当我尝试为我目录中的所有文件循环时,我得到一个'列表索引超出范围'错误:
dirListing = os.listdir(os.getcwd())
errorValues = []
for dataFile in dirListing:
currentFile = csv.reader(open(dataFile), delimiter=';')
for data in currentFile:
rows = [r for r in currentFile] #Store current csv file into a 2d list
errorColumn = [row[34] for row in rows] #Get position 34 of each row in 2D list
errorColumn = filter(None, errorColumn) #Filter out empty strings
errorValues.append(errorColumn) #Append one 'column' of data to overall list
errorColumn = [] #Clear out errorColumn for next iteration
错误发生在'errorColumn = [row [34] for row in rows]'。我已经尝试了各种方法来做到这一点,总是没有索引超出范围错误。故障不是我的csv文件,因为我已经使用工作脚本逐个测试它们。可能是什么问题?
非常感谢您的帮助。
答案 0 :(得分:2)
我有点惊讶你提到的错误是[r for r in currentFile]
。在最坏的情况下,您的rows
列表将为空......
您是否100%确定所有您的行至少有35列?你某处没有空行?在最后?值得检查是否
errorColumn = [row[34] for row in rows if row]
仍然会出错。如果你首先摆脱了for data in currentFile
行(你不使用,更重要的是消耗你的currentFile
,请留下你rows==[]
)
答案 1 :(得分:1)
for
循环遍历CSV文件的行。读取器将每一行转换为元素行。这样,循环中的data
已经是行。下一个构造也遍历打开的文件。这是错误的。
您的open()
存在问题。该文件必须以二进制模式打开(在Python 2中)。
尝试以下方法(我没有把你想要的东西放在里面):
dirListing = os.listdir(os.getcwd())
errorValues = []
rows = [] # empty array of rows initially
for fname in dirListing:
f = open(fname, 'rb') # open in binary mode (see the doc)
reader = csv.reader(f, delimiter=';')
errorColumn = [] # initialized for the file
for row in reader:
rows.append(row) #Store current csv file into a 2d list
if len(row) > 34:
errorColumn.append(row[34]) #Get position 34 of each row in 2D list
errorValues.append(errorColumn)
f.close() # you should always close your files
小心! os.listdir()
还返回子目录的名称。尝试添加
if os.path.isfile(fname):
...
顺便说一下,你应该清楚地描述你的实际目标是什么。可能有更好的方法来解决它。您可能会精神上固定在您首先想到的解决方案上。利用这种媒体可以有更多的眼睛和更多的头脑来建议解决方案。