使用Python导入文本文件以访问2003数据库

使用Python导入文本文件以访问2003数据库,python,database,ms-access,import,pyodbc,Python,Database,Ms Access,Import,Pyodbc,我正试图使用我正在使用的Python 3.4应用程序将管道分隔的文本文件导入到access数据库和现有表中,但遇到了一些问题 该应用程序将用于导入不同的文本文件,因此我使用一个条目小部件写入文件名,并希望将输入的文件内容加载到我的表中。我试着使用access将文件加载到able中,效果很好,所以格式应该很好。下面是一些代码,我尝试了我的功能,但没有用 def insert_data(): inputfile = filepath.get() fobj = open(inputfile) cur

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

该应用程序将用于导入不同的文本文件,因此我使用一个条目小部件写入文件名,并希望将输入的文件内容加载到我的表中。我试着使用access将文件加载到able中,效果很好,所以格式应该很好。下面是一些代码,我尝试了我的功能,但没有用

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回调中的异常 回溯(最近一次呼叫最后一次): 文件“C:\Python34\lib\tkinter\uuuu init\uuuuuu.py”,第1487行,在调用中 返回self.func(参数) 文件“C:/Users/amarquart/PycharmProjects/Database Testing/Source/DBTesting.py”,第267行,正在运行 插入_数据() 文件“C:/Users/amarquart/PycharmProjects/Database Testing/Source/DBTesting.py”,第25行,插入_数据 .格式(fobj=fobj)) KeyError:“Microsoft文本驱动程序('

提供以下信息:

文件“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错误)'UnicodeScape'编解码器无法解码93-94位置的字节:截断\uxxxxx转义

其他相关信息

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

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

表名称:文本文件数据

使用pyodbc进行连接

任何帮助都将不胜感激

谢谢

亚历克斯

编辑 我的文本文件没有标题,下面是一个例子

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回调中的异常 回溯(最近一次呼叫最后一次): 文件“C:\Python34\lib\tkinter\uuuu init\uuuuuu.py”,第1487行,在调用中 返回self.func(*args) 文件“C:/Users/amarquart/PycharmProjects/Database Testing/Source/DBTesting.py”,第269行,正在运行 插入_数据() 文件“C:/Users/amarquart/PycharmProjects/Database Testing/Source/DBTesting.py”,第26行,插入数据 ['{fobj}')]''”。格式(fobj=fobj) pyodbc.Error:('21S01'、'[21S01][Microsoft][ODBC-Microsoft-Access-Driver]查询值和目标字段的数目不相同。(-3520)(SQLExecDirectW))

编辑 明白了

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

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()
这也有效,而且可能更好


谢谢大家的帮助

在使用Python2.7和PyODBC时,我得到了这样的结果

#-*-编码:utf-8-*-
导入操作系统
导入PyODBC
workingFolder=“C:\\Users\\Gord\\Desktop\”
pipeFileName=“stuff.txt”
commaFileName=“stuff.csv”
打开(工作文件夹+管道文件名,“r”)作为管道文件:
data=pipeFile.read()
打开(工作文件夹+commaFileName,“w”)作为commaFile:
commaFile.write(data.replace(“|”,“,”))
connStr=(
r'DRIVER={Microsoft Access驱动程序(*.mdb,*.accdb)};'+
r'DBQ=C:\Users\Public\Database1.accdb'
)
db=pyodbc.connect(connStr)
qry=“”插入文本文件数据([字母]、[编号]、[批次]、[年份]、[包裹]、[金额])
选择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.执行(qry)
db.commit()
db.close()
删除操作系统(工作文件夹+commaFileName)
。。。但它从[Parcel]字段中去掉了前导零。这似乎效果更好(但不确定速度):

#-*-编码:utf-8-*-
导入PyODBC
connStr=(
r'DRIVER={Microsoft Access驱动程序(*.mdb,*.accdb)};'+
r'DBQ=C:\Users\Public\Database1.accdb'
)
db=pyodbc.connect(connStr)
qry=“”插入文本文件数据([字母]、[编号]、[批次]、[年份]、[包裹]、[金额])
值(?,,,,,,,,?)“”“
crsr=db.cursor()
打开(r“C:\Users\Gord\Desktop\stuff.txt”,“r”)作为管道文件:
对于管道文件中的行:
crsr.execute(qry,行分割(“|”))
db.commit()
db.close()

这就是我所做的

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()

谢谢大家

我不理解您查询的
行中的
。例如:
FROM[Text;HDR=Yes;FMT=Delimited;Database=C:\Users\amarquart\Documents\functionDB.mdb]。;{fobj}'
。看起来您正在尝试将连接字符串嵌入SQL?还是我误解了?我试图将文本文件(fobj)中的值添加到数据库中,但我几乎只是在处理我在网上找到的内容,所以from是来自我在互联网上找到的随机类似内容。不过有一些进展,也许我更接近了。我将编辑我的问题以显示我现在的位置。请注意,您修订的方法使用动态SQL,因此容易出现SQL注入问题。例如,
e=“O'Leary”
会导致程序失败。这就是我在回答中使用参数化查询的原因。@GordThompson我认为这不是问题,因为文本文件只包含数字和单数字母,但我始终愿意尝试改进我的程序。我想你的方式将为我工作,如果我们可以得到的文件名是动态的,因为该程序将不得不用于导入不同的文件。目前,我正在将文件名输入到一个条目小部件中,并读取条目小部件以获取fobj变量中的文件名。所以我需要一些类似于open(r“fobj”,“r”)的文件作为管道文件:但这似乎不起作用。@GordThompson等等,我想我知道了,检查我对原始问题的编辑谢谢你的回答
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()