使用拆分函数时的索引器错误

2024-09-28 23:04:31 发布

您现在位置:Python中文网/ 问答频道 /正文

请帮我写代码

我要走了

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(),  
   })

Tags: csv代码comfilecol2col3col1row
2条回答

您正在以逗号分隔的值读取文件。所以,看这一行:

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)

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

li[0] == li[-1]在case中li是一个包含单个元素的列表。你知道吗

相关问题 更多 >