1

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

非常感谢您的帮助。

4

2 回答 2

2

我有点惊讶你提到的错误是在[r for r in currentFile]. 在最坏的情况下,您的rows列表将是空的...

您是否 100% 确定您的所有行至少有 35 列?你在某处没有空行吗?最后?值得检查是否

errorColumn = [row[34] for row in rows if row]

仍然给出错误。前提是您先摆脱了这for data in currentFile条线(您不使用,更重要的是消耗了您的currentFile,留给您rows==[]

于 2012-09-17T15:49:35.207 回答
1

循环遍历 CSV 文件的for行。阅读器将每一行转换为元素的行。这样,data循环中的 in 已经是行了。下一个构造也遍历打开的文件。这是错误的。

您的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):
    ...

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

于 2012-09-17T15:56:40.163 回答