【发布时间】:2018-03-01 14:08:23
【问题描述】:
这项努力是美妙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
这一切都基于将其数据提供给 python 搁置的 excel 文件。这是它如何读取的一个小示例...我在主代码中将其称为“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
更新
到目前为止,我所拥有的 cmets 确实很有帮助。我认为我陷入困境的部分是将“for”循环的输出,在这种情况下为“模型”,进入“模型”列。变量 '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
【问题讨论】:
标签: python excel python-3.x pandas