parsing.log文件,然后按访问进行sorting

我正在写一个parsing程序,在一些关键字后search超过100个.log文件,然后将这些单词放在不同的数组中,并将这些单词分隔到excel中的列中。 现在我想在Access中自动sorting,这样我就可以处理不同的.log文件组合。 我可以从我的Excel文件复制粘贴到Access,但效率低下,出现一些错误…我希望它是“自动”的。 我是新来的Access和不知道如何链接从Python到Access,我已经尝试做,因为我做了Excel,但没有工作,并开始寻findOBDC,但有一些问题在那里…

import glob # includes import xlwt # includes from os import listdir # includes from os.path import isfile, join # includes def logfile(filename, tester, createdate,completeresponse): # Arrays for strings response = [] message = [] test = [] date = [] with open(filename) as filesearch: # open search file filesearch = filesearch.readlines() # read file for line in filesearch: file = filename[39:] # extract filename [file] for lines in filesearch: if createdate in lines: # extract "Create Time" {date} date.append(lines[15:34]) if completeresponse in lines: response.append(lines[19:]) print('pending...') i = 1 # set a number on log {i} d = {} for name in filename: if not d.get(name, False): d[name] = i i += 1 if tester in line: start = '-> ' end = ':\ ' # |<----------->| number = line[line.find(start)+3: line.find(end)] #Tester -> 1631 22 F1 2E :\ BCM_APP_31381140 AJ \ Read Data By Identifier \ test.append(number) # extract tester {test} # |<-------------------------------------------- text = line[line.find(end)+3:] # Tester -> 1631 22 F1 2E :\ BCM_APP_31381140 AJ \ Read Data By Identifier \ message.append(text) with open('Excel.txt', 'a') as handler: # create .txt file for i in range(len(message)): # ABCDE handler.write(f"{file}|{date[i]}|{i}|{test[i]}|{response[i]}") # A = filename B = create time C = number in file D = tester E = Complete response # open with 'w' to "reset" the file. with open('Excel.txt', 'w') as file_handler: pass # --------------------------------------------------------------------------------- for filename in glob.glob(r'C:\Users\Desktop\Access\*.log'): logfile(filename, 'Sending Request: Tester ->', 'Create Time:','Complete Response:','Channel') def if_number(s): # look if number or float try: float(s) return True except ValueError: return False # ---------------------------------------------- my_path = r"C:\Users\Desktop\Access" # directory # search directory for .txt files text_files = [join(my_path, f) for f in listdir(my_path) if isfile(join(my_path, f)) and '.txt' in f] for text_file in text_files: # loop and open .txt document with open(text_file, 'r+') as wordlist: string = [] # array ot the saved string for word in wordlist: string.append(word.split('|')) # put word to string array column_list = zip(*string) # make list of all string workbook = xlwt.Workbook() worksheet = workbook.add_sheet('Tab') worksheet.col(0) # construct cell first_col = worksheet.col(0) first_col.width = 256*50 second_col = worksheet.col(1) second_col.width = 256*25 third_col = worksheet.col(2) third_col.width = 256*10 fourth_col = worksheet.col(3) fourth_col.width = 256*50 fifth_col = worksheet.col(4) fifth_col.width = 256*100 i = 0 # choose column 0 = A, 3 = C etc for column in column_list: for item in range(len(column)): value = column[item].strip() if if_number(value): worksheet.write(item, i, float(value)) # text / float else: worksheet.write(item, i, value) # number / int i += 1 print('File:', text_files, 'Done') workbook.save(text_file.replace('.txt', '.xls')) 

在这里输入图像说明

有没有办法自动化“复制粘贴”命令,如果是这样,看起来像和工作? 如果那是不能做的事情,一些build议会帮助很多!

编辑

感谢您使用Googlesearch,谢谢您的帮助! 但现在我得到一个错误…我仍然不能将信息发送到Access文件,我得到一个语法错误。 我知道这是存在的,因为我想要升级现有的文件…有没有一个命令来“升级一个存在的访问文件”?

