将CSV数据映射到Python

时间:2014-09-29 21:05:08

标签: python excel csv

我是Python的新手,我正试图将我创建的excel求解器模型“迁移”到Python中,希望能有更高效的处理时间。

我收到一张.csv表,我用作模型的输入,它总是采用相同的格式。

该模型主要使用与产品A,B和C相关的4个不同指标,我基本上确定了如何相应地定价A,B和C.

我正处于将这些数据有效输入Python的初期阶段。这就是我所拥有的,如果有更好的方法,我也不会感到惊讶,所以你可以尝试任何你想要推荐的东西!

import csv

f = open("141881.csv")
for row in csv.reader(f):

    price = row[0]

    a_metric1 = row[1]
    a_metric2 = row[2]
    a_metric3 = row[3]
    a_metric4 = row[4]

    b_metric1 = row[7]
    b_metric2 = row[8]
    b_metric3 = row[9]
    b_metric4 = row[10]

    c_metric1 = row[13]
    c_metric2 = row[14]
    c_metric3 = row[15]
    c_metric4 = row[16]

.csv文件的格式为price,a_metric1,a_metric2,a_metric3,a_metric4,price,b_metric1,b_metric2,b_metric3,b_metric4,price ,, c_metric1,c_metric2,c_metric3,c_metric4

我跳过第二和第三价格列,因为它们与第一个相同。

然而,当我运行python脚本时,我收到以下错误:

    c_metric1 = row[13]
IndexError: list index out of range

我不知道为什么会发生这种情况,当我可以看到自己的数据时(在excel中,这个.csv文件会一直到列Q,或者我理解为行[16]。

我们非常感谢您的帮助,对我的方法提出的任何建议都非常受欢迎。

提前致谢!

4 个答案:

答案 0 :(得分:1)

使用print()可以成为您的朋友:

import csv
with open('141881.csv') as file_handle:
    file_reader = csv.reader(file_handle)
    for row in file_reader:
        print(row)

上面的代码将打印出每一行。

要打印出第一行,请将for循环替换为:print(file_reader.__next__())(假设Python3)

打印出行可以让你看到"行"是

P.S。 建议使用with,因为它会为您处理文件的打开和关闭

答案 1 :(得分:1)

查看pandas

将文件读取为:

data = pd.read_csv('141881.csv'))

阅读专栏:

col = data.columns['column_name']

读一行:

row = data.ix[row_number]

答案 2 :(得分:0)

  • Python中的CSV模块将电子表格转换为matrice:列表列表

读取csv的python模块将输入的每一行转换为一个列表。 对于每一行,它会将行拆分为单元格列表。换句话说,一个数组由excel电子表格中的列数组成。

尝试终端:

>>> f = open("141881.csv")
>>> print csv.reader(f)
>>>[["id", "name", "company", "email"],[1563, "defoe", "SuperFastCompany",],["def@superfastcie.net"],[1564, "doe", "Awsomestartup", "doe@awesomestartup"], ...]`

这就是为什么你遍历电子表格的行,将值分配给一个新变量。

  

我建议您阅读list manipulation的基础知识。

但是...

  • 什么是IndexError ?捕捉异常:

如果一个单元格为空或一行的列数少于其他单元格,则会产生错误。如你所描述的。 IndexError意味着Python无法为此特定单元格找到值。换句话说,如果你的excel电子表格的某些行小于另一行,它会说没有这样的值来签名并抛出索引错误。知道如何捕获异常的原因对于查看问题非常有用。如果不为例如

分配空值,请尝试验证每个列表的长度是否相同
try:
#if row has always 17 cells with values 
#I can just assign it directly using a little trick
 price,a_metric1,a_metric2,a_metric3,a_metric4,,price,b_metric1,b_metric2,b_metric3,b_metric4,price,c_metric1,c_metric2,c_metric3,c_metric4 = row'
except IndexError:
    # if there is no 17 cells 
    # tell me how many cells is actually in the list
    # you will see there that there less than 17 elements

  print len(row)

现在您可以通过为未出现在csv文件中的人分配无值来跳过错误

您可以阅读有关Catching Exception

的更多信息

答案 3 :(得分:0)

感谢大家的意见 - 打印结果让我意识到我得到了IndexError,因为第一行只有标题。跳过那一行摆脱了错误。

我会调查大熊猫,看起来这对我正在做的工作类型很有用。

再次感谢您的帮助,非常感谢。