Python学习笔记(读mdb⽂件)
⽂章⽬录
1. 读取⼀个⽂件夹⾥所有⽂件名字
① os.listdir(path)
仅当前路径下的⽂件名,不包括⼦⽬录中的⽂件
import os
s_path = r'C:\Users\Desktop\标准⽂件'
os.listdir(s_path)
output:['1.zip','2.zip','3.zip','Users']
② os.walk()
遍历⽂件夹下所有的⽂件,包含⼦⽬录下的⽂件。
上⾯能够满⾜需求,暂时不研究这个
2. 打开zip⽂件
import zipfile
p_file = zipfile.ZipFile('1.zip',"r")
name = p_file.namelist()# 获取⽐较⽂件列表
print(name)
act(name[1], p_path)# 解压⽂件
p_file.close()# 关闭⽂件,必须有,释放内存
>>output:['Users/LocalAdmin/AppData/Local/Temp/kau2a2212905r02sk-1.zip/','Users/LocalAdmin/AppData/Local/Temp/kau2a2212905r02sk-1.zip/kau2a 2212905r02sk-1.mdb']
参考资料:
如果zip解压需要密码,直接运⾏下代码报错
act(file_name[1], path,'007')# 解压⽂件
TypeError: pwd: expected bytes, got str
改为
act(file_name[0], r'C:\Users\zxk\Desktop','007'.encode('ascii'))# 解压⽂件
3. 读.mdb⽂件
3.1 成功运⾏的代码
⾸先放出成功运⾏的代码:
import pypyodbc
p_path = r'C:\Users\kau2a2122900r01sk-1.mdb'
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
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_mdb与connect
看的代码有⽤win_connet_mdb,也有⽤connect,我⽤两个都成功运⾏了
⼤概是这样说的:
1)连本地Access数据库
connStr ='Driver={Microsoft Access Driver (*.mdb)};DBQ=d:\\test_db.mdb'#同样是绝对路径
conn = pypyodbc.win_connect_mdb(connStr)
# 注意这⾥使⽤的win_connect_mdb⽅法,如果使⽤connect则会出错,IM002
2)连ODBC数据库
connStr =(
r'Driver={SQL Server};'
r'Server=sqlserver;'
r'Database=testdb;'
r'UID=sa;'
r'PWD=sapassword'
)
conn = t(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,填
下下⾯语句实现ute("ALTER TABLE ParamValues_T ALTER COLUMN maxValue varchar(20)")# ParamValues_T中的maxValue转化成var # ⽤法:ALTER TABLE ‘表名’ ALTER COLUMN ‘列名’ varchar(20)
python怎么读的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
0123
021612400-11-K1U1G11810R08SK-1111
121532400-1-K1U1G11810R08SK-1101
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:\Users\zxk\Desktop\blankexcel.xlsx')
>>> 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
0123
1456

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。