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()
        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 行在所有文本中,每一行对应于一个文件的完整文本,请帮助我

回溯(最近一次调用最后一次):文件“C:\Python27\preprocessing added adnan.py”,第 51 行,在 lines.append(lines[i+1]) IndexError: list index out of range

4

3 回答 3

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) 个元素 - 因此例如,如果列表包含索引从 0 到 9 的 10 个元素,那么当 i 是9,您尝试访问 i+1,即 10,它不在列表中。

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

希望这可以帮助。

于 2013-11-08T06:12:38.103 回答
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)
于 2013-11-08T06:08:01.317 回答
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)
于 2013-11-08T06:03:40.430 回答