ITA xlsx2csv (was Re: python2 removal)

Brian Inglis Brian.Inglis@Shaw.ca
Thu Mar 16 15:53:20 GMT 2023


On 2023-03-16 07:29, Jon Turney wrote:
> On 15/03/2023 12:56, Brian Inglis via Cygwin-apps wrote:
>> On 2023-03-14 13:17, Jon Turney via Cygwin-apps wrote:
>>> On 15/01/2023 12:52, Jon Turney via Cygwin-apps wrote:
>>>> This has come up in discussion a few times, and is now well overdue, I think.
>>>> Python 2.7 is the last python2 version, which was sunsetted on January 1, 2020.

>>>> 3) There might also still be some other packages lurking which just install 
>>>> a script with a shebang containing 'python', and assume that python is 
>>>> python2. I don't know how we could identify those.

>>> The remaining cases of packages which have a dependency on python and/or 
>>> python2 are either this (packages which contain a python script with a python 
>>> shebang line), or the other case which I hadn't previously considered - a 
>>> package which contain an executable or shared library linked with 
>>> libpython2.7.dll.
>>> So, again I need inspect these to determine what should happen to them.

>> I'd like to adopt *xlsx2csv* - for an initial build see:

> Jari is still the maintainer of record for that package, so I need to give him 
> an opportunity to reply here.

>> https://cygwin.com/cgi-bin2/jobs.cgi?id=5607
>> https://cygwin.com/cgit/cygwin-packages/playground/commit/?id=af279166a903b526274f8b10264e206fc5010a68
>> https://github.com/cygwin/scallywag/actions/runs/4419738199
>> The author remains the same but version numbering staggers around then jumps 
>> to 0.5 and is now up to 0.8.1.
>> The manual was a POD file from Jari run thru pod2man for 0.11 from 2010, but 
>> very outdated now, not to mention using Perl docs for Python modules, so I'm 
>> rewriting from help2man output to be current, comprehensive, and functional 
>> with `groff -man`.
>> [I use it to get data into portable form, make it threat free, and fake 
>> spreadsheets for my accountant, if I want to use gvim instead of Gnumeric or 
>> Libre Office calc! ;^> ]

> The critical piece of data I'm missing here is which of these is true:
> a) This package contains a script with a python shebang. The current version 
> doesn't work when python is python3, so an upgrade is needed to continue working 
> when python2 is removed, or
> b) This package contains a script with a python shebang. The current version 
> will continue to work when python is python3.

Unfortunately only a generic cygbuild sh script is supplied with the package - 
does nothing but complain without some other "magic" script or data! ;^>
Jari's Debian 8/9 xlsx2csv releases have been updated to 0.20+20161027 from 
0.11+20120814.

$ sed 1q xlsx2csv.py
#!/usr/bin/env python

Does not work with python3, nor after running 2to3 fixes - see attached logs - 
IANAPythonista

Anyway pylint was not useful compared to 2to3 - see attached pylint before and 
after 2to3 logs compared to 2to3 log.

-- 
Take care. Thanks, Brian Inglis              Calgary, Alberta, Canada

La perfection est atteinte                   Perfection is achieved
non pas lorsqu'il n'y a plus rien à ajouter  not when there is no more to add
mais lorsqu'il n'y a plus rien à retirer     but when there is no more to cut
                                 -- Antoine de Saint-Exupéry
-------------- next part --------------
************* Module xlsx2csv.py
xlsx2csv.py.bak:286:65: E0001: leading zeros in decimal integer literals are not permitted; use an 0o prefix for octal integers (<unknown>, line 286) (syntax-error)
-------------- next part --------------
RefactoringTool: Adding transformation: apply
RefactoringTool: Adding transformation: asserts
RefactoringTool: Adding transformation: basestring
RefactoringTool: Skipping optional fixer: buffer
RefactoringTool: Adding transformation: dict
RefactoringTool: Adding transformation: except
RefactoringTool: Adding transformation: exec
RefactoringTool: Adding transformation: execfile
RefactoringTool: Adding transformation: exitfunc
RefactoringTool: Adding transformation: filter
RefactoringTool: Adding transformation: funcattrs
RefactoringTool: Adding transformation: future
RefactoringTool: Adding transformation: getcwdu
RefactoringTool: Adding transformation: has_key
RefactoringTool: Skipping optional fixer: idioms
RefactoringTool: Adding transformation: import
RefactoringTool: Adding transformation: imports
RefactoringTool: Adding transformation: imports2
RefactoringTool: Adding transformation: input
RefactoringTool: Adding transformation: intern
RefactoringTool: Adding transformation: isinstance
RefactoringTool: Adding transformation: itertools
RefactoringTool: Adding transformation: itertools_imports
RefactoringTool: Adding transformation: long
RefactoringTool: Adding transformation: map
RefactoringTool: Adding transformation: metaclass
RefactoringTool: Adding transformation: methodattrs
RefactoringTool: Adding transformation: ne
RefactoringTool: Adding transformation: next
RefactoringTool: Adding transformation: nonzero
RefactoringTool: Adding transformation: numliterals
RefactoringTool: Adding transformation: operator
RefactoringTool: Adding transformation: paren
RefactoringTool: Adding transformation: print
RefactoringTool: Adding transformation: raise
RefactoringTool: Adding transformation: raw_input
RefactoringTool: Adding transformation: reduce
RefactoringTool: Adding transformation: reload
RefactoringTool: Adding transformation: renames
RefactoringTool: Adding transformation: repr
RefactoringTool: Skipping optional fixer: set_literal
RefactoringTool: Adding transformation: standarderror
RefactoringTool: Adding transformation: sys_exc
RefactoringTool: Adding transformation: throw
RefactoringTool: Adding transformation: tuple_params
RefactoringTool: Adding transformation: types
RefactoringTool: Adding transformation: unicode
RefactoringTool: Adding transformation: urllib
RefactoringTool: Skipping optional fixer: ws_comma
RefactoringTool: Adding transformation: xrange
RefactoringTool: Adding transformation: xreadlines
RefactoringTool: Adding transformation: zip
RefactoringTool: Refactoring xlsx2csv.py
RefactoringTool: Refactored xlsx2csv.py
RefactoringTool: Wrote changes to xlsx2csv.py
RefactoringTool: Files that were modified:
RefactoringTool: xlsx2csv.py
--- xlsx2csv.py	(original)
+++ xlsx2csv.py	(refactored)
@@ -148,10 +148,10 @@
             attrs = sheetNode._attrs
             name = attrs["name"].value
             if self.appName == 'xl':
