Any chance of getting lxml in Pythonista 1.6 (and the next version of Editorial too, while I'm at it)? I would really, really like to use openpyxl (or python-xlsx) and python-docx to read/edit Excel and Word docs in my Dropbox but they have lxml as a dependency and, as a C-based library, it's not user-installable.
Welcome!
This is the community forum for my apps Pythonista and Editorial.
For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.
Best posts made by roosterboy197
-
RE: Pythonista 1.6 Beta
-
RE: Create docx file using Python-docx?
I am pretty sure this isn't possible, since
python-docx
(andpython-xlsx
) requireslxml
, which is not installed on Pythonista or Editorial and is a C library rather than a native Python module and therefore can't be user-installed. It would require either a) Ole to includelxml
as part of the app, or b) someone to reworkpython-docx
and-xlsx
to use another XML-parsing module, like sayelementtree
.I would dearly love to be proven wrong, though.
Latest posts made by roosterboy197
-
dropbox.put_file() chopping off bytes
I don't understand what's going on here so hopefully one of you can enlighten me.
I subscribe to the RSS feed for http://kupu.maori.nz in MrReader and have a service set up to send a post to a Pythonista script to extract the word of the day and append it to a text file in my Dropbox. But every time it runs, the file shrinks by a number of bytes, usually between 2 and 25. I can't see any correlation between the size of the appended string and the size of the shrinkage.
What am I doing wrong? I'm betting it's something simple I've missed but I dunno.
#coding: utf-8 import sys import dropboxlogin from dropbox import rest import console import locale import webbrowser dropboxlogin.app_key = '...' dropboxlogin.app_secret = '...' DB_FOLDER = '/flashcards/' DB_FILE = 'Māori.cards.txt' def main(): locale.setlocale(locale.LC_ALL, '') #extract the word of the day from the RSS text rss = sys.argv[1] new_word = rss.split('.')[0] new_word = new_word.replace(': ', ' :: ') #this gives us text like "ngeru :: cat" try: db = dropboxlogin.get_client() ff, md = db.get_file_and_metadata(DB_FOLDER + DB_FILE) wordlist = ff.read().decode('utf-8').splitlines() ff.close() print(md) #to check our starting size wordlist.append(new_word) wordlist = list(set(wordlist)) wordlist.sort(cmp=locale.strcoll) md = db.put_file(DB_FOLDER + DB_FILE, u'\n'.join(wordlist), overwrite=True) print(md) #to see how much we've shrunk console.hud_alert('added {}'.format(new_word)) except rest.ErrorResponse as e: console.alert('Error - add_maori.py', message='{}\n'.format(e)) webbrowser.open('mrreader://') if __name__ == '__main__': main()
-
RE: dropbox.put_file() chopping off bytes
And that's why I shouldn't code first thing out of bed in the morning. Of course it's doing that; I'm reusing the same input each time so changing it to a set strips out the dupe. Fixing that gives me this output:
# "12hgtjfj :: 34hytgfrd" ('bytes - before', 1048) ('before', 56, 999) ('after', 56, 999) ('sorted', 56, 999) ('bytes - after', 1054) # 21 characters, 6 bytes
So it's not the sort.
But I just noticed that my byte count increased this time!
-
RE: dropbox.put_file() chopping off bytes
Yeah, now I'm really confused. I woke up this morning thinking "hmm, maybe it's the sort", added in just one print statement and now my output looks like this:
# "hgtjfj :: hytgfrd" ('bytes - before', 1122) ('before', 59, 1062) ('after', 58, 1045) ('sorted', 58, 1045) ('bytes - after', 1102) # 17 characters, -20 bytes # "hgtjfj :: hytgfrd" ('bytes - before', 1102) ('before', 58, 1044) ('after', 57, 1027) ('sorted', 57, 1027) ('bytes - after', 1083) # 17 characters, -19 bytes # "hgtjfj :: hytgfrd" ('bytes - before', 1083) ('before', 57, 1027) ('after', 56, 1010) ('sorted', 56, 1010) ('bytes - after', 1065) # 17 characters, -18 bytes # "hgtjfj :: hytgfrd" ('bytes - before', 1065) ('before', 57, 1010) ('after', 56, 993) ('sorted', 56, 993) ('bytes - after', 1048) # 17 characters, -17 bytes
Now the
wordlist = list(set(wordlist))
line is removing data! And it looks like the byte count of the lost data is dropping by one each time. I just don't understand. -
RE: dropbox.put_file() chopping off bytes
Here are the results of running that several times, with the string I added and the bytes returned from the Dropbox metadata.
# "whatitoka :: door" ('bytes - before', 1157) ('before', 60, 1091) ('after', 60, 1091) ('bytes - after', 1150) # 17 characters, -7 bytes # "awa :: river" ('bytes - before', 1150) ('before', 60, 1083) ('after', 60, 1083) ('bytes - after', 1142) # 12 characters, -8 bytes # "hapa :: dinner" ('bytes - before', 1142) ('before', 60, 1078) ('after', 60, 1078) ('bytes - after', 1137) # 14 characters, -5 bytes # "āporo :: apple" ('bytes - before', 1137) ('before', 60, 1073) ('after', 60, 1073) ('bytes - after', 1132) # 14 characters, -5 bytes # "hgtj :: gfrd" - random characters ('bytes - before', 1132) ('before', 60, 1066) ('after', 60, 1066) ('bytes - after', 1125) # 12 characters, -7 bytes # "hgtjfj :: hytgfrd" - random characters ('bytes - before', 1125) ('before', 59, 1064) ('after', 59, 1064) ('bytes - after', 1122) # 17 characters, -3 bytes
I can't really see any pattern here. After seeing the byte difference was -5 for both 14-character strings, I tested using same length strings as earlier examples (17 and 12) but got different results.
-
2 feature requests and soliciting a suggestion for workaround
I find it strange that there's no workflow action to list files in a local or dropbox folder and really wish a future version of Editorial would get one.
Also, the ability to specify a directory in the Sync with Dropbox action so that the whole thing isn't synced seems like a good thing to have.
In the meantime, any suggestions for how to accomplish at least the first of these two things? I've managed to hack together a solution that works but it makes me nervous relying on something like this:
import os import editor import glob import workflow db_folder = workflow.get_variable('foldername') db_path = os.path.split(editor.get_workflows_path())[0] + '/Dropbox/{}/*.*'.format(db_folder) files = glob.glob(db_path) workflow.set_variable('filelist', '\n'.join(files))
Has anyone figured out a better way to list all the files in a Dropbox folder (and a local folder, too, while we're at it)?
-
unicode titles for ui buttons?
Trying to add a fancy title to a UI button using Unicode characters.
vw['btn_underline'].title = u'U\u0332'
works and gives me a button with an underlined capital U.vw['btn_italic'].title = u'\u1D644'
doesn't work. It should give the character MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I. Instead, it shows Unicode character \u1D64 (LATIN SUBSCRIPT SMALL LETTER U) followed by the number 4.What's up with that?
Hmm, picture doesn't show? Here's the link: https://www.dropbox.com/s/9plukw5hloyzz25/unicode_buttons.jpg
-
RE: unicode titles for ui buttons?
Oh, of course! I don't know why I didn't think of that myself. That'll work just fine. Thanks!
-
RE: unicode titles for ui buttons?
Well, that's disappointing. Though I guess it is too much to ask for every single obscure Unicode character to be available in the system font. How often are some of them going to be used?
So, any suggestion for a workaround?
-
RE: 2 feature requests and soliciting a suggestion for workaround
Yeah, the actual listing of the files isn't so much the issue as it is getting the path to the folder. Using
workflow.get_workflows_path()
and then figuring out the path to the Dropbox folders by manipulating the path string seems really hacky to me and fraught with danger.For the purposes of this post, I just kept it to files only, non-recursive. I've since created a custom action that looks at either a Dropbox or Local folder, recursively walks the hierarchy and returns the resulting list as a JSON-formatted string. But the initial issue still remains.
-
workflow variables not updating in will_close() handler
I have a custom UI I'm presenting in a Python script action. My custom view class has a
will_close()
handler where I want to save off some values to two workflow variables I've set up in previous steps. Here's my handler:def will_close(self): clist = u'\n'.join(u'{} :: {}'.format(_, self.wordlist[_]) for _ in self.correct_words) wlist = u'\n'.join(u'{} :: {}'.format(_, self.wordlist[_]) for _ in self.wrong_words) workflow.set_variable('correct_words', clist) workflow.set_variable('wrong_words', wlist)
The values of
correct_words
andwrong_words
are output using Set File Contents actions to two files in Dropbox, creating them if they don't already exist. The files are being created as they should, but they are empty!If I add some
print
statements to mywill_close()
handler, I can see in the console thatclist
andwlist
contain exactly what they should contain.If I pause the workflow at the first Set File Contents action, I can see that the variable
correct_words
contains no value.Any suggestions?