无法用序列设置数组元素

0 投票
2 回答
619 浏览
提问于 2025-04-18 06:22

我正在使用 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,我想把这些转换成适合 mysqlDATE 格式,比如 2012-04-26。但是当我运行这个脚本时,出现了一个错误:

cannot set an array element with a sequence

这个错误没有指明具体是哪一行,所以我也不知道这到底是什么意思。我对 Python 还很陌生;我查过其他遇到同样错误的问题,但我看不懂他们的代码。非常感谢任何帮助。

2 个回答

1

试试用 zfill 来重新格式化日期字符串,这样你就可以在 '4' 前面加个 '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 这个问题,知道它发生在哪里会很有帮助。我猜可能是数组的结构出了问题。

0

好的,为了解决这个问题,我做了几件事。首先,我把 try-except 这些命令去掉了,然后发现错误出现在第5行,也就是那行包含 e,a,ad,c,s 等的地方。直到我简单地复制了我想专注的两个列,并为它们做了一个新的程序,我才解决了这个问题。

接着,我需要创建一个 .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()

然后我在Excel中使用“数据”->“从文本导入”,选择“文本”格式选项,把列导入到我的 .csv 文件里。我知道这可能有点繁琐和初学者,但这确实解决了问题 :3

撰写回答