错误

 pyodbc.ProgrammingError: ('42S01', "[42S01] [Microsoft][ODBC Microsoft Access Driver] Table 'tblLogfile' already exists. (-1303) (SQLExecDirectW)") 

 import pyodbc UDC = r'C:\Users\Documents\Access\UDC.accdb' # DSN Connection constr = " DSN=MS Access Database; DBQ={0};".format(UDC) # DRIVER connection constr = "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};UID=admin;UserCommitSync=Yes;Threads=3;SafeTransactions=0;PageTimeout=5;MaxScanRows=8;MaxBufferSize=2048;FIL={MS Access};DriverId=25;DefaultDir=C:/USERS/DOCUMENTS/ACCESS;DBQ=C:/USERS/DOCUMENTS/ACCESS/UDC.accdb" # Connect to database UDC and open cursor db = pyodbc.connect(constr) cursor = db.cursor() sql = "SELECT * INTO [tblLogfile]" +\ "FROM [Excel 8.0;HDR=YES;Database=C:/Users/Documents/Access/Excel.xls.[Tab];" cursor.execute(sql) db.commit() cursor.close() db.close() 

首先请注意,MS Access是一个数据库pipe理系统,不是电子表格应用程序MS Excel。 访问位于关系引擎之上,并在数据和关系完整性方面保持严格的规则,而在Excel中,任何可以在没有规则的单元或单元格范围内编写任何东西。 此外,Access对象库(tabledefs,querydefs,表单,报表,macros,模块)与Excel对象库(工作簿,工作表,范围,单元格等)有很大的不同,所以没有一对一的转换在代码中。

具体而言,对于您的Python项目,请考虑使用运行到Excel工作簿的直接连接的生成表查询的pyodbc 。 由于MS Access的数据库是ACE / JET引擎(无论Access安装在Windows机器上都可以使用Windows的.dll文件)。 这个数据存储的一个特点是能够连接到工作簿甚至文本文件! 所以真的,MSAccess.exe只是一个GUI控制台来查看.mdb / .accdb文件。

下面创build一个新的数据库表,复制特定的工作簿工作表数据,假设工作表维护:

  1. A1单元格开始的表格格式(没有合并单元格/重复标签)
  2. 顶行中的标题(前后无空格或特殊字符!#$%^~<>))
  3. 一致的数据types格式的列(即数据完整性规则)

Python代码

 import pyodbc databasename = 'C:\\Path\\To\\Database\\File.accdb' # DSN Connection constr = "DSN=MS Access Database;DBQ={0};".format(databasename) # DRIVER CONNECTION constr = "DRIVER={{Microsoft Access Driver (*.mdb, *.accdb)}};DBQ={0};".format(databasename) # CONNECT TO DATABASE AND OPEN CURSOR db = pyodbc.connect(constr) cur = db.cursor() # RUN MAKE-TABLE QUERY FROM EXCEL WORKBOOK SOURCE # OLDER EXCEL FORMAT sql = "SELECT * INTO [myNewTable]" + \ " FROM [Excel 8.0;HDR=Yes;Database=C:\Path\To\Workbook.xls].[SheetName$];" # CURRENT EXCEL FORMAT sql = "SELECT * INTO [myNewTable]" + \ " FROM [Excel 12.0 Xml;HDR=Yes;Database=C:\Path\To\Workbook.xlsx].[SheetName$];" cursor.execute(sql) db.commit() cur.close() db.close() 

几乎可以肯定,从上述Parfait的答案是一个更好的方式去,但为了好玩,我会留下我的答案


如果你愿意投入时间,我认为你需要3件事来完成你想要做的事情的自动化:

1)将数据的string表示发送到Windows剪贴板
有特定的窗口代码,或者你可以节省一些时间,并使用pyperclip

2)学习VBA并使用VBA从剪贴板中获取string并处理它。 这里有一些示例VBA代码,我用Excel来抓取剪贴板中的文本

 Function GetTextFromClipBoard() As String Dim MSForms_DataObject As New MSForms.DataObject MSForms_DataObject.GetFromClipboard GetTextFromClipBoard = MSForms_DataObject.GetText() End Function 

3)使用pywin32 (我相信Anaconda很容易获得)来自动化Python的vba访问调用。 这可能是最难的部分,因为具体的呼叫树(在我看来)没有很好的文档logging,需要大量的戳和挖掘,以确定你需要做什么。 至less可以说是痛苦的,但是使用IPython来帮助你提供pywin32对象可用的方法。

当我看上面的指令,我意识到它也可能跳过剪贴板,只是直接从python发送信息通过pywin32访问。 但是,如果您执行剪贴板路由,则可以打开这些步骤。

  1. 发送一个数据集到剪贴板
  2. 使用Access中的VBA编辑器来抓取和处理数据
  3. 在找出1和2之后,使用pywin32填补空白

祝你好运,也许写一个博客文章,如果你想出来分享的细节。