使用分割功能时的IndexError

时间:2018-07-10 17:39:42

标签: python python-3.x

请帮助我提供代码

我正在

IndexError: list index out of range 

当我使用

split(",")[1] and split(",")[2]

反而效果很好

split(",")[0] and split(",")[-1] 

感谢您的帮助

 my data like this:

  INPUT.csv
 col0  col1    col2    col3     col4
 blue,  eight,  line,  aaa     abc@123.com,xyz@123.com,ghi@123.com
 green, nine,   square, bbb    sdf@123.com,wef@123.com,hft@123.com


 expected output

 OUTPUT.csv
  col0  col1    col2    col3    col4          col5           col6
 blue    eight    line   aaa    abc@123.com   xyz@123.com    ghi@123.com
 green,  nine,   square, bbb     sdf@123.com   wef@123.com    hft@123.com

到目前为止,我的代码:

import csv

with open('INPUT.csv', 'r') as csv_file:
csv_reader = csv.DictReader(csv_file)

with open('OUTPUT.csv', 'w',encoding='utf-8') as new_file:
fieldnames = ['col0','col1','col2','col3','col4','col5','col6']
csv_writer = csv.DictWriter(new_file,lineterminator='\n' , 
fieldnames=fieldnames)
)

 for row in csv_reader:                    
 csv_writer.writerow({
    "col0": row["col0"],
    "col1": row["col1"],
    "col4": row["col4"].split(",")[0].strip(),
    "col5": row["col4"].split(",")[1].strip(),
    "col6": row["col4"].split(",")[2].strip(),  
   })

2 个答案:

答案 0 :(得分:4)

您正在读取文件,以逗号分隔。因此,请看这一行:

green, nine,   square, bbb    sdf@123.com,wef@123.com,hft@123.com

以逗号分隔的值是:

green
 nine
   square
 bbb    sdf@123.com
wef@123.com
hft@123.com

因此,您的第4列为wef@123.com。当您尝试将其拆分为逗号时,它当然没有任何内容,因此您只返回一个结果,然后要求输入第二个和第三个不存在的值。


您需要将CSV文件修复为实际的CSV文件。

这包括在bbb列之后和标题中的每一列之后加上逗号。

而且,更重要的是,这意味着在使用相同的逗号分隔列时,请不要在列内使用逗号。结果充其量是模棱两可的,因此无法解析。

解决方法包括:

  • 用逗号分隔字符串。
  • 转义逗号。
  • 在列中使用其他分隔符。
  • 在列之间使用其他分隔符。

(您可以在这里几乎使用", "作为列定界符,但这确实很麻烦,任何人工编辑您的文件都会破坏它。)


这是一个可行的例子:

 col0,  col1,   col2,  col3,     col4
 blue,  eight,  line,  aaa,     abc@123.com,xyz@123.com,ghi@123.com
 green, nine,   square, bbb,    sdf@123.com,wef@123.com,hft@123.com

即使具有所有混乱的间距(您总是从人工编辑的文件中获得),也可以使用正确的dialect parameters来进行清晰,明确的解析:

csv_reader = csv.DictReader(csv_file, skipinitialspace=True)

现在,每一行如下:

{'col0': 'blue',
 'col1': 'eight',
 'col2': 'line',
 'col3': 'aaa',
 'col4': 'abc@123.com,xyz@123.com,ghi@123.com'}

…所以现在,您可以row["col4"].split(",")并返回:

['abc@123.com', 'xyz@123.com', 'ghi@123.com']

然后[1][2]将起作用。


但是,您的代码中至少还有另外一个问题。所需的输出包括第2列和第3列,但您明确将它们排除在writerow之外。

虽然我们正在这样做,但没有理由尝试将7行代码塞入一个表达式中。那么,为什么不只split行一次呢?

col456 = row["col4"].split(",")

然后,我们可以就地修改row

row["col4"], row["col5"], row["col6"] = col456

...现在:

csv_writer.writerow(row)

答案 1 :(得分:1)

如果string不包含任何',',则string.split(',')将返回一个包含单个元素的列表,即整个字符串。在这种情况下,string.split(',')[1]显然会提高IndexError

li[0] == li[-1],如果li是一个包含单个元素的列表。