首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python列表进行乘法将字符串转换为整数

使用Python列表进行乘法将字符串转换为整数
EN

Stack Overflow用户
提问于 2015-05-31 04:36:20
回答 3查看 226关注 0票数 2

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

以下是当前输出:

代码语言:javascript
复制
 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|

这就是我想要的样子(注意上面冒号后面的小数是x 100,去掉小数):

代码语言:javascript
复制
 s12,NONE,s11:172|s17:172|s14:67|s10:67|s19:67|s13:67|
 s14,NONE,s13:449|s11:172|s17:172|s12:67|

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

代码语言:javascript
复制
filehandle = open(tempcsv, 'r')
for line in filehandle:
    fields = line.split(',')
    try:
        driver = fields[0]
        recs = fields[2].split('|')
        rec_str = ", ".join(recs)
        each_rec_colon = rec_str.split(':')
        rec_1 = each_rec_colon[0]
        print rec_1 # will obviously need to expand on this and then write back to file
    except:
        a = 0
EN

回答 3

Stack Overflow用户

发布于 2015-05-31 04:45:55

实际上,你没有替换文本中的任何东西,相反,你可以在列表理解中使用re.sub

代码语言:javascript
复制
>>> 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|']

下面的正则表达式

代码语言:javascript
复制
r':(\d)\.(\d{2}).*'

我会检测:之后的一个数字,然后给它们点上两位数,然后根据你需要的每一件事,把整型数和两位小数放在一个捕获组中,然后根据服装条件在你的文本中替换它们。

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

代码语言:javascript
复制
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

您还可以使用一个单独的函数,如下所示:

代码语言:javascript
复制
>>> 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
票数 0
EN

Stack Overflow用户

发布于 2015-05-31 04:51:57

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

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

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

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
s12,NONE,s11:172|s17:172|s14:67|s10:67|s19:67|s13:67|
s14,NONE,s13:449|s11:172|s17:172|s12:67|
票数 0
EN

Stack Overflow用户

发布于 2015-05-31 05:08:02

|进行拆分、解包、强制转换为float mult * 100并调用int:

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
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="."将to文件保存在当前目录中,这样我们以后就可以使用它。delete=False确保当我们离开with块时文件不会被删除,然后我们只需调用with外部的move来用更新后的文件替换原始文件。

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

代码语言:javascript
复制
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替换原始文件:

代码语言:javascript
复制
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之后:

代码语言:javascript
复制
s12,NONE,s11:172|s17:172|s14:67|s10:67|s19:67|s13:67|
s14,NONE,s13:449|s11:172|s17:172|s12:67|

您还可以通过更改循环来编写代码:

代码语言:javascript
复制
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")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30551134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档