这项努力是对精彩Mac Model Shelf的改变。到目前为止,我已经设法自己编写代码,可以在命令行中读取单个Mac序列号,并根据序列中的最后3个或4个字符返回相应的模型类型。
立即写入我正在尝试编写一个脚本来读入Excel文件中的列数据,并返回相邻列中每个单元格的结果。
输出Excel有望看起来像这样(带标题)......
Serial Model
C12PT70EG8WP Macbook Pro 2015 15" 2.5 Ghz i7
K12PT7EG0PW iMac 2010 Intel Core Duo 1.6 Ghz
这都是基于excel文件,它将数据提供给python shelve。以下是它如何读取的一个小例子...我在主代码中称它为“pgList.xlsx”。实际上它将长达数百行。
G8WP Macbook Pro 2015 15" 2.5 Ghz i7
0PW iMac 2010 Intel Core Duo 1.6 Ghz
3RT iPad Pro 2017
主要python3代码......
import shelve
import pandas as pd
#getting the shelve/database ready from the library excel file
DBPATH = "/Users/me/PycharmProjects/shelve/macmodelshelfNEW"
databaseOfMacs = shelve.open(DBPATH)
excelDict = pd.read_excel('pgList.xlsx', header=None, index_col=0,squeeze=True).to_dict()
databaseOfMacs.update(excelDict)
#loading up the excel file and serial numbers I want to examine...
df = pd.read_excel('testSerials.xlsx', sheet_name='Sheet1')
listSerials = df['Serial']
listModels = df['Model']
for i in listSerials:
inputSerial = i
inputSerial = inputSerial.upper()
modelCodeIsolatedFromSerial = ""
if len(inputSerial) == 12:
modelCodeIsolatedFromSerial = inputSerial[-4:]
elif len(inputSerial) == 11:
modelCodeIsolatedFromSerial = inputSerial[-3:]
try:
model = databaseOfMacs[modelCodeIsolatedFromSerial]
#printing to console to check code works
print(model)
except:
print("Result not found")
databaseOfMacs.clear()
databaseOfMacs.close()
你们可以帮我把结果写回同一个excel文件吗?例如,如果序列号在单元格A2中,结果(模型类型)将写入B2?
我尝试在代码中的主要'for'循环之前包含这行代码,但它只用于在运行脚本后将Excel文件清空!我暂时评论一下。
writer = pd.ExcelWriter('testSerials.xlsx', engine='xlsxwriter')
您是否也可以帮我处理序列栏中任何可能的空白单元格? 空白会抛出此错误。
AttributeError: 'float' object has no attribute 'upper'
再次感谢您照顾我!
WL
更新
我到目前为止的评论确实有帮助。我认为我陷入困境的部分是获取'for'循环的输出,在这种情况下'model'进入'Models'的列。变量'listModels'似乎与Python 3中的其他列表不同,即我无法向它添加任何内容。
更新2
进一步修改,尝试将“Serial”列中值的序列号查找结果导入“Model”列。
我尝试过(没有任何真正的成功)
try:
model = databaseOfMacs[modelCodeIsolatedFromSerial]
print(model)
listModels.replace(['nan'], [model], inplace=True)
这不会给我一条错误信息,但输出的excel文件中仍然没有任何内容。
当我运行for循环来打印'listModels'的内容时,我只是回复了一个“NaN”列表,建议什么都没有改变......真糟糕!
我也试过
try:
model = databaseOfMacs[modelCodeIsolatedFromSerial]
print(model)
listModels[i] = model
这会吐出关于
的控制台错误A value is trying to be set on a copy of a slice from a DataFrame
但是当我遍历'listModels'时,至少我可以在控制台中看到与序列号相关的型号名称,但输出的Excel文件中仍然没有(对于每个被检查的序列号都有'nan')? )
我确信我在代码中缺少一些小东西来解决这个问题。再次感谢任何可以帮助我的人。
更新3
我自己解决了这个问题。只需使用while循环。
sizeOfSerialsList = len(listSerials)
count = 0
while (count < sizeOfSerialsList):
inputSerial = listSerials.iloc[count]
inputSerial = str(inputSerial).upper()
modelCodeIsolatedFromSerial = ""
model = ""
if len(inputSerial) == 12:
modelCodeIsolatedFromSerial = inputSerial[-4:]
elif len(inputSerial) == 11:
modelCodeIsolatedFromSerial = inputSerial[-3:]
try:
model = databaseOfMacs[modelCodeIsolatedFromSerial]
listModels.iloc[count] = model
except:
listModels.iloc[count] = "Not found"
count = count + 1
答案 0 :(得分:0)
从XlsxWriter docs开始,您需要拨打df.to_excel(writer)
,然后拨打writer.save()
。
为了避免这个AttributeError,一个修复(可能不是最多的python-3-esque?)是将inputSerial = inputSerial.upper()
更改为inputSerial = str(inputSerial).upper()
。
答案 1 :(得分:0)
有关解决问题的代码,请参阅更新3