在python中解析.csv文件时如何避免错误?
我试图解析一个包含两列的.csv文件:Ticker(公司股票代码名称)和Earnings(对应公司的收益)。当我使用以下代码读取文件时:在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
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模块可以避免重新发明轮子脚后跟