2023年11月23日发(作者:)

Python学习笔记(读mdb⽂件)

⽂章⽬录

1. 读取⼀个⽂件夹⾥所有⽂件名字

① r(path)

仅当前路径下的⽂件名,不包括⼦⽬录中的⽂件

import os

s_path = r'C:UsersDesktop标准⽂件'

os.listdir(s_path)

output['', '', '', 'Users']

② ()

遍历⽂件夹下所有的⽂件,包含⼦⽬录下的⽂件。

上⾯能够满⾜需求,暂时不研究这个

2. 打开zip⽂件

import zipfile

p_file = zipfile.ZipFile('', "r")

name = p_file.namelist() #

获取⽐较⽂件列表

print(name)

p_file.extract(name[1], p_path) #

解压⽂件

p_file.close() #

关闭⽂件,必须有,释放内存

>>output: ['Users/LocalAdmin/AppData/Local/Temp//', 'Users/LocalAdmin/AppData/Local/Temp//kau2a

']

参考资料:

如果zip解压需要密码,直接运⾏下代码报错

zip_file.extract(file_name[1], path,'007') #

解压⽂件

TypeError: pwd: expected bytes, got str

改为

zip_file.extract(file_name[0], r'C:UserszxkDesktop', '007'.encode('ascii')) #

解压⽂件

3. .mdb⽂件

3.1 成功运⾏的代码

⾸先放出成功运⾏的代码:

import pypyodbc

p_path = r'C:'

connStr = 'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ='+p_path+';PWD=007'

conn = pypyodbc.win_connect_mdb(connStr) #

链接数据库

cur = conn.cursor() #

创建游标

sql = "SELECT * FROM " + 'ActualValues_T' # ActualValues_T

取表

cur.execute(sql)

alldata = cur.fetchall() # ActualValues_T

所有数据

total_rows = len(alldata)

total_cols = len(alldata[0])

print("****************Begin to process":ActualValues_T"****************")

print("":%s"总⾏数 = %d" %('ActualValues_T', total_rows))

print("":%s"总列数 = %d" %('ActualValues_T', total_cols))

print(type(alldata))

print(alldata)

conn.close() #

关闭数据库

3.2 关于win_connet_mdbconnect

看的代码有⽤win_connet_mdb,也有⽤connect,我⽤两个都成功运⾏了

⼤概是这样说的:

1)连本地Access数据库

connStr = 'Driver={Microsoft Access Driver (*.mdb)};DBQ=d:test_' #

同样是绝对路径

conn = pypyodbc.win_connect_mdb(connStr)

# win_connect_mdbconnectIM002

注意这⾥使⽤的⽅法,如果使⽤则会出错,

2)连ODBC数据库

connStr = (

r'Driver={SQL Server};'

r'Server=sqlserver;'

r'Database=testdb;'

r'UID=sa;'

r'PWD=sapassword'

)

conn = pypyodbc.connect(connStr)

作为从未接触过数据库的⼩⽩的我很是懵逼,还好代码能够成功运⾏。我要实现的⽬的是打开.mdb⽂件,我猜测属于应该采⽤

win_connect_mdb吧,在此暂时不深⼊研究这个问题。有⼤神懂⾏还望告知,感谢。

3.3 遇到的问题

在成功之前,可是花费了我三个⼩时的时间,新⼿的我可太难了

问题1:

报错:Access Driver is not found.

pypyodbc.Error: ('HY000', '[HY000] [Microsoft][ODBC Microsoft Access Driver]常见错误 ⽆法打开注册表项“Temporary (volatile) Ace DSN for process 0x255

c Thread 0x241c DBC 0x2d58008 Jet”')

这个真是⽇了够了,找了半天解决办法,最后⾃⼰发现原来是这个问题:

connStr = 'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ='+p_path+';PWD = 007' #

错误代码

connStr = 'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ='+p_path+';PWD=007' #

正确代码

知道真相的我眼泪掉下来

成功运⾏的结果:

SELECT * FROM ActualValues_T

****************Begin to process":ActualValues_T"****************

":ActualValues_T"总⾏数 = 43580

":ActualValues_T"总列数 = 4

<class 'list'>

[(18, 16, 0, '0'), (18, 17, 0, '0'),后⾯省略了]

3.4 补充SQL

代码中有这样的⼀句

sql = "SELECT * FROM " + 'ActualValues_T' # ActualValues_T

取表

这是SQL语句,表⽰从ActualValues_T表中取出*(*表⽰全部列)

在实际情况中,由于科学计数达到了10的34次⽅,获取数据时其⾃动转化float时报错

sql could not convert string to float: b'E+6'

因此,相同将某该列转化成字符形式,使得获取数据时以字符形式,即不在由科学计数转成float,填下下⾯语句实现

cur.execute("ALTER TABLE ParamValues_T ALTER COLUMN maxValue varchar(20)") # ParamValues_TmaxValuevar

中的转化成

# ALTER TABLE ‘’ ALTER COLUMN ‘’ varchar(20)

⽤法:表名列名

SQL相关语法问题可学习上链接。

3.5 取到的数据转dataframe

fetchall() 取到的结果是list数据类型 ,列表⾥每个元素是个元组,例如我取到的数据⼤概是这样的:

[(2161, 24, '00-11-K1U1G11810R08SK-1', 111), (2153, 24, '00-1-K1U1G11810R08SK-1', 101), ...]

直接⽤:

>>> a = [(2161, 24, '00-11-K1U1G11810R08SK-1', 111), (2153, 24, '00-1-K1U1G11810R08SK-1', 101)]

>>> a

[(2161, 24, '00-11-K1U1G11810R08SK-1', 111), (2153, 24, '00-1-K1U1G11810R08SK-1', 101)]

>>> import pandas as pd

>>> b=pd.DataFrame(a)

>>> b

0 1 2 3

0 2161 24 00-11-K1U1G11810R08SK-1 111

1 2153 24 00-1-K1U1G11810R08SK-1 101

4. 创建空的⽂件夹

import os

os.mkdir(output_path)

5. 创建空的excel

import xlsxwriter

xls = xlsxwriter.Workbook(path+""+'输出.xlsx')

xls.close()

OR

>>> import pandas as pd

>>> writer = pd.ExcelWriter(r'C:')

>>> pd.DataFrame().to_excel(writer)

>>> writer.save()

>>> writer.close()

6. list dataframe

>>> import pandas as pd

>>> a=[[1,2,3],[4,5,6]]

>>> pd.DataFrame(a,columns = ['a','b','c'])

a b c

0 1 2 3

1 4 5 6