如何遍历目录中的csv文件并将值写入二维列表?

时间:2012-09-17 15:45:51

标签: python

我是一个绝对的编程新手,试图使用一些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文件,因为我已经使用工作脚本逐个测试它们。可能是什么问题?

非常感谢您的帮助。

2 个答案:

答案 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):
    ...

顺便说一下,你应该清楚地描述你的实际目标是什么。可能有更好的方法来解决它。您可能会精神上固定在您首先想到的解决方案上。利用这种媒体可以有更多的眼睛和更多的头脑来建议解决方案。