# Table or Feature Class Attributes to CSV with ArcPy (Python)

Here’s a little function for exporting an attribute table from ArcGIS to a CSV file. The function takes two arguments, these are a file-path to the input feature class or table and a file-path for the output CSV file (see example down further).

First import the necessary modules.

import arcpy, csv

Inside the function we use ArcPy to get a list of the field names.

def tableToCSV(input_tbl, csv_filepath):
fld_list = arcpy.ListFields(input_tbl)
fld_names = [fld.name for fld in fld_list]

We then open a CSV file to write the data to.

    with open(csv_filepath, 'wb') as csv_file:
writer = csv.writer(csv_file)

The first row of the output CSV file contains the header which is the list of field names.

        writer.writerow(fld_names)

We then use the ArcPy SearchCursor to access the attributes in the table for each row and write each row to the output CSV file.

        with arcpy.da.SearchCursor(input_tbl, fld_names) as cursor:
for row in cursor:
writer.writerow(row)

And close the CSV file.

    csv_file.close()

Full script example…

import arcpy, csv

def tableToCSV(input_tbl, csv_filepath):
fld_list = arcpy.ListFields(input_tbl)
fld_names = [fld.name for fld in fld_list]
with open(csv_filepath, 'wb') as csv_file:
writer = csv.writer(csv_file)
writer.writerow(fld_names)
with arcpy.da.SearchCursor(input_tbl, fld_names) as cursor:
for row in cursor:
writer.writerow(row)
print csv_filepath + " CREATED"
csv_file.close()

fc = r"C:\Users\******\Documents\ArcGIS\Default.gdb\my_fc"
out_csv = r"C:\Users\******\Documents\output_file.csv"

tableToCSV(fc, out_csv)


Feel free to ask questions, comment, or help build upon this example.

## 8 thoughts on “Table or Feature Class Attributes to CSV with ArcPy (Python)”

1. This method has a problem with special characters:

UnicodeEncodeError: ‘ascii’ codec can’t encode character u’\xe3′ in position : ordinal not in range(128)

How to handle this?

Liked by 1 person

2. Hi, many thanks for your script, it is really helpful. However, I would like to ask you how I could do it in a batch for a list of shapefiles. I have been trying different ways without any success.

Like

• Hi Daniel,
Replace the last three lines of code with…

 ## a list of shapefiles (full paths) shp_list = [r"full\\path1.shp", r"full\path2.shp"] ## output folder for csv files ouput_folder = r"folder\\path"

 

## cycle through the shapefiles for shpfile in shp_list: ## place csv files in the output folder names the same as the shapefile.csv out_csv = "{0}\\{1}".format(ouput_folder, shpfile.rsplit("\\")[-1].replace(".shp", ".csv")) tableToCSV(shpfile, out_csv) 

Make sure to indent in the for loop, can seem to format it here.

Let me know how that goes!

Like

• Hi again and many thanks for your help!!

It works absolutely fine!!

However, I would like to know your opinion about one question. What happens if I have a list of, for example, 1000 shapefiles? Shall I put all the shapefiles path into the shp_list? It could be a bit tedious and boring to copy and paste 1000 paths.

A possible solution could be work with ListFeatureClasses? I have tried it but it does not work.

Very appreciate for your time and help

Like

• Oh, I think I have found the solution. I have just change the line code

shp_list = [r”full\\path1.shp”, r”full\path2.shp”]

for

shp_list = arcpy.ListFeatureClasses()

And it seems to work, but only when the function has been defined previously with your last code, because later on, I have closed the program, opened it again and it gives me the following error.

TypeError: ‘NoneType’ object is not iterable.

Anny solution to avoid this error when I run the script for first time?

Very appreciated again!!

Like

• Change the code to
## output folder for csv files
ouput_folder = r”folder\\path”

## folder with shapefiles
arcpy.env.workspace = r”folder\\path\\to\\shapefiles”

## create list
shp_list = arcpy.ListFeatureClasses()

## cycle through the shapefiles
for shpfile in shp_list:
## place csv files in the output folder names the same as the shapefile.csv
out_csv = “{0}\\{1}”.format(ouput_folder, shpfile.rsplit(“\\”)[-1].replace(“.shp”, “.csv”))
tableToCSV(shpfile, out_csv)

again just make sure to indent inside the for loop

Like

• Many thanks!!!

It works absolutely fine. However, some shapefiles have special characters and I get the following error:

UnicodeEncodeError: ‘ascii’ codec can’t encode character u’\xc5′ in position 0: ordinal not in range(128)

Looking at google about it, I have imported the next two codes of line at the beginning of the script and it seems to work: