你肯定试图在Python中重新实现SQL。我相信使用关系数据库并运行SQL查询会更好。
但是,关于问题1,您可以轻松地让用户在每行数据上输入Python表达式和eval()
。
这是一个工作示例,它使用exec
将列值绑定到局部变量(一个讨厌的黑客,我承认)。为简洁起见省略了CVS解析。
import optparse, sys
# Assume your CSV data is read into a list of dictionaries
sheet = [
{'StudentId': 1, 'StudentFirstName': 'John', 'StudentLastName': 'Doe', 'StudentZipCode': '12345', 'StudentCommuteMethod': 'Bus'},
{'StudentId': 2, 'StudentFirstName': 'Bob', 'StudentLastName': 'Chen', 'StudentZipCode': '12345', 'StudentCommuteMethod': 'Bus'},
{'StudentId': 3, 'StudentFirstName': 'Jane', 'StudentLastName': 'Smith', 'StudentZipCode': '12345', 'StudentCommuteMethod': 'Train'},
{'StudentId': 4, 'StudentFirstName': 'Dave', 'StudentLastName': 'Burns', 'StudentZipCode': '45467', 'StudentCommuteMethod': 'Bus'},
]
# Options parsing
parser = optparse.OptionParser()
parser.add_option('--filter', type='string', dest='filter')
options, args = parser.parse_args()
# Filter option is required
if options.filter is None:
print >> sys.stderr, 'error: no filter expression given'
sys.exit(1)
# Process rows and build result set
result = []
for row in sheet:
# Bind each column to a local variable (StudentId, StudentFirstName, etc.);
# this allows evaluating Python expressions on a row, for example:
# 'StudentCommuteMethod = "Bus" and StudentZipCode = "12345"'
for col, val in row.iteritems():
exec '%s = %s' % (col, repr(val))
# Apply filter to the row
if eval(options.filter):
result.append(row)
# Print out result set
for row in result:
print row
我测试使用以下的过滤器表达式:
./MyPythonScript.py --filter 'StudentCommuteMethod == "Bus" and StudentZipCode == "12345"'
./MyPythonScript.py --filter 'StudentCommuteMethod == "Bus" or StudentZipCode == "12345"'
(壳当心运行在命令行程序时引用规则。)
您似乎在使用python重新创建数据库。为什么不使用数据库? – jozzas
安装openoffice,导入并使用自动过滤功能 – 2011-09-09 05:06:03
非常一般的问题,一个简单的网络搜索提供了如下的答案: 1.看看如何解析命令行参数:http://docs.python.org/py3k/ library/argparse.html 2. UI库有几个python绑定可用:http://wiki.python.org/moin/GuiProgramming 3.“一位对编程了解不多的电气工程师:什么?编程与使用这个有关吗? – steabert