Write Russian field names to txt

1243
2
Jump to solution
05-20-2014 03:09 AM
RebeccaWatson
Occasional Contributor
Hi,
I am trying to script a process to write out a list of datasets > feature classes > fields to a txt file but I am getting:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-8: ordinal not in range(128) when the script gets to the bit to print out the field names. I think this is because some of the field names are in Russian cyrillic.

Can anyone advise how I get these Russian names to print to my text file? I have gathered that it is something to do with unicode but I'm finding the literature on unicode a bit daunting! My code is as follows:

... for fd in fdList: ...     arcpy.env.workspace = wksp+'/'+fd ...     fcList = arcpy.ListFeatureClasses() ...     txtFile.write (fd) ...     txtFile.write(os.linesep) ...     for fc in fcList: ...         arcpy.env.workspace = wksp+'/'+fd+'/'+fc ...         fields = arcpy.ListFields(arcpy.env.workspace) ...         txtFile.write(' '+fc) ...         txtFile.write(os.linesep) ...         for field in fields: ...             fieldname = field.name ...             txtFile.write(fieldname) ...             txtFile.write(os.linesep) ... #close file ... txtFile.close() ... print "done"


Many thanks,
Tags (2)
0 Kudos
1 Solution

Accepted Solutions
RebeccaWatson
Occasional Contributor
Thanks for your reply. I couldn't quite get that code to work it seemed to have a problem with something being a string, as follows:

>>> import io ... import arcpy ... from arcpy import env ... import os ... env.workspace = r"Database Connections\Direct Connect Editor User.sde" ... fdList = arcpy.ListDatasets() ... wksp = "Database Connections\Direct Connect Editor User.sde" ... arcpy.env.workspace = wksp ... with io.open(r"C:\Desktop\List.txt", "w", encoding="utf-8") as txtFile: ...     for fd in fdList: ...         arcpy.env.workspace = wksp+'/'+fd ...         fcList = arcpy.ListFeatureClasses() ...         txtFile.write (fd) ...         txtFile.write(os.linesep) ...         for fc in fcList: ...             arcpy.env.workspace = wksp+'/'+fd+'/'+fc ...             fields = arcpy.ListFields(arcpy.env.workspace) ...             txtFile.write(' '+fc) ...             txtFile.write(os.linesep) ...             for field in fields: ...                 txtFile.write(field.name) ...                 txtFile.write(os.linesep) ... #close file ... txtFile.close() ... print "done" ... Runtime error  Traceback (most recent call last):   File "<string>", line 19, in <module> TypeError: must be unicode, not str


But, it did lead me to this:

>>> import arcpy ... from arcpy import env ... import os ... env.workspace = r"Database Connections\Direct Connect Editor User.sde" ... fdList = arcpy.ListDatasets() ... wksp = "Database Connections\Direct Connect Editor User.sde" ... arcpy.env.workspace = wksp ... txtFile = open(r"C:\Desktop\List.txt","w") ... for fd in fdList: ...     arcpy.env.workspace = wksp+'/'+fd ...     fcList = arcpy.ListFeatureClasses() ...     txtFile.write (fd) ...     txtFile.write(os.linesep) ...     for fc in fcList: ...         arcpy.env.workspace = wksp+'/'+fd+'/'+fc ...         fields = arcpy.ListFields(arcpy.env.workspace) ...         txtFile.write(' '+fc) ...         txtFile.write(os.linesep) ...         for field in fields: ...             fieldname = field.name.encode("utf-8") ...             txtFile.write(fieldname) ...             txtFile.write(os.linesep) ... #close file ... txtFile.close() ... print "done"


There are a lot of results to look through and check, but it seems to have done the trick.
I would be interested if you could let me know why you think it doesn't work the other way.
Thanks for your help

View solution in original post

0 Kudos
2 Replies
JasonScheirer
Occasional Contributor III
Could you paste the full traceback?

Try this:

import io

with io.open(myfile, "w", encoding="utf-8") as txtFile:
    for fd in fdList:
        arcpy.env.workspace = wksp+'/'+fd
        fcList = arcpy.ListFeatureClasses()
        txtFile.write(fd)
        txtFile.write(os.linesep)
        for fc in fcList:
            arcpy.env.workspace = wksp+'/'+fd+'/'+fc
            fields = arcpy.ListFields(arcpy.env.workspace)
            txtFile.write(u' '+fc)
            txtFile.write(os.linesep)
            for field in fields:
                fieldname = field.name
                txtFile.write(fieldname)
                txtFile.write(os.linesep)
    print "done"
0 Kudos
RebeccaWatson
Occasional Contributor
Thanks for your reply. I couldn't quite get that code to work it seemed to have a problem with something being a string, as follows:

>>> import io ... import arcpy ... from arcpy import env ... import os ... env.workspace = r"Database Connections\Direct Connect Editor User.sde" ... fdList = arcpy.ListDatasets() ... wksp = "Database Connections\Direct Connect Editor User.sde" ... arcpy.env.workspace = wksp ... with io.open(r"C:\Desktop\List.txt", "w", encoding="utf-8") as txtFile: ...     for fd in fdList: ...         arcpy.env.workspace = wksp+'/'+fd ...         fcList = arcpy.ListFeatureClasses() ...         txtFile.write (fd) ...         txtFile.write(os.linesep) ...         for fc in fcList: ...             arcpy.env.workspace = wksp+'/'+fd+'/'+fc ...             fields = arcpy.ListFields(arcpy.env.workspace) ...             txtFile.write(' '+fc) ...             txtFile.write(os.linesep) ...             for field in fields: ...                 txtFile.write(field.name) ...                 txtFile.write(os.linesep) ... #close file ... txtFile.close() ... print "done" ... Runtime error  Traceback (most recent call last):   File "<string>", line 19, in <module> TypeError: must be unicode, not str


But, it did lead me to this:

>>> import arcpy ... from arcpy import env ... import os ... env.workspace = r"Database Connections\Direct Connect Editor User.sde" ... fdList = arcpy.ListDatasets() ... wksp = "Database Connections\Direct Connect Editor User.sde" ... arcpy.env.workspace = wksp ... txtFile = open(r"C:\Desktop\List.txt","w") ... for fd in fdList: ...     arcpy.env.workspace = wksp+'/'+fd ...     fcList = arcpy.ListFeatureClasses() ...     txtFile.write (fd) ...     txtFile.write(os.linesep) ...     for fc in fcList: ...         arcpy.env.workspace = wksp+'/'+fd+'/'+fc ...         fields = arcpy.ListFields(arcpy.env.workspace) ...         txtFile.write(' '+fc) ...         txtFile.write(os.linesep) ...         for field in fields: ...             fieldname = field.name.encode("utf-8") ...             txtFile.write(fieldname) ...             txtFile.write(os.linesep) ... #close file ... txtFile.close() ... print "done"


There are a lot of results to look through and check, but it seems to have done the trick.
I would be interested if you could let me know why you think it doesn't work the other way.
Thanks for your help
0 Kudos