在python中解析.csv文件时如何避免错误?

在python中解析.csv文件时如何避免错误?,python,Python,我试图解析一个包含两列的.csv文件:Ticker(公司股票代码名称)和Earnings(对应公司的收益)。当我使用以下代码读取文件时: f = open('earnings.csv', 'r') earnings = f.read() 运行print earnings时的结果如下(它是一个字符串): 我使用以下代码按换行符(\n)拆分字符串,然后按分号字符拆分每个结果行: earnings_list = earnings.split('\n') string_earnings = [] fo

我试图解析一个包含两列的.csv文件:Ticker(公司股票代码名称)和Earnings(对应公司的收益)。当我使用以下代码读取文件时:

f = open('earnings.csv', 'r')
earnings = f.read()
运行
print earnings
时的结果如下(它是一个字符串):

我使用以下代码按换行符(\n)拆分字符串,然后按分号字符拆分每个结果行:

earnings_list = earnings.split('\n')
string_earnings = []
for string in earnings_list:
    colon_list = string.split(';')
    string_earnings.append(colon_list)
结果是一个列表列表,其中每个列表包含索引[0]处的公司股票代码及其索引[1]处的收益,如下所示:

[['Ticker', 'Earnings\r\r'], ['AAPL', '52131400000\r\r'], ['TSLA', '-911214000\r\r'], ['AMZN', '583841600\r\r']]
现在,我想将每个列表的索引[1]处的收益(当前为字符串)转换为intro整数。因此,我首先删除包含列名的第一个列表:

headless_earnings = string_earnings[1:]
之后,我尝试在结果列表上循环,将每个列表的索引[1]处的值转换为整数,如下所示:

numerical = []
for i in headless_earnings:
    num = int(i[1])
    numerical.append(num)
我得到以下错误:

num = int(i[1])
IndexError: list index out of range

这个指数怎么会超出范围

你肯定是处理不当了

如果我用以下字符串尝试您的代码:“Ticker;Earnings\r\nAAPL;52131400000\r\r\nTSLA;-911214000\r\r\n;583841600”它可以工作

但对于这一条:“股票代码;收益\r\r\nAAPL;52131400000\r\r\nTSLA;-911214000\r\r\n;583841600\r\r\n”则不是

说明:
split
创建最后一个仅包含
['']
的列表项。因此,在最后,python尝试访问
[''][1]
,因此出现了错误

因此,一个非常简单的解决方法是删除最后一个'\n'(如果您确定它是'\n',否则您可能会感到意外)

你可以这样写:

earnings_list = earnings[:-1].split('\n')
这将修复您的错误

如果要确保删除最后一个“\n”,可以编写:

earnings_list = earnings[:-1].split('\n') if earnings[-1] == '\n' else earnings.split('\n')
编辑:测试代码:

#!/usr/bin/env python2

earnings = "Ticker;Earnings\r\r\nAAPL;52131400000\r\r\nTSLA;-911214000\r\r\nAMZN;583841600\r\r\n"

earnings_list = earnings[:-1].split('\n') if earnings[-1] == '\n' else earnings.split('\n')
string_earnings = []
for string in earnings_list:
    colon_list = string.split(';')
    string_earnings.append(colon_list)

headless_earnings = string_earnings[1:]

#print(headless_earnings)

numerical = []
for i in headless_earnings:
    num = int(i[1])
    numerical.append(num)

print numerical
输出:

nico@ometeotl:~/temp$ ./test_script2.py 
[52131400000, -911214000, 583841600]

你肯定是处理不当了

如果我用以下字符串尝试您的代码:“Ticker;Earnings\r\nAAPL;52131400000\r\r\nTSLA;-911214000\r\r\n;583841600”它可以工作

但对于这一条:“股票代码;收益\r\r\nAAPL;52131400000\r\r\nTSLA;-911214000\r\r\n;583841600\r\r\n”则不是

说明:
split
创建最后一个仅包含
['']
的列表项。因此,在最后,python尝试访问
[''][1]
,因此出现了错误

因此,一个非常简单的解决方法是删除最后一个'\n'(如果您确定它是'\n',否则您可能会感到意外)

你可以这样写:

earnings_list = earnings[:-1].split('\n')
这将修复您的错误

如果要确保删除最后一个“\n”,可以编写:

earnings_list = earnings[:-1].split('\n') if earnings[-1] == '\n' else earnings.split('\n')
编辑:测试代码:

#!/usr/bin/env python2

earnings = "Ticker;Earnings\r\r\nAAPL;52131400000\r\r\nTSLA;-911214000\r\r\nAMZN;583841600\r\r\n"

earnings_list = earnings[:-1].split('\n') if earnings[-1] == '\n' else earnings.split('\n')
string_earnings = []
for string in earnings_list:
    colon_list = string.split(';')
    string_earnings.append(colon_list)

headless_earnings = string_earnings[1:]

#print(headless_earnings)

numerical = []
for i in headless_earnings:
    num = int(i[1])
    numerical.append(num)

print numerical
输出:

nico@ometeotl:~/temp$ ./test_script2.py 
[52131400000, -911214000, 583841600]

撇开这一事实不谈,有一个专门设计的
csv
模块,您不必手动拆分,为什么不在导致错误的行之前添加
print(i)
,看看Python认为
i
实际上是什么?谢谢,我知道
csv
模块,我试图更深入地了解引擎盖下发生的事情。我确实尝试过,当对循环中的每一行代码单独执行时,输出就是我期望的输出。当我作为一个整体运行循环时,错误就会出现。不。如果
int(I[1])
抛出一个索引器,那么
I
没有元素1,所以如果在它前面添加
print(I)
你会看到一个包含两个元素的列表,这是不正确的。100%确定你的列表没有包含确切的
['Ticker',revenues\r\r'],['AAPL',52131400000\r\r'],['TSLA','-911214000\r\r'],['AMZN',583841600\r\r']]]
否则您的其余代码就可以工作了。我敢打赌错误来自您文件中的最后一个
\n
,这导致
split()
无头收入
中添加一个空的
['
(你试过了吗?@zezollo告诉你哪里正确。那是空的
[“”]
是导致错误的原因。在应用更正后,循环运行没有问题。对不起,我尝试过投票给你的答案,但我没有足够的声誉。感谢你的帮助!撇开有一个专门设计的
csv
模块,你不必手动拆分,为什么不添加
print(I)
就在导致错误的那一行之前,看看Python认为
i
实际上是什么?谢谢,我知道
csv
模块,我试图更深入地理解引擎盖下发生的事情。我尝试过,当对循环中的每一行代码单独完成时,输出就是我所期望的他将循环作为一个整体显示错误。不。如果
int(i[1])
抛出了一个索引器,那么
i
没有元素1,因此如果在它前面添加
print(i)
你会看到一个包含两个元素的列表,这是不正确的。100%确定你的列表不包含确切的
['Ticker',Earnings\r\r'],['AAPL',52131400000\r\r'],['TSLA','-911214000\r\r'],['AMZN',583841600\r\r']]]
否则您的其余代码就可以工作了。我敢打赌错误来自您文件中的最后一个
\n
,这导致
split()
无头收入
中添加一个空的
['
(你试过了吗?@zezollo告诉你哪里正确。那是空的
[“”]
是导致错误的原因。在应用更正后,循环运行没有问题。对不起,我尝试了投票给你的答案,但我没有足够的声誉。感谢你的帮助!正如DSM所指出的,使用csv模块可以避免重新发明轮子。正如DSM所指出的,使用csv模块可以避免重新发明轮子脚后跟