问题描述
我正在编写此脚本以在 Excel 工作表中搜索一个数字,然后复制与该数字关联的整行,然后将其粘贴到一个新的 Excel 工作表中。 我想一行一行地复制相同的数据,就像我执行程序并保存它一样。 我试图通过在这个社区中搜索类似的问题,通过多种方式找出解决方案,但它不起作用。 下面是代码。
import xlsxwriter
import xlrd
import xlwt
import math
def open_file(path):
wb = xlrd.open_workbook(path)
sheet = wb.sheet_by_index(0)
for row_num in range(sheet.nrows):
row_value = sheet.row_values(row_num)
if row_value[2] == 68860:
row = 0
col = 0
wbk = xlsxwriter.Workbook('or.xlsx')
ws = wbk.add_worksheet()
ws.write('A1', row_value[0])
ws.write('B1', row_value[1])
ws.write('C1', row_value[2])
row = row + 1
wbk.close()
if __name__ == "__main__":
path = "ord.xlsx"
open_file(path)
任何建议,我将不胜感激。
编辑版本:我解决了我面临的问题。 现在,即使 .csv 文件已经打开,我也找不到防止中断串行端口连接的解决方案。 这里是对主要背景的解释。
实际上,最初的想法是通过扫描包含该特定号码的二维码来搜索该号码,如果找到该号码,则将信息写入新文件。 我通过将其写入 .csv 文件而不是 Xlsx 文件解决了这个问题。 现在一切正常,除了一个我无法破解的问题。 我已经通过串口连接了我的扫描仪。 会有很多用户随时打开和访问这个 .csv 文件。 当程序运行并关闭文件时,扫描部分工作正常。 但是当文件打开并且有人扫描任何二维码时,肯定会给出.csv文件打开的错误,并且整个程序会崩溃,我们必须一次又一次地运行它。 有没有可能如何防止程序爆发并即使文件打开也继续? 下面是我的代码。
if(ser.isOpen()):
ser.flushInput()
ser.flushOutput()
while(1):
y = ser.readline().decode("ASCII")
if (str(y)!=''):
if (str(y)!='\r'):
if (str(y)!='\n'):
print(y)
for row_num in range(sheet.nrows):
row_value = sheet.row_values(row_num)
if int(y) == int(row_value[0]):
if re.match("(11\d+)", row_value[0]) is not None:
file = open('Function.csv', 'a')
file.write(str(row_value[0])+";"+str(row_value[1])+"\n")
file.close()
ser.close()
1楼
您的代码中有一个但是。 每次您找到该值(并且它们可能是具有该值的多行,对吗?),您将写入新工作表。
如果您在循环之前打开目标工作簿,并跟踪您应该在旁边写入的行,则会将所有这些值放入单个工作表中。
像这个使用字符串插值的片段:
def open_file(path):
row_in_output = 1
wbk = xlsxwriter.Workbook('or.xlsx')
ws = wbk.add_worksheet()
[...]
ws.write("A{row_in_output}", row_value[0])
ws.write("B{row_in_output}", row_value[1])
ws.write("C{row_in_output}", row_value[2])
row = row + 1
row_in_output = row_in_output + 1
wbk.close()
PS 我正在使用 Python 3.6 插值语法。 如果您使用较旧的 Python,请相应地进行调整。