Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 从.mdb字段名中删除奇怪字符_Python 3.x_Ms Access_Pyodbc - Fatal编程技术网

Python 3.x 从.mdb字段名中删除奇怪字符

Python 3.x 从.mdb字段名中删除奇怪字符,python-3.x,ms-access,pyodbc,Python 3.x,Ms Access,Pyodbc,我有大量的.mdb文件(如Microsoft Access db文件)。第一个字段(或列)应命名为sayMyField1。但是,文件已损坏,因此实际字段名为\ufeffMyField1,或者换句话说,实际字段名前面有0xFEFF 我正在尝试使用pyodbc命令将相关字段从\ufeffMyField1复制到NewField cursor.execute("UPDATE MyTable SET NewField=" + colname + ";") 其中colname是错误的字段名(假设NewFi

我有大量的.mdb文件(如Microsoft Access db文件)。第一个字段(或列)应命名为say
MyField1
。但是,文件已损坏,因此实际字段名为
\ufeffMyField1
,或者换句话说,实际字段名前面有
0xFEFF

我正在尝试使用pyodbc命令将相关字段从
\ufeffMyField1
复制到
NewField

cursor.execute("UPDATE MyTable SET NewField=" + colname + ";")
其中
colname
是错误的字段名(假设
NewField
已经存在)

colname
的值是通过pyodbc获取的,使用类似

rows = cur.columns(table='MyTable')
for row in rows:
   if("MyField1" in row.column_name):
      colname=row.column_name
执行
UPDATE…
命令会产生一个驱动程序错误,即MaxLocksPerFile Ms Access参数过低,如下所述。 但是,我在程序中只打开一个文件的同时,将MaxLocksPerFile参数增加了几个数量级,因此这似乎不是实际问题

请注意,毫无问题,我可以在MS Access中打开该文件,并在gui中重命名该字段。我没有找到一种方法在gui中看到字段的名称不正确,这可能是因为额外的位与常见的编码不匹配

最后,这引出了我的问题:如何将原始字节作为pyodbc命令传递


或者,如果您有其他方法来解决删除额外字符的实际问题,请在评论中提出建议?(就像从字段名中清除所有非ASCII字符一样)

如果您想使用DAO,那么它非常简单。您可以修改以下代码来查找并循环遍历所有数据库的文件夹

Sub Rename_First_Field()
Dim dbs As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field

    Set dbs = OpenDatabase("C:\....\SomeDB.mdb")
    For Each tdf In dbs.TableDefs           ' Spin thru all tables in this database
        Set fld = tdf.Fields(0)             ' Grab the first field
        Debug.Print tdf.Name & vbTab & "|" & vbTab & fld.Name
        fld.Name = "MyField1"               ' Rename to 'MyField1'
    Next tdf                                'Move to next table
    Set tdf = Nothing
    Set dbs = Nothing
End Sub

我会尝试使用COM和DAO来重命名列。我怀疑通过SQL和ODBC实现这一点,因为您可能无法使用无效名称引用字段。不过,您可以尝试将字段名括起来,以说明非文本字符,并查看是否这样做。我这里没有.mdb文件,但是您是否检查了列名字符串是否出现在文件的原始二进制文件中,以便您可以在那里简单地替换它?我已经检查了,但没有发现它们以某种方式连接到字段名。没有花足够的时间在这个问题上,最终认为这不是python代码。我的建议是使用COM和PyWin32从Python调用DAO。当然,使用VBA要容易得多。