我试图解析包含两列的.csv文件:Ticker(公司代码名称)和收入(相应公司的收入)。当我使用以下代码读取文件时:
f = open('earnings.csv', 'r')
earnings = f.read()
我运行print earnings
时的结果看起来像这样(它只是一个字符串):
Ticker;Earnings
AAPL;52131400000
TSLA;-911214000
AMZN;583841600
我使用以下代码用断行字符(\ 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]的收益 - 目前是字符串 - 介绍整数。所以我首先删除包含列名的第一个列表:
headless_earnings = string_earnings[1:]
之后我尝试遍历结果列表,将每个列表的index [1]的值转换为整数,其中包含以下内容:
numerical = []
for i in headless_earnings:
num = int(i[1])
numerical.append(num)
我收到以下错误:
num = int(i[1])
IndexError: list index out of range
该指数如何超出范围?
答案 0 :(得分:0)
你肯定错误地处理了行尾。
如果我用这个字符串尝试你的代码:“Ticker; Earnings \ r \ n \ n \ AAPL; 52131400000 \ r \ n \ n \ n \ n \ _ \ n \ n \ _会员; -911214000 \ r \ n \ n \ n \ n \ n \ n \ NAMZN; 583841600”它可以运行。
但是有了这个:“Ticker; Earnings \ r \ n \ n \ AAPL; 52131400000 \ r \ n \ n \ n \ n \ n \ n \ t \ t; \ n \ n \ n \ n \ n \ n \ n \ _间预备; \ n \ n \ n \ _对于\ n \ n \ r \ n \ n \ n \ n \ n \ _间预览; \ n对于错误。< / p>
说明:['']
创建仅包含[''][1]
的最后一个列表项。所以最后,python尝试访问earnings_list = earnings[:-1].split('\n')
,因此错误。
所以一个非常简单的解决方法是删除最后一个'\ n'(如果你确定它是'\ n',否则你可能会有惊喜)。
你可以这样写:
earnings_list = earnings[:-1].split('\n') if earnings[-1] == '\n' else earnings.split('\n')
这将解决您的错误。
如果你想确定删除最后一个'\ 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]
输出:
{{1}}