使用Python将文本文件导入Access 2003数据库

时间:2014-08-26 16:31:12

标签: python database ms-access import pyodbc

我尝试使用我正在处理的Python 3.4应用程序将管道分隔的文本文件导入到具有现有表的访问数据库中,但我遇到了一些问题。

应用程序将用于导入不同的文本文件,因此我使用条目小部件写入文件名,我希望输入的文件内容能够加载到我的表中。我尝试将文件加载到刚刚使用访问的能够,它工作正常,所以格式应该是好的。以下是我为我的功能尝试过的一些代码无效。

def insert_data():
inputfile = filepath.get()
fobj = open(inputfile)

cur.execute("""SELECT * INTO text_file_data
            FROM [odbc;Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq='{fobj}';];)"""
            .format(fobj=fobj))
conn.commit()

给出以下内容:

Tkinter回调中的异常 Traceback(最近一次调用最后一次):   文件" C:\ Python34 \ lib \ tkinter__init __。py",第1487行,调用     return self.func( args)   文件" C:/ Users / amarquart / PycharmProjects / Database Testing / Source / DBTesting.py",第267行,运行中     insert_data()   文件" C:/ Users / amarquart / PycharmProjects / Database Testing / Source / DBTesting.py",第25行,在insert_data中     .format(fobj = fobj)) KeyError:' Microsoft文本驱动程序('

def insert_data():
inputfile = filepath.get()
fobj = open(inputfile)

cur.execute("""SELECT * INTO text_file_data
                FROM [Text;HDR=Yes;FMT=Delimited;Database=C:\Users\amarquart\Documents\functionDB.mdb].;{fobj}')"""
                .format(fobj=fobj))
conn.commit()   

给出以下内容:

文件" C:/ Users / amarquart / PycharmProjects / Database Testing / Source / DBTesting.py",第24行     FROM [Text; HDR = Yes; FMT = Delimited; Database = C:\ Users \ amarquart \ Documents \ functionDB.mdb] .; {fobj}')""" SyntaxError :( unicode error)' unicodeescape'编解码器无法解码位置93-94中的字节:截断\ UXXXXXXXX转义

其他相关信息

数据库文件路径:C:\ Alex \ functionDB.mdb

与fobj变量一起使用的文件路径:C:\ Users \ amarquart \ Documents \ 5.txt

表名:text_file_data

使用pyodbc进行连接

非常感谢任何帮助。

谢谢,

亚历

EDIT 我的文本文件没有标题,其中的一个示例发布在

下面

d | 1 | 502 | 2013 | 073306586 | 479.18

最新的尝试:

def insert_data():
inputfile = filepath.get()
fobj = open(inputfile)

cur.execute("""INSERT INTO text_file_data (Letter, [Number], Batch, [Year], Parcel, Amount)
         VALUES ([Text;FMT=Delimited(|);HDR=NO;DATABASE=C:\Alex\functionDB.mdb].
         ['{fobj}')]""").format(fobj=fobj)

conn.commit()

给我以下内容:

Tkinter回调中的异常 Traceback(最近一次调用最后一次):   文件" C:\ Python34 \ lib \ tkinter__init __。py",第1487行,调用     return self.func(* args)   文件" C:/ Users / amarquart / PycharmProjects / Database Testing / Source / DBTesting.py",第269行,运行中     insert_data()   文件" C:/ Users / amarquart / PycharmProjects / Database Testing / Source / DBTesting.py",第26行,在insert_data中     [' {fobj}&#39)]""")格式(fobj = fobj) pyodbc.Error:(' 21S01',' [21S01] [Microsoft] [ODBC Microsoft Access Driver]查询值和目标字段的数量不相同。( - 3520)(SQLExecDirectW)& #39)

EDIT GOT IT

这与我在互联网上找到的所有内容不同,但它有效。它将文本文件中的所有数据都存入数据库,数据的顺序不一样,但这并不重要。

def insert_data():
inputfile = filepath.get()
fobj = open(inputfile)
for line in fobj:
    column = line.split('|')
    a = str(column[0])
    b = int(column[1])
    c = int(column[2])
    d = str(column[3])
    e = str(column[4])
    f = Decimal(column[5])

    cur.execute('''INSERT INTO text_file_data ([Letter], [Number], [Batch], [Year], [Parcel], [Amount])
         VALUES ('{a}', '{b}', '{c}', '{d}', '{e}', '{f}')'''.format(a=a, b=b, c=c, d=d, e=e, f=f))

conn.commit()

编辑,再来一次

def insert_data():
inputfile = filepath.get()

qry = """INSERT INTO text_file_data ([Letter], [Number], [Batch], [Year], [Parcel], [Amount])
VALUES (?,?,?,?,?,?)"""

with open(inputfile) as pipeFile:
    for line in pipeFile:
        cur.execute(qry, line.split("|"))
conn.commit()

这也有效,可能更好吗?

感谢大家的帮助!

2 个答案:

答案 0 :(得分:1)

使用Python 2.7和pypyodbc,我得到了这样的工作......

# -*- coding: utf-8 -*-
import os
import pypyodbc

workingFolder = "C:\\Users\\Gord\\Desktop\\"
pipeFileName = "stuff.txt"
commaFileName = "stuff.csv"

with open (workingFolder + pipeFileName, "r") as pipeFile:
    data = pipeFile.read()
with open (workingFolder + commaFileName, "w") as commaFile:
    commaFile.write(data.replace("|",","))

connStr = (
    r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};' +
    r'DBQ=C:\Users\Public\Database1.accdb'
    )
db = pypyodbc.connect(connStr)

qry = """INSERT INTO text_file_data ([Letter], [Number], [Batch], [Year], [Parcel], [Amount]) 
    SELECT F1, F2, F3, F4, F5, F6 
    FROM [Text;FMT=Delimited;HDR=NO;IMEX=2;CharacterSet=437;Database="""
qry += workingFolder + "].[" + commaFileName.replace(".","#") + "]"

crsr = db.cursor()
crsr.execute(qry)
db.commit()
db.close()

os.remove(workingFolder + commaFileName)

...但它从[Parcel]字段中删除了前导零。这看起来效果更好(不确定速度):

# -*- coding: utf-8 -*-
import pypyodbc

connStr = (
    r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};' +
    r'DBQ=C:\Users\Public\Database1.accdb'
    )
db = pypyodbc.connect(connStr)

qry = """INSERT INTO text_file_data ([Letter], [Number], [Batch], [Year], [Parcel], [Amount]) 
    VALUES (?,?,?,?,?,?)"""

crsr = db.cursor()
with open (r"C:\Users\Gord\Desktop\stuff.txt", "r") as pipeFile:
    for line in pipeFile:
        crsr.execute(qry, line.split("|"))
db.commit()
db.close()

答案 1 :(得分:0)

这就是为我做的事情

def insert_data():
inputfile = filepath.get()

qry = """INSERT INTO text_file_data ([Letter], [Number], [Batch], [Year], [Parcel], 
[Amount])
VALUES (?,?,?,?,?,?)"""

with open(inputfile) as pipeFile:
for line in pipeFile:
    cur.execute(qry, line.split("|"))
conn.commit()

谢谢大家!