Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.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 DBF编码cp1250_Python_Database_Encoding_Anaconda_Dbf - Fatal编程技术网

Python DBF编码cp1250

Python DBF编码cp1250,python,database,encoding,anaconda,dbf,Python,Database,Encoding,Anaconda,Dbf,我的dbf数据库编码为cp1250,我正在使用以下代码读取该数据库: import csv from dbfpy import dbf import os import sys filename = sys.argv[1] if filename.endswith('.dbf'): print "Converting %s to csv" % filename csv_fn = filename[:-4]+ ".csv" with open(csv_fn,'wb') a

我的dbf数据库编码为cp1250,我正在使用以下代码读取该数据库:

import csv
from dbfpy import dbf
import os
import sys

filename = sys.argv[1]
if filename.endswith('.dbf'):
    print "Converting %s to csv" % filename
    csv_fn = filename[:-4]+ ".csv"
    with open(csv_fn,'wb') as csvfile:
        in_db = dbf.Dbf(filename)
        out_csv = csv.writer(csvfile)
        names = []
        for field in in_db.header.fields:
            names.append(field.name)
        #out_csv.writerow(names)
        for rec in in_db:
            out_csv.writerow(rec.fieldData)
        in_db.close()
        print "Done..."
else:
  print "Filename does not end with .dbf"
问题是,最终的csv文件是错误的。文件编码为ANSI,某些字符已损坏。我想问你,如果你能帮助我如何正确阅读dbf文件

编辑1

我尝试了来自的不同代码,出现了一些错误

资料来源2:

from simpledbf import Dbf5
import os
import sys

dbf = Dbf5('test.dbf', codec='cp1250');
dbf.to_csv('junk.csv');
输出:

python program2.py
Traceback (most recent call last):
  File "program2.py", line 5, in <module>
    dbf = Dbf5('test.dbf', codec='cp1250');
  File "D:\ProgramFiles\Anaconda\lib\site-packages\simpledbf\simpledbf.py",      line 557, in __init__
    assert terminator == b'\r'
pythonProgram2.py
回溯(最近一次呼叫最后一次):
文件“program2.py”,第5行,在
dbf=Dbf5('test.dbf',codec='cp1250');
文件“D:\ProgramFiles\Anaconda\lib\site packages\simpledbf\simpledbf.py”,第557行,在\uuu init中__
断言终止符==b'\r'
断言者

我真的不知道如何解决这个问题。

尝试使用:


我写了simpledbf。导致您出现问题的原因是我在开发模块时进行的一些测试。首先,您可能需要更新安装,因为0.2.6是最新版本。然后,您可以尝试从文件“D:\ProgramFiles\Anaconda\lib\site packages\simpledbf\simpledbf.py”中删除该特定行(#557)。如果这不起作用,你可以打电话给我,或者你可以试试Ethan关于dbf模块的建议。

你可以根据需要解码和编码
dbfpy
假设字符串是
utf8
编码的,因此您可以解码,因为它不是该编码,然后使用正确的编码再次编码

import csv
from dbfpy import dbf
import os
import sys

filename = sys.argv[1]
if filename.endswith('.dbf'):
    print "Converting %s to csv" % filename
    csv_fn = filename[:-4]+ ".csv"
    with open(csv_fn,'wb') as csvfile:
        in_db = dbf.Dbf(filename)
        out_csv = csv.writer(csvfile)
        names = []
        for field in in_db.header.fields:
            names.append(field.name)
        #out_csv.writerow(names)
        for rec in in_db:
            row = [i.decode('utf8').encode('cp1250') if isinstance(i, str) else i for i in rec.fieldData]
            out_csv.writerow(rec.fieldData)
        in_db.close()
        print "Done..."
else:
  print "Filename does not end with .dbf"

它也有效。谢谢你的回答。:)空字段上出现错误。“ValueError:列类型”尚不受支持
import csv
from dbfpy import dbf
import os
import sys

filename = sys.argv[1]
if filename.endswith('.dbf'):
    print "Converting %s to csv" % filename
    csv_fn = filename[:-4]+ ".csv"
    with open(csv_fn,'wb') as csvfile:
        in_db = dbf.Dbf(filename)
        out_csv = csv.writer(csvfile)
        names = []
        for field in in_db.header.fields:
            names.append(field.name)
        #out_csv.writerow(names)
        for rec in in_db:
            row = [i.decode('utf8').encode('cp1250') if isinstance(i, str) else i for i in rec.fieldData]
            out_csv.writerow(rec.fieldData)
        in_db.close()
        print "Done..."
else:
  print "Filename does not end with .dbf"