-                if attrs.has_key('r:id'): id = int(attrs["r:id"].value[3:])
+                if 'r:id' in attrs: id = int(attrs["r:id"].value[3:])
                 else: id = int(attrs['sheetId'].value)
             else:
-                if attrs.has_key('sheetId'): id = int(attrs["sheetId"].value)
+                if 'sheetId' in attrs: id = int(attrs["sheetId"].value)
                 else: id = int(attrs['r:id'].value[3:])
             self.sheets.append({'name': name, 'id': id})
 
@@ -272,18 +272,18 @@
                 # get cell format
                 format = None
                 xfs_numfmt = self.styles.cellXfs[s]
-                if self.styles.numFmts.has_key(xfs_numfmt):
+                if xfs_numfmt in self.styles.numFmts:
                     format = self.styles.numFmts[xfs_numfmt]
-                elif STANDARD_FORMATS.has_key(xfs_numfmt):
+                elif xfs_numfmt in STANDARD_FORMATS:
                     format = STANDARD_FORMATS[xfs_numfmt]
                 # get format type
-                if format and FORMATS.has_key(format):
+                if format and format in FORMATS:
                     format_type = FORMATS[format]
 
                     if format_type == 'date': # date/time
                         try:
                             if self.workbook.date1904:
-                                date = datetime.datetime(1904, 01, 01) + datetime.timedelta(float(data))
+                                date = datetime.datetime(1904, 0o1, 0o1) + datetime.timedelta(float(data))
                             else:
                                 date = datetime.datetime(1899, 12, 30) + datetime.timedelta(float(data))
                             if self.dateformat:
@@ -322,12 +322,12 @@
             self.in_cell_value = True
         #elif self.in_cell and name == 'f':
         #    self.in_cell_formula = True
-        elif self.in_sheet and name == 'row' and attrs.has_key('r'):
+        elif self.in_sheet and name == 'row' and 'r' in attrs:
             self.rowNum = attrs['r']
             self.in_row = True
             self.columns = {}
             self.spans = None
-            if attrs.has_key('spans'):
+            if 'spans' in attrs:
                 self.spans = [int(i) for i in attrs['spans'].split(":")]
         elif name == 'sheetData':
             self.in_sheet = True
@@ -343,9 +343,9 @@
             self.columns[t - 1 + self.colIndex] = self.data
             self.in_cell = False
         if self.in_row and name == 'row':
-            if len(self.columns.keys()) > 0:
+            if len(list(self.columns.keys())) > 0:
                 d = [""] * (max(self.columns.keys()) + 1)
-                for k in self.columns.keys():
+                for k in list(self.columns.keys()):
                     d[k] = self.columns[k].encode("utf-8")
                 if self.spans:
                     l = self.spans[0] + self.spans[1] - 1
@@ -366,7 +366,7 @@
         else:
             if fullpath.lower().endswith(".xlsx"):
                 outfilepath = fullpath[:-4] + 'csv'
-                print("Converting %s to %s" %(fullpath, outfilepath))
+                print(("Converting %s to %s" %(fullpath, outfilepath)))
                 f = open(outfilepath, 'w+b')
                 try:
                     xlsx2csv(fullpath, f, **kwargs)
-------------- next part --------------
************* Module xlsx2csv
xlsx2csv.py:140:27: E1101: Instance of 'Document' has no 'firstChild' member (no-member)
xlsx2csv.py:142:28: E1101: Instance of 'Document' has no 'firstChild' member (no-member)
xlsx2csv.py:146:17: E1101: Instance of 'Document' has no 'firstChild' member (no-member)

-----------------------------------
Your code has been rated at 9.44/10



More information about the Cygwin-apps mailing list