我在格式化数组时遇到了麻烦,当它保存到csv文件时,每次运行程序都会得到不同的结果,有时字符串"creditCard"没有显示在电子表格中,但所有其他详细信息都显示在电子表格中。有时确实如此。在我的代码中是否有一些明显的东西导致这种脆弱?我已经附上了相关代码
def start():
dtype = [('Name', (np.str_, 10 )), ('Number of uses', np.int32), ('Card Value', np.float64)]
defaultCardArray = np.array([("creditCard",4,200)],dtype=dtype)
np.savetxt('creditCards.csv', defaultCardArray, delimiter=',', fmt=['%s' , '%d', '%f'],
header='Name,Number of Uses, Card Value', comments='')e here
文件创建后,我还使用下面的代码在那里添加每个卡片。默认卡加载与文件创建,但以下卡数组是我有问题有要求用户输入的代码它保存到变量中没有错误所以我没有在这里包含
cardArray = np.array([creditCard,itemLimit,cardValueInput]).reshape(1,3)
file = open(r'creditCards.csv', 'at', newline ='')
with file:
write = csv.writer(file)
write.writerows(cardArray)
file.close()
我在csv
中得到的输出的图像对于您的代码,我认为当您创建新的cardArray
时,您没有像初始数组那样指定类型,这可能是一个问题。
无论如何,numpy可能不是这里使用的最佳库。
对于这种数据,我将使用pandas:
import pandas as pd
header = ['Name', 'Number of Uses', 'Card Value']
def start():
# create default dataset
default_card_df = pd.DataFrame(["creditCard",4,200], columns=header)
default_card_df.to_csv('creditCards.csv', sep=",")
def add_card(name, itemLimit, cardValueInput):
# read csv, add new data, save to csv
df = pd.read_csv('creaditCards.csv', sep=",")
new_df = pd.DataFrame([name, itemLimit, cardValueInput], columns=header)
updated_df = pd.concat(df, new_df)
updated_df.to_csv('creditCards.csv', sep=",")
您的初始书写:
In [281]: np.savetxt('creditCards.csv', defaultCardArray, delimiter=',', fmt=['%
...: s' , '%d', '%f'],
...: header='Name,Number of Uses, Card Value', comments='')
生产:
In [282]: cat creditCards.csv
Name,Number of Uses, Card Value
creditCard,4,200.000000
如果以追加模式打开,则可以向该文件添加更多条目:
In [284]: with open('creditCards.csv','a') as f:
...: np.savetxt(f, defaultCardArray, delimiter=',', fmt=['%s' , '%d', '
...: %f'])
...:
In [285]: cat creditCards.csv
Name,Number of Uses, Card Value
creditCard,4,200.000000
creditCard,4,200.000000
要继续使用savetxt
和相同的fmt
,您应该使用原始的dtype
创建数组。
.
In [286]: newcards = np.zeros(3,dtype=dtype)
In [287]: newcards
Out[287]:
array([('', 0, 0.), ('', 0, 0.), ('', 0, 0.)],
dtype=[('Name', '<U10'), ('Number of uses', '<i4'), ('Card Value', '<f8')])
In [289]: newcards['Name']='foobar'
In [290]: newcards['Card Value']=np.arange(10,40,10)
In [291]: newcards
Out[291]:
array([('foobar', 0, 10.), ('foobar', 0, 20.), ('foobar', 0, 30.)],
dtype=[('Name', '<U10'), ('Number of uses', '<i4'), ('Card Value', '<f8')])
In [292]: with open('creditCards.csv','a') as f:
...: np.savetxt(f, newcards, delimiter=',', fmt=['%s' , '%d', '%f'])
...:
In [293]: cat creditCards.csv
Name,Number of Uses, Card Value
creditCard,4,200.000000
creditCard,4,200.000000
foobar,0,10.000000
foobar,0,20.000000
foobar,0,30.000000