That doesn't look like correct Python syntax to me. Lambda expressions are limited to a single expression ( http://docs.python.org/tutorial/controlflow.html). I am pretty sure that just takes a callable, so you can do this:
def decodeIfNotNone(utf8_string): if utf8_string: return utf8_string.decode("utf-8") else: return "" Then pass this callable as the second parameter to the method: ('brand', decodeIfNotNone, None), Let me know if this works for you. On Thu, Dec 10, 2009 at 5:40 PM, Dominik Steiner < dominik.j.stei...@googlemail.com> wrote: > Thanks Ikai again for the fast reply. > ( > I tried the following > > ('brand', lambda x: x.decode('utf-8'), ""), > > so changing the default value from None to "" but that didn't help > > Then tried the following > > ('brand', if x is not None: lambda x: x.decode('utf-8'), ""), > > but this threw a syntax error. > > Is there anyway to check that the value is not null in order to decode it? > > Thanks > > Dominik > > It's basically the equivalent of a Null Pointer exception. This syntax: > > lambda x: x.someMethod() > > Is an inline anonymous function call. If x is None as opposed to blank > String, you will not be able to call methods on it. > > On Thu, Dec 10, 2009 at 1:45 PM, Dominik Steiner < > dominik.j.stei...@googlemail.com> wrote: > >> Thanks Ikai for the fast response, >> >> yes, some unicode characters might be the issue here as my data is in >> Spanish. I tried your suggestion and now have an exporter.py that looks like >> this >> >> from google.appengine.ext import db >> >> class Product(db.Model): >> userId = db.StringProperty() >> name = db.StringProperty() >> shop = db.StringProperty() >> brand = db.StringProperty() >> model = db.StringProperty() >> contact = db.StringProperty() >> imageId = db.StringProperty() >> userNickName = db.StringProperty() >> price = db.FloatProperty() >> registeredDate = db.DateProperty() >> validUntilDate = db.DateProperty() >> ratingCount = db.IntegerProperty() >> ratingTotal = db.IntegerProperty() >> rating = db.IntegerProperty() >> commentCount = db.IntegerProperty() >> description = db.TextProperty() >> >> from google.appengine.ext import db >> from google.appengine.tools import bulkloader >> >> class ProductExporter(bulkloader.Exporter): >> def __init__(self): >> bulkloader.Exporter.__init__(self, 'Product', >> [('name', lambda x: >> x.decode('utf-8'), None), >> ('userId', str, None), >> ('shop', lambda x: >> x.decode('utf-8'), None). >> ('brand', lambda x: >> x.decode('utf-8'), None), >> ('model', lambda x: >> x.decode('utf-8'), None), >> ('contact', lambda x: >> x.decode('utf-8'), None), >> ('imageId', str, None), >> ('userNickName', lambda x: >> x.decode('utf-8'), None), >> ('price', str, None), >> ('registeredDate', str, None), >> ('validUntilDate', str, None), >> ('ratingCount', str, None), >> ('ratingTotal', str, None), >> ('rating', str, None), >> ('commentCount', str, None), >> ('description', lambda x: >> x.decode('utf-8'), None) >> ]) >> exporters = [ProductExporter] >> >> >> and I now get the following error (but at least it seems that it had been >> downloading for a while before throwing that error) >> >> Traceback (most recent call last): >> File "/usr/local/bin/appcfg.py", line 60, in <module> >> run_file(__file__, globals()) >> File "/usr/local/bin/appcfg.py", line 57, in run_file >> execfile(script_path, globals_) >> File >> "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/appcfg.py", >> line 2548, in <module> >> main(sys.argv) >> File >> "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/appcfg.py", >> line 2539, in main >> result = AppCfgApp(argv).Run() >> File >> "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/appcfg.py", >> line 1640, in Run >> self.action(self) >> File >> "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/appcfg.py", >> line 2427, in __call__ >> return method() >> File >> "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/appcfg.py", >> line 2293, in PerformDownload >> run_fn(args) >> File >> "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/appcfg.py", >> line 2215, in RunBulkloader >> sys.exit(bulkloader.Run(arg_dict)) >> File >> "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/bulkloader.py", >> line 3894, in Run >> return _PerformBulkload(arg_dict) >> File >> "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/bulkloader.py", >> line 3800, in _PerformBulkload >> return_code = app.Run() >> File >> "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/bulkloader.py", >> line 3158, in Run >> self.progress_thread.WorkFinished() >> File >> "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/bulkloader.py", >> line 2207, in WorkFinished >> exporter.output_entities(self.result_db.AllEntities()) >> File >> "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/bulkloader.py", >> line 2788, in output_entities >> for entity in entity_generator) >> File >> "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/bulkloader.py", >> line 2788, in <genexpr> >> for entity in entity_generator) >> File >> "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/bulkloader.py", >> line 2769, in __SerializeEntity >> encoding = self.__EncodeEntity(entity) >> File >> "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/bulkloader.py", >> line 2757, in __EncodeEntity >> writer.writerow(self.__ExtractProperties(entity)) >> File >> "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/bulkloader.py", >> line 2738, in __ExtractProperties >> encoding.append(fn(entity[name])) >> File "exporter.py", line 30, in <lambda> >> ('brand', lambda x: x.decode('utf-8'), None), >> AttributeError: 'NoneType' object has no attribute 'decode' >> >> Do you have any idea of what that could be? >> >> Thanks again for your help. >> >> Dominik >> >> Interesting. Do you have some unicode characters in any fields? There's a >> snippet on the bulk loader page about how to handle these characters in your >> Importer: >> >> http://code.google.com/appengine/docs/python/tools/uploadingdata.html >> >> import datetime >> from google.appengine.ext import db >> from google.appengine.tools import bulkloader >> import models >> >> class AlbumLoader(bulkloader.Loader): >> def __init__(self): >> bulkloader.Loader.__init__(self, 'Album', >> [('title', lambda x: >> x.decode('utf-8')), >> ('artist', lambda x: >> x.decode('utf-8')), >> ('publication_date', >> lambda x: >> datetime.datetime.strptime(x, '%m/%d/%Y').date()), >> ('length_in_minutes', int) >> ]) >> >> loaders = [AlbumLoader] >> >> Your error may be caused by UTF-8/ASCII incompatibilities, and this is >> where I would start looking. >> >> On Wed, Dec 9, 2009 at 8:26 PM, Dominik Steiner < >> dominik.j.stei...@googlemail.com> wrote: >> >>> Hi Ikai, >>> >>> I followed the instructions in the cook book for the python uploader/ >>> downloader in order to be able to download and backup the data of my >>> java application. >>> >>> As already posted in the cook book article, I got the following >>> situation: >>> >>> "I would love to be able to download data in order to backup the data >>> of my application and I tried your steps. One thing that didn't work >>> for me was the line >>> >>> appcfg.py --server=python.latest.appid.appspot.com download_data >>> exporter --filename=data.csv --kind=Thing --config_file=exporter/ >>> thing_exporter.py >>> >>> but had to write >>> >>> appcfg.py --server=python.latest.xelavos.appspot.com download_data -- >>> filename=data.csv --kind=Thing --config_file=exporter/ >>> thing_exporter.py path/to/my/pythondirectory >>> >>> Then after being able to launch the exporter i got the following error >>> after a while of downloading >>> >>> .[INFO ] Product: No descending index on __key__, performing serial >>> download >>> ......................................... >>> Traceback (most recent call last): >>> File "/usr/local/bin/appcfg.py", line 60, in >>> run_file(__file__, globals()) >>> File "/usr/local/bin/appcfg.py", line 57, in run_file >>> execfile(script_path, globals_) >>> File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/ >>> GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/ >>> google/appengine/tools/appcfg.py", line 2548, in >>> main(sys.argv) >>> File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/ >>> GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/ >>> google/appengine/tools/appcfg.py", line 2539, in main >>> result = AppCfgApp(argv).Run() >>> File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/ >>> GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/ >>> google/appengine/tools/appcfg.py", line 1640, in Run >>> self.action(self) >>> File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/ >>> GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/ >>> google/appengine/tools/appcfg.py", line 2427, in __call__ >>> return method() >>> File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/ >>> GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/ >>> google/appengine/tools/appcfg.py", line 2293, in PerformDownload >>> run_fn(args) >>> File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/ >>> GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/ >>> google/appengine/tools/appcfg.py", line 2215, in RunBulkloader >>> sys.exit(bulkloader.Run(arg_dict)) >>> File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/ >>> GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/ >>> google/appengine/tools/bulkloader.py", line 3894, in Run >>> return _PerformBulkload(arg_dict) >>> File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/ >>> GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/ >>> google/appengine/tools/bulkloader.py", line 3800, in _PerformBulkload >>> return_code = app.Run() >>> File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/ >>> GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/ >>> google/appengine/tools/bulkloader.py", line 3158, in Run >>> self.progress_thread.WorkFinished() >>> File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/ >>> GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/ >>> google/appengine/tools/bulkloader.py", line 2207, in WorkFinished >>> exporter.output_entities(self.result_db.AllEntities()) >>> File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/ >>> GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/ >>> google/appengine/tools/bulkloader.py", line 2788, in output_entities >>> for entity in entity_generator) >>> File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/ >>> GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/ >>> google/appengine/tools/bulkloader.py", line 2788, in >>> for entity in entity_generator) >>> File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/ >>> GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/ >>> google/appengine/tools/bulkloader.py", line 2769, in __SerializeEntity >>> encoding = self.__EncodeEntity(entity) >>> File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/ >>> GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/ >>> google/appengine/tools/bulkloader.py", line 2757, in __EncodeEntity >>> writer.writerow(self.__ExtractProperties(entity)) >>> File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/ >>> GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/ >>> google/appengine/tools/bulkloader.py", line 2738, in >>> __ExtractProperties >>> encoding.append(fn(entity[name])) >>> UnicodeEncodeError: 'ascii' codec can't encode character u'\xe1' in >>> position 7: ordinal not in range(128) >>> " >>> >>> Do you know what this error means and how i can fix it? >>> >>> Thanks for any help >>> >>> Dominik >>> >>> -- >>> >>> You received this message because you are subscribed to the Google Groups >>> "Google App Engine for Java" group. >>> To post to this group, send email to >>> google-appengine-j...@googlegroups.com. >>> To unsubscribe from this group, send email to >>> google-appengine-java+unsubscr...@googlegroups.com<google-appengine-java%2bunsubscr...@googlegroups.com> >>> . >>> For more options, visit this group at >>> http://groups.google.com/group/google-appengine-java?hl=en. >>> >>> >>> >> >> >> -- >> Ikai Lan >> Developer Programs Engineer, Google App Engine >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Google App Engine for Java" group. >> To post to this group, send email to >> google-appengine-j...@googlegroups.com. >> To unsubscribe from this group, send email to >> google-appengine-java+unsubscr...@googlegroups.com. >> For more options, visit this group at >> http://groups.google.com/group/google-appengine-java?hl=en. >> >> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Google App Engine for Java" group. >> To post to this group, send email to >> google-appengine-j...@googlegroups.com. >> To unsubscribe from this group, send email to >> google-appengine-java+unsubscr...@googlegroups.com<google-appengine-java%2bunsubscr...@googlegroups.com> >> . >> For more options, visit this group at >> http://groups.google.com/group/google-appengine-java?hl=en. >> > > > > -- > Ikai Lan > Developer Programs Engineer, Google App Engine > > -- > You received this message because you are subscribed to the Google Groups > "Google App Engine for Java" group. > To post to this group, send email to > google-appengine-j...@googlegroups.com. > To unsubscribe from this group, send email to > google-appengine-java+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/google-appengine-java?hl=en. > > > -- > You received this message because you are subscribed to the Google Groups > "Google App Engine for Java" group. > To post to this group, send email to > google-appengine-j...@googlegroups.com. > To unsubscribe from this group, send email to > google-appengine-java+unsubscr...@googlegroups.com<google-appengine-java%2bunsubscr...@googlegroups.com> > . > For more options, visit this group at > http://groups.google.com/group/google-appengine-java?hl=en. > -- Ikai Lan Developer Programs Engineer, Google App Engine -- You received this message because you are subscribed to the Google Groups "Google App Engine for Java" group. To post to this group, send email to google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.