IndexError:列表索引超出范围,同时循环遍历整个目录

时间:2015-08-23 07:44:51

标签: python list file

我正在尝试循环遍历文件列表并在每列中添加一些其他信息。以下代码片段适用于一个文件,但如果我有许多文件不起作用。

代码:

def list_csv_files(csv_folder):
    input_file_list = []    
    for root, dirs, files in os.walk(cwd):
        for name in files:
            if name.endswith(".csv"):
                input_file_list.append(os.path.relpath(os.path.join(root, name)))
                print input_file_list
                with open(input_file, 'rb') as f, open(temp_file, 'w') as fo: #PROBLEM HERE
                    reader = csv.reader(f, delimiter=',')
                    for row in reader:
                        one = '"'+ row[0] + '"'
                        two = row[1]
                        three = '"'+ row[2] +'"'
                        print >> fo, one,two,three
                    os.rename(temp_file, input_file)
list_csv_files(csv_folder)

输入File1:foo.csv

ProjectB - TIM - 2619,2,4/11/07
ProjectB - TIM - 2504,2,9/19/06
ProjectB - TIM - 2374,2,4/7/06
ProjectB - TIM - 2373,2,4/7/06
ProjectB - TIM - 2284,2,2/21/06

输入文件2:bar.csv

ProjectC - TIM - 2619,2,4/11/07
ProjectC - TIM - 2504,2,9/19/06

预期输出文件1:foo.csv

"ProjectB - TIM - 2619" 2 "4/11/07"
"ProjectB - TIM - 2504" 2 "9/19/06"
"ProjectB - TIM - 2374" 2 "4/7/06"
"ProjectB - TIM - 2373" 2 "4/7/06"
"ProjectB - TIM - 2284" 2 "2/21/06"

预期输出文件2:bar.csv

"ProjectC - TIM - 2619" 2 "4/11/07"
"ProjectC - TIM - 2504" 2 "9/19/06"

错误 - 错误索引出错,因为无法循环遍历所有文件。

File "read_csv.py", line 143, in <module>
    two = row[1]
IndexError: list index out of range

2 个答案:

答案 0 :(得分:1)

在迭代所有文件时遇到问题,因为某些文件的行不包含预期的列数。

您正在对它们执行的过程也意味着在运行一次脚本之后,如果您再次运行该脚本,则所有文件都将失败。

我建议修改脚本如下。它测试每行是否具有正确的列数。如果数字不正确,它将中止写入temp_file并让您知道它失败的行号并继续使用其余文件。

此外,您需要在with之外执行重命名,否则文件仍会打开。

运行脚本的最终结果是您将保留转换中止的临时文件。然后可以手动修复这些并重新启动脚本。然后,您可以删除所有_temp_个文件。

因此,根据您原来的问题代码:

import os, csv

def csv_all_files():
    folder = "mystartfolder"

    for item in os.listdir(folder):
        endaddress = item
        if endaddress.endswith(".csv"):
            print endaddress
            input_file = os.path.join(folder,item)
            temp_file = os.path.join(folder, item + "_temp_")
            ok = True

            with open(input_file, 'r') as f_input, open(temp_file, 'w') as f_output:
                reader = csv.reader(f_input, delimiter=',')
                for line_number, row in enumerate(reader):
                    if len(row) == 3:
                        f_output.write('"{}" {} "{}"\n'.format(row[0], row[1], row[2]))
                    else:
                        print "{} line {} is badly formatted".format(input_file, line_number+1)
                        ok = False
                        break

            if ok:
                os.rename(temp_file, input_file)

csv_all_files()

通过这种方式,输出将显示任何有问题的CSV文件的位置。

答案 1 :(得分:0)

您正在通过将修改过的文件重新命名为原始文件来为自己制作一根杆,并且您永远不会写入输出。
试试这个:

#def list_csv_files(csv_folder):
import os, csv
input_file_list = []
cwd = os.getcwd()
input_file_list = []

for root, dirs, files in os.walk(cwd):
    for name in files:
        if name.endswith(".csv"):
            print name
            input_file_list.append(os.path.relpath(os.path.join(root, name)))
            print input_file_list
for input_file in input_file_list:
    temp_file = "./temp.out"
    f = open(input_file, 'rb')
    fo = open(temp_file, 'w')
    reader = csv.reader(f, delimiter=',')
    for row in reader:
        one = '"'+ row[0] + '"'
        two = row[1]
        three = '"'+ row[2] +'"'
        fo.write(one+" "+two+" "+three+"\n")
    f.close()
    fo.close()
    os.rename(temp_file, input_file)