Convert SpreadSheets to CSV files with Python and pyuno, Part 2
Using the SSConverter class that we developed last week, which used the OORunner class from the week before that, this week we'll create a Python function that allows us to use spreadsheets as if they were CSV files by converting them on the fly.
Unlike the previous two pieces of code this piece doesn't use any new features of pyuno. It's actually quite simple: the function takes the name of a file that can be either a spreadsheet file or a CSV file:
- If the name refers to a spreadsheet file then the corresponding CSV file is checked, if it does not exist it is created. If it does exist, then it is checked to make sure that it's newer than the spreadsheet file, if not it's re-created.
- If the name refers to a CSV file then it's again checked to make sure it's newer than the spreadsheet file and it's re-created if the spreadsheet is newer.
In either case the name of the CSV file is returned. Usage is simple:
csvfile = check_csv_file(ifile)
If run directly the test code runs which accepts any number of command line arguments. The test code calls the function on each command line argument.
When run on a spreadsheet when there is no CSV file it creates the CSV file and returns its name:
$ python check_csv_file.py jj.xls Creating jj.csv from jj.xls Input name jj.xls, output name jj.csv
When run on the same spreadsheet again it simply returns the CSV file name since the CSV file already exists and is newer than the spreadsheet:
$ python check_csv_file.py jj.xls Input name jj.xls, output name jj.csv
When run on the CSV file it returns the CSV file name:
$ python check_csv_file.py jj.csv Input name jj.csv, output name jj.csv
When run on the CSV file after the spreadsheet has been modified it re-creates the CSV file and returns its name:
$ touch jj.xls $ python check_csv_file.py jj.csv Recreating jj.csv from jj.xls Input name jj.csv, output name jj.csv
The source code for the function follows:
import os import re import sys import csv def check_csv_file(csvfile): """ Make sure the CSV file exists. If it does not exist, try to create it from an XLS or ODS file. The passed name can refer to an XLS file or an ODS file. The return value will be the name of a CSV file. """ def find_csv(csvf): """ Check to see if the CSV file exists. """ fname, ext = os.path.splitext(csvf) ext = ext.lower() if ext == '.txt': f = '%s.%s' % (fname, 'TXT') if os.path.exists(f): csvf = f else: csvf = '%s.%s' % (fname, 'txt') elif ext != '.csv': f = '%s.%s' % (fname, 'CSV') if os.path.exists(f): csvf = f else: csvf = '%s.%s' % (fname, 'csv') return csvf def find_sheet(ssvf): """ Check to see if the spread sheet file exists. """ sheetf = None fname = os.path.splitext(ssvf) for ext in ('xls', 'XLS', 'ods', 'ODS'): f = '%s.%s' % (fname, ext) if os.path.exists(f): sheetf = f break return sheetf def convert_sheet(sheetf, csvf): """ Convert spreadsheet to a CSV file. """ import ooutils from ssconverter import SSConverter try: converter = SSConverter() converter.convert(sheetf, csvf) except Exception, e: sys.stderr.write("ERROR: %s\n" % e.message) sys.exit(1) # Find the spreadsheet file that corresponds to the CSV file csvfile = find_csv(csvfile) sheetfile = find_sheet(csvfile) if sheetfile: # If CSV does not exist try to create it. if not os.path.exists(csvfile): sys.stderr.write("Creating %s from %s\n" % (csvfile, sheetfile)) convert_sheet(sheetfile, csvfile) else: # If spreadsheet is newer the CSV file, re-create it. if os.stat(csvfile).st_mtime < os.stat(sheetfile).st_mtime: sys.stderr.write("Recreating %s from %s\n" % (csvfile, sheetfile)) convert_sheet(sheetfile, csvfile) if not os.path.exists(csvfile): sys.stderr.write('File not found: %s\n' % csvfile) sys.exit(1) return csvfile if __name__ == "__main__": for f in sys.argv[1:]: f2 = check_csv_file(f) print "Input name %s, output name %s" % (f, f2)
Mitch Frazier is an Associate Editor for Linux Journal.
Getting Started with DevOps - Including New Data on IT Performance from Puppet Labs 2015 State of DevOps Report
August 27, 2015
12:00 PM CDT
DevOps represents a profound change from the way most IT departments have traditionally worked: from siloed teams and high-anxiety releases to everyone collaborating on uneventful and more frequent releases of higher-quality code. It doesn't matter how large or small an organization is, or even whether it's historically slow moving or risk averse — there are ways to adopt DevOps sanely, and get measurable results in just weeks.
Free to Linux Journal readers.Register Now!
|Secure Server Deployments in Hostile Territory, Part II||Jul 29, 2015|
|Hacking a Safe with Bash||Jul 28, 2015|
|KDE Reveals Plasma Mobile||Jul 28, 2015|
|Huge Package Overhaul for Debian and Ubuntu||Jul 23, 2015|
|diff -u: What's New in Kernel Development||Jul 22, 2015|
|Shashlik - a Tasty New Android Simulator||Jul 21, 2015|
- Secure Server Deployments in Hostile Territory, Part II
- Hacking a Safe with Bash
- KDE Reveals Plasma Mobile
- Huge Package Overhaul for Debian and Ubuntu
- Home Automation with Raspberry Pi
- The Controversy Behind Canonical's Intellectual Property Policy
- Shashlik - a Tasty New Android Simulator
- Embed Linux in Monitoring and Control Systems
- diff -u: What's New in Kernel Development
- General Relativity in Python