I have been trying all day to convert dbf files to CSV and cannot seem to get it. I have looked at various options and cannot seem to get one that will work. Here is one that I have been trying.
import arcpy
import dbf
from arcpy import env
import os
def DBFtoCSV(path):
'''Convert every DBF table into CSV table.
'''
env.workspace = path
tablelist = arcpy.ListTables() # list tables in file
for table in tablelist: # iterate through every table
#make sure you are just working with .dbf tables
if table.endswith('.dbf'):
with dbf.Table(os.path.join(path, table)) as current_table:
print current_table
dbf.export(current_table)
print "\n Processing ",table[:-4]+".csv table complete."
if __name__ == '__main__':
path=r'path'
DBFtoCSV(path)
The error I am getting now is:
Processing name.csv table complete.
Table: F:/name.dbf
Type: Visual Foxpro
Codepage: cp1252 (Windows ANSI)
Status: read-write
Last updated: 2014-02-24
Record count: 4887170
Field count: 23
Record length: 235
--Fields--
0) respondent I binary
1) report_yr I binary
2) report_prd I binary
3) sys_key I binary
4) tr_id C(24)
5) tr_contrac I binary null
6) tr_begin_d T binary null
7) tr_end_dat T binary null
8) tr_timezon C(2) null
9) tr_delv_ct C(4) null
10) tr_delv_sp C(48) null
11) tr_class_n C(4) null
12) tr_term_na C(4) null
13) tr_inc_nam C(4) null
14) tr_inc_pea C(4) null
15) tr_prod_na C(49) null
16) tr_quantit B binary null
17) tr_price B binary
18) tr_units C(9) null
19) tr_tot_tra B binary null
20) tr_tot_tr2 B binary null
21) tr_other M
22) tr_revised T binary
array('c', '\x00\x00')
16
(2, 0)
(235, array('c', ' \x8f\x04\x00\x00\xd9\x07\x00\x00\x03\x00\x00\x00\x01\x00\x00\
x001Q09 \x04\x00\x00\x001u%\x00\xe5\x03\x00\x00\x8au%\x00\x18
X&\x05MPPNM PNM Switchyard F LT M FP CAPA
CITY \x00\x00\x00\x00\x80+\x18A\xba\xda\
x8a\xfdew\x0f@$/KW-MO \x00\x00\x00\x00\x00\x00\x00\x00\xcd\xcc\xcc\xccR\xc47A\x
00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'))
('0', 233, 2, 235, 0, 5, <function none at 0x110DF9B0>, <function none at 0x110D
F9B0>)
array('c', '\x00\x00')
Traceback (most recent call last):
File "dbf_convert_stack.py", line 20, in <module>
DBFtoCSV(path)
File "dbf_convert_stack.py", line 16, in DBFtoCSV
dbf.export(current_table)
File "C:\Python27\ArcGIS10.4\lib\site-packages\dbf\ver_2.py", line 7859, in ex
port
data = record[fieldname]
File "C:\Python27\ArcGIS10.4\lib\site-packages\dbf\ver_2.py", line 2541, in __
getitem__
return self.__getattr__(item)
File "C:\Python27\ArcGIS10.4\lib\site-packages\dbf\ver_2.py", line 2508, in __
getattr__
value = self._retrieve_field_value(index, name)
File "C:\Python27\ArcGIS10.4\lib\site-packages\dbf\ver_2.py", line 2693, in _r
etrieve_field_value
if ord(null_data[byte]) >> bit & 1:
IndexError: array index out of range
Instead of using dbfpy
use my dbf module instead:
import dbf # instead of dbfpy
def DBFtoCSV(path):
'''Convert every DBF table into CSV table. '''
env.workspace = path
tablelist = arcpy.ListTables() # list tables in file
for table in tablelist: # iterate through every table
#make sure you are just working with .dbf tables
if table.endswith('.dbf'):
with dbf.Table(table) as current_table:
dbf.export(current_table)
#keep track of processing
print "\n Processing ",table[:-4]+".csv table complete."
This can be fairly straightforward with SearchCursor. All you really need to do is get the field names, pass that into the cursor, then write the complete row to a csv with Python's csv module.
import arcpy
import csv
dbf = table_name # Pass in the table you've identified
outputFile = '{}.csv'.format(dbf.split('.dbf')[0])
# Get the fields in the dbf to use for the cursor and csv header row.
fields = []
for field in arcpy.ListFields(dbf):
fields.append(field.name)
# Make the csv.
with open(outputFile, 'wb') as output:
dataWriter = csv.writer(output, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
# Write header row.
dataWriter.writerow(fields)
# Write each row of data to the csv.
with arcpy.da.SearchCursor(dbf, fields) as cursor:
for row in cursor:
dataWriter.writerow(row)
print('Finished creating {}'.format(outputFile))
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.