请帮助我提供代码
我正在
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(),
})
答案 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
是一个包含单个元素的列表。