MySQL和Python:将字符串值转换为int,浮点数或什么?

时间:2013-06-12 03:52:06

标签: python mysql

我有一个字符串,其中包含以下列方式的工资信息:

salaryMixed = "£25,000 - £30,000"

有时会看起来像这样:

salaryMixed = "EUR25,000 - EUR30,000"

其他时间是这样的:

salaryMixed = "£37.50 - £50.00"

我想要做的是删除除数字值之外的所有字符,然后将这两个值分开,以便将它们放入各自的变量中,以反映低条带和高条带。到目前为止,我有:

if salaryMixed.find('£')!=-1: # found £ char
    salaryMixed = salaryMixed.replace("£", "")
if salaryMixed.find('-')!=-1: # found hyphen
    salaryMixed = salaryMixed.replace("-", "")
if salaryMixed.find(',')!=-1: # found comma
    salaryMixed = salaryMixed.replace(",", "")
if salaryMixed.find('EUR')!=-1: # found EUR
    salaryMixed = salaryMixed.replace("EUR", "")
salaryMixed = re.sub('\s{2,}', ' ', salaryMixed) # to remove multiple space

if len(salaryList) == 1:
    salaryLow = map(int, 0) in salaryList
    salaryHigh = 00000
else:
    salaryLow = int(salaryList.index(1))
    salaryHigh = int(salaryList.index(2))

但我很难理解如何将两个值分开,以及当salaryMixed不是年薪时如何处理小数点,而不是像salaryMixed = "£37.50 - £50.00"那样每小时处理小数点因为不是那个漂浮物吗?

我希望稍后在代码中将此信息存储在MySQL数据库中,但我将该表描述为:

CREATE TABLE jobs(
   job_id INT NOT NULL AUTO_INCREMENT,
   job_title VARCHAR(300) NOT NULL,
   job_salary_low INT(25),
   job_salary_high INT(25),
   PRIMARY KEY ( job_id )
);

这里最好的方法是什么?感谢。

3 个答案:

答案 0 :(得分:1)

  

我想要删除除数字值之外的所有字符   然后拆分这两个值,以便将它们放入自己的值中   反映低带和高带的相应变量。至今   我有:

好的,一步一步。删除所有字符,但删除数值(更好地保留空格和句点)

>>> testcases =  ["£25,000 - £30,000", "EUR25,000 - EUR30,000", "£37.50 - £50.00"]
>>> res = [''.join(x for x in tc if x.isdigit() or x.isspace() or x == '.') for tc in testcases]
>>> res
['25000  30000', '25000  30000', '37.50  50.00']
好的,现在将它们分开

>>> res = [x.split() for x in res]
>>> res
[['25000', '30000'], ['25000', '30000'], ['37.50', '50.00']]

转换为浮点数(十进制可能更好)

>>> res = [[float(j) for j in i] for i in res]>>> res
[[25000.0, 30000.0], [25000.0, 30000.0], [37.5, 50.0]]

加入单独的变量

>>> for low, high in res:
...     print (low, high)
... 
25000.0 30000.0
25000.0 30000.0
37.5 50.0
@patashu建议的正则表达式是通过

执行此操作的简单/懒惰方式

答案 1 :(得分:1)

这是来自python re模块的正则表达式的一个很好的例子。并且您可能希望将每小时费率上调至年度(假设您每小时平均一次

import re

def salary_band(val):
    currency = 'EUR' if 'EUR' in val else 'GBP'
    numbers = re.findall("[0-9.\,]*", val) # this will have a bunch of empty entries and two numbers
    numbers = [i.replace(",","") for i in numbers if i] # filter out empty strings, remove commas
    numbers = map(float, numbers) # convert to floats
    annual = lambda p: int(p) if p > 2000 else int( p * 1800) # your number here...
    return currency, map(annual, numbers)

print salary_band ( "gbp37.50 - gbp50.00")
print salary_band ( "EUR25,000 - EUR30,000")
>> ('GBP', [75000, 100000])
>> ('EUR', [25000, 30000])

这里我将货币类型和高/低数字作为元组返回 - 您可以轻松地将其打包到表中

答案 2 :(得分:0)

用于在db中存储值,您可以在python中使用MySQLdb库。它易于使用,并将您的数据存储到数据库中。 Here检查一下。

您可以通过apt-get install python-mysqldb

安装它