Python"字符串索引超出范围"在行操作期间

时间:2016-06-14 15:59:37

标签: python list for-loop

希望你能提供帮助。我试图迭代.csv文件并删除第一项的第一个字符为#的行。 虽然我的代码确实删除了必要的行,但我会看到超出范围的"字符串索引"错误。

我的代码如下:

input=open("/home/stephen/Desktop/paths_output.csv", 'rb')
output=open("/home/stephen/Desktop/paths_output2.csv", "wb")
writer = csv.writer(output)
for row in csv.reader(input):
    if (row[0][0]) != '#':
        writer.writerow(row)
input.close()
output.close()

据我所知,我没有空行,我试图迭代。

5 个答案:

答案 0 :(得分:0)

我怀疑有第一个单元格为空的行,因此row[0][0]会尝试访问空字符串的第一个字符。

你应该尝试:

for row in csv.reader(input):
    if not row[0].startswith('#'):
        writer.writerow(row)

答案 1 :(得分:0)

在尝试索引之前检查字符串是否为if row[0]为空:

input=open("/home/stephen/Desktop/paths_output.csv", 'rb')
output=open("/home/stephen/Desktop/paths_output2.csv", "wb")
writer = csv.writer(output)
for row in csv.reader(input):
    if row[0] and row[0][0] != '#': # here
        writer.writerow(row)
input.close()
output.close()

或者只使用if row[0].startswith('#')作为您的条件

答案 2 :(得分:0)

你可能遇到一个空字符串。

也许试试

`如果行和行[0] [0]!='#':

答案 3 :(得分:0)

那么为什么你不确定你是否碰到任何一个,即使它们存在,先检查这条线是否为空,如下所示:

input=open("/home/stephen/Desktop/paths_output.csv", 'rb')
output=open("/home/stephen/Desktop/paths_output2.csv", "wb")
writer = csv.writer(output)
for row in csv.reader(input):
    if row:
        if (row[0][0]) != '#':
            writer.writerow(row)
    else:
        continue
input.close()
output.close()

使用* .csv文件时,最好在文本编辑器中查看它们,以确保分隔符和end_of_line字符与您认为的一样。 sniffer也很好读。

干杯

答案 4 :(得分:0)

为什么不提供工作代码(包括导入)并像往常一样包装上下文管理器中的物理资源?

像这样:

#! /usr/bin/env python
"""Only strip those rows that start with hash (#)."""
import csv

IN_F_PATH = "/home/stephen/Desktop/paths_output.csv"
OUT_F_PATH = "/home/stephen/Desktop/paths_output2.csv"
with open(IN_F_PATH, 'rb') as i_f, open(OUT_F_PATH, "wb") as o_f:
    writer = csv.writer(o_f)
    for row in csv.reader(i_f):
        if row and row[0].startswith('#'):
            continue
        writer.writerow(row)

一些注意事项:

  1. 通过保留上下文块
  2. 来自动关闭文件
  3. 更好地选择名称,因为输入是关键字......
  4. 你可能想要包含空行,我只读你要从问题中删除注释行,所以检测这些并继续。
  5. 是行[0],它是第一个列字符串,以#本地映射到最佳匹配的简单字符串“方法”开始。
  6. 如果您还想要删除空行,则可以使用以下条件代替continue

    if not row or row and row[0].startswith('#'):
    

    你应该准备好了。 HTH

    回答上述代码行的注释,该注释也导致跳过空白输入“Lines”。 在Python中,我们从左到右(懒惰的评估)和布尔表达式的短路,所以:

    >>> row = ["#", "42"]
    >>> if not row or row and row[0].startswith("#"):
    ...     print "Empty or comment!"
    ... 
    Empty or comment!
    >>> row = []
    >>> if not row or row and row[0].startswith("#"):
    ...     print "Empty or comment!"
    ... 
    Empty or comment!