大神们好,本小白最近在处理某些科研相关的数据的时候遇到些问题,用Python可以解决但是感觉做法很麻烦,请教下有没有更简单的方法?
需要处理的文件是这种结构:
16000
timestep:1000
1 1 num1 num2 num3
2 1 num4 num5 num6
3 1 num7 num8 num9
4 2 num10 num11 num12
……
其结构为:第一、二行是两个标识,不用管。
第3-16002行是16000行数据,(其实不止16002行但是只需要前16000行数据)
每行5个,分别是序号, 随机的1or2, 3个浮点数。
现在需要将其中那个 随机的1or2 替换掉,如果原本是1,替换为Fe;如果原本是2,替换为Cr。其他内容不变。
于是用了很麻烦的方法解决了问题:
#!/usr/bin/python
import os
file=open("c.out",'r+')
lines=file.readlines()
file2=open('d.out','w+')
file2.write("16000\n")
file2.write("timestep:1000\n")
for line in lines[2:16003]:
f=line.split(' ')
if f[1]=="1":
f[1]='Fe'
elif f[1]=="2":
f[2]='Cr'
else:
pass
str=' '.join(f)
file2.write(str)
file2.close()
os.rename('d.out','c.out')
大致思路是:读取待修改文件c.out的每一行,拆成列表,用列表的第二个元素f[1]做判断并赋值,将列表重新组合成字符串,写进文件d.out中,最后将d.out重命名(替换)为c.out。
感觉这个方法太麻烦了!有没有什么更简单的方法可以解决这个问题呢?不要跟我说用sed。
如果你的数据是存在数据库里面的,那么很简单直接数据库里面修改就好了,如果是文件的话(如果不是非要用程序来解决),那么直接打开文件ctrl+f 搜索 空格 1 空格
然后全部替换,之后再替换2就是了。如果非要用程序的话也是不难(程序员,无所畏惧)
lines = open('test1.txt').readlines() #打开文件,读入每一行
fp = open(''test2.txt','w') #打开你要写得文件test2.txt
for s in lines:
# replace是替换,write是写入
fp.write( s.replace(' 1 ',' Fe ').replace(' 2 ',' Cr '))
因为随机数和前后都有空格间隔出来,这样的话直接替换所有的 1 , 2 ,是不会出现修改错误的情况的
只能想到这个
定义元组t=('Cr','Fe')
然后你的f[1]
t[f[1]%2]直接返回'Cr'或者'Fe'
不过好像少不了几行。
这个问题最近简便的方案就是使用pandas
#coding:utf8
import sys
from pandas import DataFrame #DataFrame通常来装二维的表格
import pandas as pd #pandas是流行的做数据分析的包
#给原数据加上表头
name=['No','a','b','c','d']
#使用read_csv方法读取数据,返回到result是dataFrame。
result=pd.read_csv('c.out',skiprows=[0,1],nrows=16002,names=name,sep='\s+',index_col='No')
#print(result) 你可以打印出来看看
#写文件。写序列号,不写表头,写第bcd列,以空格为分界
result.to_csv('d.out',header=False,columns=['b','c','d'],sep=' ')
实际上两行代码解决问题。
不好意思,刚没看到你还要替换。重新传一下。
#coding:utf8
import sys
from pandas import DataFrame #DataFrame通常来装二维的表格
import pandas as pd #pandas是流行的做数据分析的包
#给原数据加上表头
name=['No','a','b','c','d']
#使用read_csv方法读取数据,返回到result是dataFrame。
result=pd.read_csv('c.out',skiprows=[0,1],nrows=16002,names=name,sep='\s+',index_col='No')
#替换第二列也就是a列
result['a']=result['a'].replace([1,2],['Fe','Cr'])
#写文件。写序列号,不写表头,以空格为分界
result.to_csv('d.out',header=False,sep=' ')