使用 Python 和 pyuno 将电子表格转换为 CSV 文件,第 2 部分
于 2009 年 1 月 14 日
使用我们上周开发的 SSConverter 类,该类使用了前一周的 OORunner 类,本周我们将创建一个 Python 函数,允许我们通过动态转换将电子表格用作 CSV 文件。
与之前的两段代码不同,这段代码没有使用 pyuno 的任何新功能。 实际上非常简单:该函数接受一个可以是电子表格文件或 CSV 文件的文件名
- 如果该名称是指电子表格文件,则检查相应的 CSV 文件,如果不存在则创建它。 如果它确实存在,那么会检查以确保它比电子表格文件更新,如果不是,则重新创建。
- 如果该名称是指 CSV 文件,则再次检查以确保它比电子表格文件更新,如果电子表格更新,则重新创建它。
在任何一种情况下,都会返回 CSV 文件的名称。 用法很简单
csvfile = check_csv_file(ifile)
如果直接运行,则运行测试代码,该代码接受任意数量的命令行参数。 测试代码对每个命令行参数调用该函数。
在没有 CSV 文件的情况下在电子表格上运行时,它会创建 CSV 文件并返回其名称
$ python check_csv_file.py jj.xls
Creating jj.csv from jj.xls
Input name jj.xls, output name jj.csv
再次在同一电子表格上运行时,它只会返回 CSV 文件名,因为 CSV 文件已经存在并且比电子表格更新
$ python check_csv_file.py jj.xls
Input name jj.xls, output name jj.csv
在 CSV 文件上运行时,它会返回 CSV 文件名
$ python check_csv_file.py jj.csv
Input name jj.csv, output name jj.csv
在修改电子表格后在 CSV 文件上运行时,它会重新创建 CSV 文件并返回其名称
$ touch jj.xls
$ python check_csv_file.py jj.csv
Recreating jj.csv from jj.xls
Input name jj.csv, output name jj.csv
该函数的源代码如下
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)[0]
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)