Python学习笔记(读mdb文件)

文章目录

  • 1. 读取一个文件夹里所有文件名字
  • 2. 打开zip文件
  • 3. 读.mdb文件
    • 3.1 成功运行的代码
    • 3.2 关于win_connet_mdb与connect
    • 3.3 遇到的问题
    • 3.4 补充SQL
    • 3.5 取到的数据转dataframe
  • 4. 创建空的文件夹
  • 5. 创建空的excel
  • 6. list 转 dataframe

1. 读取一个文件夹里所有文件名字

① os.listdir(path)
仅当前路径下的文件名,不包括子目录中的文件

import os s_path = r'C:\Users\Desktop\标准文件' os.listdir(s_path) output:['1.zip', '2.zip', '3.zip', 'Users']

  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

② os.walk()
遍历文件夹下所有的文件,包含子目录下的文件。
上面能够满足需求,暂时不研究这个

2. 打开zip文件

import zipfile
p_file = zipfile.ZipFile('1.zip', 'r')
name = p_file.namelist()  # 获取比较文件列表
print(name)
p_file.extract(name[1], p_path)  # 解压文件
p_file.close()  # 关闭文件,必须有,释放内存
>>output: ['Users/LocalAdmin/AppData/Local/Temp/kau2a2212905r02sk-1.zip/', 'Users/LocalAdmin/AppData/Local/Temp/kau2a2212905r02sk-1.zip/kau2a2212905r02sk-1.mdb']
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

参考资料:使用Python解压zip、rar文件
如果zip解压需要密码,直接运行下代码报错

zip_file.extract(file_name[1], path,'007') # 解压文件 TypeError: pwd: expected bytes, got str

  • 1
  • 2
  • 1
  • 2

改为

zip_file.extract(file_name[0], r'C:\Users\zxk\Desktop', '007'.encode('ascii'))  # 解压文件
  • 1
  • 1

参考:https://blog.csdn.net/qq_28840013/article/details/84075336

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 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() # 关闭数据库

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

3.2 关于win_connet_mdb与connect

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

https://www.jianshu.com/p/00b53a386c2a 这篇博客里提到

大概是这样说的:
1)连本地Access数据库

connStr = 'Driver={Microsoft Access Driver (*.mdb)};DBQ=d:\\test_db.mdb' #同样是绝对路径
conn = pypyodbc.win_connect_mdb(connStr)
# 注意这里使用的win_connect_mdb方法,如果使用connect则会出错,IM002
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

2)连ODBC数据库

connStr = ( r'Driver={SQL Server};' r'Server=sqlserver;' r'Database=testdb;' r'UID=sa;' r'PWD=sapassword' ) conn = pypyodbc.connect(connStr)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

作为从未接触过数据库的小白的我很是懵逼,还好代码能够成功运行。我要实现的目的是打开.mdb文件,我猜测属于应该采用win_connect_mdb吧,在此暂时不深入研究这个问题。有大神懂行还望告知,感谢。

3.3 遇到的问题

在成功之前,可是花费了我三个小时的时间,新手的我可太难了
问题1:

报错:Access Driver is not found.
  • 1
  • 1

解决方案:https://blog.csdn.net/victor111222/article/details/94598726
问题2:

pypyodbc.Error: ('HY000', '[HY000] [Microsoft][ODBC Microsoft Access Driver]常见错误 无法打开注册表项“Temporary (volatile) Ace DSN for process 0x255c Thread 0x241c DBC 0x2d58008 Jet”。')

  • 1
  • 1

这个真是日了够了,找了半天解决办法,最后自己发现原来是这个问题:

connStr = 'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ='+p_path+';PWD = 007'  #错误代码
connStr = 'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ='+p_path+';PWD=007' #正确代码
  • 1
  • 2
  • 1
  • 2

知道真相的我眼泪掉下来
成功运行的结果:

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'),后面省略了]

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

参考链接:
https://www.jianshu.com/p/00b53a386c2a
https://www.cnblogs.com/Cong0ks/p/11039889.html
https://blog.csdn.net/LIYUANNIAN/article/details/82937350
https://www.jianshu.com/p/00b53a386c2a

3.4 补充SQL

代码中有这样的一句

sql = 'SELECT * FROM ' + 'ActualValues_T'  # 取表 ActualValues_T
  • 1
  • 1

这是SQL语句,表示从ActualValues_T表中取出*(*表示全部列)
在实际情况中,由于科学计数达到了10的34次方,获取数据时其自动转化float时报错

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

  • 1
  • 1

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

cur.execute('ALTER TABLE ParamValues_T ALTER COLUMN maxValue varchar(20)')  # ParamValues_T中的maxValue转化成var
# 用法:ALTER TABLE '表名’ ALTER COLUMN '列名’ varchar(20)
  • 1
  • 2
  • 1
  • 2

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

3.5 取到的数据转dataframe

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

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

  • 1
  • 1

直接用:

>>> 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

4. 创建空的文件夹

import os os.mkdir(output_path)

  • 1
  • 2
  • 1
  • 2

5. 创建空的excel

import xlsxwriter
xls = xlsxwriter.Workbook(path+'\\'+'输出.xlsx')
xls.close()
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

OR

>>> import pandas as pd >>> writer = pd.ExcelWriter(r'C:\Users\zxk\Desktop\blankexcel.xlsx') >>> pd.DataFrame().to_excel(writer) >>> writer.save() >>> writer.close()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
(0)

相关推荐