使用Python List乘以将String转换为Integer

时间:2015-05-30 20:36:20

标签: python

我有一个输出需要更新以将小数转换为整数,但它当前位于列表中。

这是当前的输出:

int Node::getKey()
{
    return key;
}

这就是我需要的样子(注意上面的冒号后的小数是x 100并删除小数):

$PROFILE

以下是我目前使用代码的地方:

 s12,NONE,s11:1.7260924347106847|s17:1.7260924347106847|s14:0.6795961471815897|s10:0.6795961471815897|s19:0.6795961471815897|s13:0.6795961471815897|
 s14,NONE,s13:4.498681156950466|s11:1.7260924347106847|s17:1.7260924347106847|s12:0.6795961471815897|

3 个答案:

答案 0 :(得分:0)

实际上,您没有替换文字中的任何内容,而是可以在列表理解中使用re.sub

>>> l=[[re.sub(r':(\d)\.(\d{2}).*',lambda x:':'+x.group(1)+x.group(2) if x.group(1)!='0' else ':'+x.group(2),li) for li in line.split('|')] for line in open(tempcsv, 'r')]
>>> ['|'.join(k) for k in l]
[' s12,NONE,s11:172|s17:172|s14:67|s10:67|s19:67|s13:67|', ' s14,NONE,s13:449|s11:172|s17:172|s12:67|']

以下正则表达式

r':(\d)\.(\d{2}).*'

将检测:之后的数字然后点2位数然后每个因为你需要int数和2个小数你可以把它们放在一个捕获组中然后在你的文本中替换它们在服装条件。

为了更好地理解,我在这里扩展了列表理解:

with open(tempcsv, 'r') as f :
    for line in f:
               subs=[re.sub(r':(\d)\.(\d{2}).*',lambda x:':'+x.group(1)+x.group(2) if x.group(1)!='0' else ':'+x.group(2),li) for li in line.split('|') ]
               print '|'.join(subs) f

您还可以使用以下单独的功能:

>>> def replacer(m):
...   g=m.group(1)
...   if g!=0:
...       return ':'+g+m.group(2)
...   else :
...       return ':'+m.group(2)

with open(tempcsv, 'r') as f :
    for line in f:
               subs=[re.sub(r':(\d)\.(\d{2}).*',replacer,li) for li in line.split('|') ]
               print '|'.join(subs) f

答案 1 :(得分:0)

您只需打开两个文件,一个用于阅读,另一个用于写作。

对于输入文件中的每一行,我们将其拆分为",",这将为我们提供3个字段,e将它们与3个变量一起捕获为rec_1, rec_2, rec_3,我们还删除了尾随"|",使用.strip()方法字符,因为它稍后会在分割数据时中断。

然后我们在"|"上拆分第三个变量并再次在":"上拆分以获得2个字符串,然后将第二个字符串转换为float,将其乘以factor(100),最后再连接结果一起。

with open("testing.txt", "r") as data, open("testing2.txt", "w") as out_file:
   wrt = ""
   for line in data.readlines():
      rec_1, rec_2, rec_3 = line.strip("|").split(",")
      wrt += rec_1+","+rec_2+","
      for rec in rec_3.split("|"):
         a, b = rec.split(":")
         wrt += a + ":" + str(int(float(b)*100)) + "|" #Concatenating results together.
      wrt += "\n"
   out_file.write(wrt)

<强>输出:

s12,NONE,s11:172|s17:172|s14:67|s10:67|s19:67|s13:67|
s14,NONE,s13:449|s11:172|s17:172|s12:67|

答案 2 :(得分:0)

拆分|,解包,转换为浮动mult * 100并调用int:

import csv
with open("in.csv") as f:
    r = csv.reader(f,delimiter="|")
    for row in r:
        temp = ""
        for sub in row:
            try:
                a, b = sub.split(":")
                temp += "{}:{}|".format(a, int(float(b) * 100))
            except ValueError as e:
                continue
        print(temp)

输出:

s12,NONE,s11:172|s17:172|s14:67|s10:67|s19:67|s13:67|
s14,NONE,s13:449|s11:172|s17:172|s12:67|

dir="."将tmpfile保存在当前目录中,以便我们以后可以使用它,delete=False确保在我们离开with块时不删除该文件然后我们只需要调用移出with以更新原始文件。

或使用if来捕获空字符串:

import csv
with open("in.csv") as f:
    r = csv.reader(f,delimiter="|")
    for row in r:
        temp = ""
        for sub in row:
            if sub:
                a, b = sub.split(":")
                temp += "{}:{}|".format(a, int(float(b) * 100))
        print(temp)

要更改原始文件,请写信至NamedTemporaryFile,然后使用shutil.move替换原始文件:

import csv
from tempfile import NamedTemporaryFile
from shutil import move
with open("in.csv") as f, NamedTemporaryFile(dir=".",delete=False) as out:
    r = csv.reader(f,delimiter="|")
    for row in r:
        temp = ""
        for sub in row:
            if sub:
                a, b = sub.split(":")
                temp += "{}:{}|".format(a, int(float(b) * 100))
        out.write(temp+"\n")
move(out.name,"in.csv")

in.csv之后:

s12,NONE,s11:172|s17:172|s14:67|s10:67|s19:67|s13:67|
s14,NONE,s13:449|s11:172|s17:172|s12:67|

您也可以通过更改循环来编写:

with open("in.csv") as f, NamedTemporaryFile(dir=".",delete=False) as out:
    r = csv.reader(f,delimiter="|")
    for row in r:
        for sub in row:
            if sub:
                a, b = sub.split(":")
                out.write("{}:{}|".format(a, int(float(b) * 100)))
        out.write("\n")
 move(out.name,"in.csv")