无法使用序列设置数组元素

时间:2014-05-13 05:46:04

标签: python arrays excel numpy sequence

我使用NumPy python库在.csv文件上运行大规模编辑。我正在使用这个python代码:

import numpy as np

def main():
    try:
        e,a,ad,c,s,z,ca,fn,ln,p,p2,g,ssn,cn,com,dob,doh,em = np.loadtxt('c:\wamp\www\_quac\carryover_data\SI\Employees.csv',delimiter=',',unpack=True,dtype='str')

        x=0
        dob = dob.split('/')
        for digit in dob:
            if len(digit) == 1:
                digit = str('0'+digit)
        dob = str(dob[2]+'-'+dob[0]+'-'+dob[1])

        doh = doh.split('/')
        for digit in doh:
            if len(digit) == 1:
                digit = str('0'+digit)
        doh = str(doh[2]+'-'+doh[0]+'-'+doh[1])

        for eID in e:
            saveLine=eID+','+a[x]+','+ad[x]+','+c[x]+','+s[x]+','+z[x]+','+ca[x]+','+fn[x]+','+ln[x]+','+p[x]+','+p2[x]+','+g[x]+','+ssn[x]+','+cn[x]+','+com[x]+','+dob[x]+','+doh[x]+','+em[x]+'\n'
            saveFile = open('fixedEmployees.csv','a')
            saveFile.write(saveLine)
            saveFile.close()
            x+=1


    except Exception, e:
        print str(e)

main()

dobdoh包含一个字符串,例如4/26/2012我试图将这些转换为mysql友好DATE表单,例如2012-04-26。运行此脚本时打印的错误是

cannot set an array element with a sequence

它没有指定一条线,因此我不知道这究竟意味着什么。我对python很新;我已经用同样的错误检查了其他问题,但我无法理解他们的代码。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

尝试使用zfill重新格式化日期字符串,这样您就可以拥有' 0'在你的'之前。 (zfill在左边填充一个字符串,用零填充宽度。)

doh = '4/26/2012'
doh = doh.split('/')

for i, s in enumerate(doh):
    doh[i] = s.zfill(2)

doh = doh[2]+'-'+doh[0]+'-'+doh[1]

# result: '2012-04-26'

至于cannot set an array element with a sequence,知道会有所帮助 那是在哪里发生的。我猜测数组的结构有问题。

答案 1 :(得分:0)

好的,要解决这个问题,我必须做几件事。删除try - except命令后,我发现错误位于第5行,e,a,ad,c,s行等。在我复制之前,我无法解决问题strong> 2列我想专注于 并制作了一个新程序来处理这些。

然后我必须创建一个.txt而不是.csv,因为Excel会自动格式化日期,并在我甚至可以触摸它们之前逐字更改这些值。我学到了,没有办法解决这个问题。您无法关闭日期自动格式。 excel的一个严重问题。所以这是我对这个NumPy脚本的解决方案(它改变第一列并保持第二列相同):

import numpy as np
def main():
    dob,doh=np.loadtxt('temp.csv',
                             delimiter=',',
                             unpack=True,
                             dtype='str')


    x=0
    for eachDate in dob:
        if any(c.isalpha() for c in eachDate):
            newDate=eachDate
        elif (eachDate == ''):
            newDate=''
        else:
            sp = eachDate.split('/')
            y=0
            ndArray = ['','','']
            for eachDig in sp:
                if len(eachDig) == 1:
                    eachDig = str('0'+eachDig)
                if y == 0:
                    ndArray[0] = eachDig
                elif y == 1:
                    ndArray[1] = eachDig
                elif y == 2:
                    ndArray[2] = eachDig
                    newDate=str(ndArray[2]+'-'+ndArray[0]+'-'+ndArray[1])
                    y=0
                y+=1

        print eachDate+'--->'+newDate

        """creates a .txt file with the edited dates"""
        saveLine=str(newDate+','+doh[x]+'\n')
        saveFile=open('__newTemp.txt','a')
        saveFile.write(saveLine)
        saveFile.close()
        x+=1


main()

然后我使用Data->从Excel中导入带有“TEXT”格式选项的文本来将列添加到我的.csv中。我意识到这可能是笨重而且笨拙,但它完成了工作:3