Python错误:(IndexError:列表索引超出范围)尝试将行写入CSV

时间:2015-08-25 22:19:24

标签: python python-3.x

我试图将CSV文件拆分成多个文件。如果我从命令行使用它,代码工作正常。

我在cmd中运行 Python csv_splitterFunction.py C:\ Users \ xlViki \ Desktop \ Python \ Journal.py

import sys  

number_of_outfiles = 4  

if __name__ == "__main__":  
    k = []  
    for i in range(number_of_outfiles):  
        k.append(open(r'C:\Users\xlViki\Desktop\Python\Output_' + str(i) + '.csv','w'))  
    with open(sys.argv[1]) as inf:  
        for i, line in enumerate(inf):  
            if line[-1] == '\n': line = line[:-1]  
            if i == 0:  
                headers = line  
                [x.write(headers + '\n') for x in k]  
            else:
                k[i % number_of_outfiles].write(line + '\n')  
    [x.close() for x in k]  

但是当我尝试将代码转换为类似下面的函数并在Python shell中运行时(我在IDLE中按F5),我得到列表超出范围错误):

def Main(filepath):
    import sys  
    number_of_outfiles = 4  

    if __name__ == "__main__":  
        k = []  
        for i in range(number_of_outfiles):  
            k.append(open(r'C:\Users\xlViki\Desktop\Python\Output_' + str(i) + '.csv','w'))
            print (r'C:\Users\xlViki\Desktop\Python\Output_' + str(i))
            with open(filepath) as inf:  
                for i, line in enumerate(inf):  
                    if line[-1] == '\n': line = line[:-1]  
                    if i == 0:  
                        headers = line  
                        [x.write(headers + '\n') for x in k]  
                    else:
                        print(i)
                        print(k[0])
                        k[i % number_of_outfiles].write(line + '\n')  
            [x.close() for x in k] 


Main(r'C:\Users\xlViki\Desktop\Python\Journal.csv')

这是我收到的输出:

C:\Users\xlViki\Desktop\Python\Output_0
1
<_io.TextIOWrapper name='C:\\Users\\xlViki\\Desktop\\Python\\Output_0.csv' mode='w' encoding='cp1252'>
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    Main(r'C:\Users\xlViki\Desktop\Python\Journal.csv')
  File "C:\Users\xlViki\Desktop\Python\csv_splitterFunction.py", line 22, in Main
    k[i % number_of_outfiles].write(line + '\n')
IndexError: list index out of range

你能帮我把这段代码转换成一个函数吗?

2 个答案:

答案 0 :(得分:1)

看起来你需要取消with open(filepath) as inf:上的所有内容。第一个文件正在打开,但是第二个文件在它打开之前尝试写入第二个文件。

答案 1 :(得分:1)

错误消息告诉您列表索引超出范围异常发生在第22行k[i % number_of_outfiles].write(line + '\n')上。这一行将尝试访问k [0],k [1],k [2]和k [4],但是在循环的第一次迭代中,你只将1个元素放入k中,所以你只能访问k [0]。对此的解决方案是在进入以with open(filepath) as inf:开头的循环之前打开所有文件并将它们放入k中。 此外,您已将i用作变量两次,如果您打算保持循环嵌套,则应更改其中一个名称,否则您可以取消with open(filepath) as inf: