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

时间:2016-04-10 05:02:55

标签: python

我试图解析包含两列的.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

该指数如何超出范围?

1 个答案:

答案 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}}