我有这段代码,它在目录中所有电子表格的“列”中搜索“短语”,然后将匹配的日期、时间和位置输出到"output.csv“中(该位置在同一行上,但日期和时间在同一行中,从”短语“行位置向上0-7行)。我需要它能够在单元格中找到“短语”,但现在,它只适用于精确匹配。如果列20中的单元格包含"phrase one",下面的示例不会将写入输出文件。
import os
import xlrd
from xlrd import open_workbook
import datetime
from datetime import time
import csv
# edit these params
outputfile = 'output.csv'
phrase = 'phrase'
column = 20
rootdir = '.'
def writeToCSV(datalist,outputfile):
with open(outputfile, 'w') as f:
for sublist in datalist:
for item in sublist:
f.write(item + ',')
f.write('\n')
def getdata(filename,row):
# print(row)
# print(filename,'filename')
wb = open_workbook(filename)
items = []
for sheet in wb.sheets():
number_of_rows = sheet.nrows
number_of_columns = sheet.ncols
rows = []
# print(filename,' file')
for row1 in range(row,row-10, -1):
# print()
if row1 >= 0 and row1 < number_of_rows:
rowNo = sheet.cell(row1, 2).value
try :
if rowNo != '' and int(rowNo):
datetime1 = datetime.datetime(*xlrd.xldate_as_tuple(sheet.cell_value(rowx=row1, colx=0), wb.datemode))
date_values = xlrd.xldate_as_tuple(sheet.cell_value(rowx=row1, colx=1), wb.datemode)
time_value = time(*date_values[3:])
# print(time_value)
items.append(str(rowNo))
items.append(str(datetime1))
items.append(str(time_value))
# items[str(rowNo)]= str(datetime1)+'-'+str(time_value)
break
except Exception as e:
pass
# print(e)
# print(items)
return items
def extractData(filename,searchString,column):
wb = open_workbook(filename)
dataList = []
for sheet in wb.sheets():
number_of_rows = sheet.nrows
number_of_columns = sheet.ncols
items = []
rows = []
for row in range(1, number_of_rows):
rowdata = []
for col in range(number_of_columns):
value = (sheet.cell(row, col).value)
if value == searchString :
if col == column :
data = getdata(filename,row)
dataList.append(data)
# print(value)
# rowdata.append(value)
# print(len(rowdata))
return dataList
def main():
for subdir, dirs, files in os.walk(rootdir):
for file in files:
fullname =os.path.join(subdir, file)
list = subdir.split('\\')
date = ''
if len(list) > 2 :
date = list[1].split('-')[1] +'-'+ list[2]
# print(date)
# print(file)
if date != '' :
namelist = file.split('-')
if len(namelist)> 2:
if (namelist[0] in date) and (namelist[1] in date):
# print(file)
data = extractData(fullname,phrase,column)
if len(data) > 0 :
writeToCSV(data,outputfile)
if __name__ == '__main__':
main() # call main method我知道regex可以很容易地找到字符串中的子字符串,但我不知道在代码中的确切位置进行修改。在不同的语言中,或者如果代码是以不同的方式编写的,我会尝试添加一个if语句,如果字符串包含" phrase ",则该语句会将数据写入输出文件,但我无法确定代码在何处尝试限定短语是否与单元格值匹配。任何关于这方面的见解都是值得赞赏的。
发布于 2018-09-03 02:32:47
在函数extractData中,将比较设置为if value == searchString :。这就是您检查字符串value (来自您的Excel文件)是否与searchString (您的"pharse")相同的地方。您可以将其替换为Pythons searchString in value。这行代码应该类似于if searchString in value:,如果只查找子字符串,则不需要正则表达式。
发布于 2018-09-03 07:45:21
有几件事似乎引起了问题,但最主要的原因可能是您的extractData模块在特定工作表的一行中找到了搜索字符串,并且getData模块在工作簿中的所有工作表中使用同一行,而没有验证是否每个工作表都向上移动到该行。最好是传递找到搜索字符串的工作表,然后让"getData“只搜索特定的工作表。
https://stackoverflow.com/questions/52139859
复制相似问题