我有一个输出,其中需要更新以将小数转换为整数,但它目前位于列表中。
以下是当前输出:
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,去掉小数):
s12,NONE,s11:172|s17:172|s14:67|s10:67|s19:67|s13:67|
s14,NONE,s13:449|s11:172|s17:172|s12:67|这是我目前使用代码的地方:
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发布于 2015-05-31 04:45:55
实际上,你没有替换文本中的任何东西,相反,你可以在列表理解中使用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}).*'我会检测:之后的一个数字,然后给它们点上两位数,然后根据你需要的每一件事,把整型数和两位小数放在一个捕获组中,然后根据服装条件在你的文本中替换它们。
为了更好地理解,我在这里扩展了列表理解:
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发布于 2015-05-31 04:51:57
您只需打开两个文件,一个用于读取,另一个用于写入。
对于输入文件中的每一行,我们将其拆分在","上,这将给我们提供3个字段,并使用3个变量作为rec_1, rec_2, rec_3来捕获它们,我们还删除了尾随的"|",使用.strip()方法字符,因为它稍后将在拆分数据时中断。
然后,我们在"|"上拆分第三个变量,在":"上再次拆分,以获得2个字符串,然后将第二个字符串转换为浮点型,将其与因子(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|发布于 2015-05-31 05:08:02
对|进行拆分、解包、强制转换为float 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="."将to文件保存在当前目录中,这样我们以后就可以使用它。delete=False确保当我们离开with块时文件不会被删除,然后我们只需调用with外部的move来用更新后的文件替换原始文件。
或者使用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")https://stackoverflow.com/questions/30551134
复制相似问题