你肯定試圖在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