无法用序列设置数组元素
我正在使用 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()
dob
和 doh
里存的是字符串,比如 4/26/2012
,我想把这些转换成适合 mysql
的 DATE
格式,比如 2012-04-26
。但是当我运行这个脚本时,出现了一个错误:
cannot set an array element with a sequence
这个错误没有指明具体是哪一行,所以我也不知道这到底是什么意思。我对 Python 还很陌生;我查过其他遇到同样错误的问题,但我看不懂他们的代码。非常感谢任何帮助。
2 个回答
试试用 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
这个问题,知道它发生在哪里会很有帮助。我猜可能是数组的结构出了问题。
好的,为了解决这个问题,我做了几件事。首先,我把 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