附加到csv文件时索引超出范围

时间:2013-11-08 05:49:11

标签: python

directory = raw_input("INPUT Folder:")
output = raw_input("OUTPUT Folder:")
txt_files = os.path.join(directory, '*.txt')
for txt_file in glob.glob(txt_files):
    filename = os.path.splitext(os.path.basename(txt_file))[0] + '.csv'
    with open(txt_file, "rb") as input_file, open("book.csv", 'a') as output_file:
        out_csv = csv.writer(output_file)
        lines = input_file.readlines()
        for i in range(0, len(lines)):
            if i==len(lines):
                out_csv.writerow(lines)
            else:
                lines.append(lines[i+1])

我正在尝试打开电影评论数据库中的文本文件并将其转换为使得文本文件中的总数据应该在csv中作为一行,即电影评论中的neg文件夹包含1000个文件,我的csv应该包含1000行所有文本,每行对应一个文件的完整文本,请帮助我,我尝试了各种方法,但它给出了一些错误或其他,这个代码是givivng错误

Traceback(最近一次调用最后一次):   文件“C:\ Python27 \ preprocessing add adnan.py”,第51行,in     lines.append(行[I + 1]) IndexError:列表索引超出范围

3 个答案:

答案 0 :(得分:0)

此循环需要重新构建:

for i in range(0, len(lines)):
        if i==len(lines):
            out_csv.writerow(lines)
        else:
            lines.append(lines[i+1])

将行中的东西追加到行中也是没有意义的,你需要另一个变量。 像这样重写这个循环以避免:

newlist = list()
for i in range(0, len(lines)-1):
    newlist.append(lines[i+1])
out_csv.writerow(newlist)

答案 1 :(得分:0)

您的代码的最后几行完全有问题:

1-在for循环for i in range(0, n):中,i永远不会等于n,它从0变为n-1

2- range(0, n)range(n)相同,因此请使用较短的

3-不要在列表中迭代的同一循环中更改列表

4-您向lines添加了相同的元素。我认为你正在复制行(除了标题之外),例如:

lines = lines + lines[1:]

而且我不确定为什么这样做!

5- fp.readlines()返回的行包含可能破坏csv文件的尾随换行符。

6-您可以简单地遍历文件对象,例如for line in open(...):

所以我应该写的代码是:

directory = raw_input("INPUT Folder:")
output = raw_input("OUTPUT Folder:")
txt_files = os.path.join(directory, '*.txt')
for txt_file in glob.glob(txt_files):
    filename = os.path.splitext(os.path.basename(txt_file))[0] + '.csv'
    with open(txt_file, "rb") as input_file, open("book.csv", 'a') as output_file:
        out_csv = csv.writer(output_file)
        row = []
        for line in input_file:
            line = line.strip()## removes trailing newline, and possible leading whitespaces
            if line:
                row.append(line)
        out_csv.writerow(row)

答案 2 :(得分:0)

我修改了您在上面发布的代码段。请尝试这个,让我知道它是否有效:

directory = raw_input("INPUT Folder:")
output = raw_input("OUTPUT Folder:")
txt_files = os.path.join(directory, '*.txt')
for txt_file in glob.glob(txt_files):
    filename = os.path.splitext(os.path.basename(txt_file))[0] + '.csv'
    with open(txt_file, "rb") as input_file, open("book.csv", 'a') as output_file:
        out_csv = csv.writer(output_file)
        lines = input_file.readlines()
        complete_file_content = [line.strip() for line in lines]
        out_csv.writerow(complete_file_content)

您面对索引超出范围错误的原因是因为您尝试访问列表中的第(i + 1)个元素 - 因此,例如,如果列表包含10个元素索引从0到9,然后当我是9时,你试图访问10 +的i + 1,这在列表中不存在。

我在this SO问题中得到了将多行连接成一行的简洁方法。

希望这有帮助。