【问题标题】:index out of range when appending to csv file附加到 csv 文件时索引超出范围
【发布时间】:2013-11-08 15:32:55
【问题描述】:
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 行所有文本,每行对应于一个文件的完整文本,请帮助我,我尝试了各种方法,但它给出了一些错误或其他错误,使用此代码它给出错误为

Traceback(最近一次通话最后一次): 文件“C:\Python27\preprocessing 添加 adnan.py”,第 51 行,在 行.追加(行[i+1]) IndexError: 列表索引超出范围

【问题讨论】:

    标签: python


    【解决方案1】:

    这个循环需要改造:

    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)
    

    【讨论】:

      【解决方案2】:

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

      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)
      

      您遇到 index out of range 错误的原因是您正试图访问列表中的第 (i+1) 个元素 - 例如,如果列表包含 10 个元素从 0 到 9 索引,然后当 i 为 9 时,您尝试访问 i+1 即 10,该列表中不存在。

      我得到了在this SO question 中将多行合并为一行的简洁方法。

      希望这会有所帮助。

      【讨论】:

      • writerow 方法采用列表(行),而不是字符串
      • @ilius writerow 取一行,writerows 取一个集合。请参阅链接上的第 13.1.4 节 - 编写器对象:docs.python.org/2/library/csv.html
      • 我的意思是一个字符串列表,作为一行
      • @ilius 哦 - 我明白了 - 我已经更正了我的答案,不加入 '\t' 行。
      【解决方案3】:

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

      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)
      

      【讨论】:

      • 首先非常感谢你,我是 python 新手,代码正在运行,但同样的问题一个文件的总文本占用多行我希望一个文件的总文本只占用一个如果你能帮助我,我会非常感谢你
      猜你喜欢
      • 2019-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 2015-04-19
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      相关资源
      最近更新 更多