# 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.

## 10 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 2 people

• I ran into the same thing. Trying to decode the text, I ran into different issues, like not being able to decode tuples or integers. So I thought I might try converting the tuples to string (not sure about this being a good idea anyway). My last try was the code below, but now apparently – again – it fails due to encoding when converting to string before the decoding – which I did because otherwise I had integers in the rows…

import arcpy, csv, codecs

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:
row_str = ”.join(str(item) for item in row)
row_dec=row_str.decode(‘utf-8’)
writer.writerow(row_dec)
print csv_filepath + ” CREATED”
csv_file.close()

Like

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:

##sys.setdefaultencoding(‘utf8’)

The problem now is that I do not get the messages for the user in the interactive window, although the csv files have been created correctly.

Like

3. Hi thanks a lot for your script
I have multiple raster data and I need to copy the values in excel.
there are two value 0 for snow free area and 1 for snow area I need to copy the values from row no 1.
Actually I have not used coding and I don’t have any idea about it.
could you kindly help me to use your script for my data.