使用pandas读取xlsx数据并存入txt文件
转换一个文件:
import pandas as pd
df = pd.read_excel('../data/x/ant_1.5.xlsx',usecols="C,X") # 使用pandas模块读取数据
df['Class']=df['Class'].str.replace('.','/',regex=True) # 替换 .换成/
print('开始写入txt文件...')
df.to_csv('../data/t/ant_1.5.txt', header=None, sep=' ', index=False) # 写入txt,空格分隔
print('文件写入成功!')
①读取指定列
df = pd.read_excel("data.xlsx", usecols=[0, 5]) # 指定读取第1列和第6列
# 可以用"A,F"代替[0,5]
②替换:replace()
既可以替换某列,也可以替换某行,还可以全表替换。
df.replace() 或者 df[col].replace()
#参数如下:
df.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad',)
参数说明:
- to_replace:被替换的值 value:替换后的值
- inplace:是否要改变原数据,False是不改变,True是改变,默认是False
- limit:控制填充次数
- regex:是否使用正则,False是不使用,True是使用,默认是False
- method:填充方式,pad,ffill,bfill分别是向前、向前、向后填充
df.replace() 或者 df[col].replace()替换都是整个值,也即是说如果被替换值=‘asdfg’,之前的只有值等于=‘asdfg’,才可以被替换。
但是我们很多时候是值想替换局部的,比如说‘深圳地区’,替换为‘深圳市’,那么就得先str,代码如下:
main_copy['city']=main_copy['city'].str.replace('地区','市')
如果要把某一列中的.替换成/,需要regex=True(使用正则),否则会把所有字符替换成/(不知道为什么?)
正则替换
转义字符\可以转义很多字符,比如\n表示换行,\t表示制表符,字符\本身也要转义,所以\表示的字符就是
如果字符串里面有很多字符都需要转义,就需要加很多\,为了简化,Python还允许用r’‘表示’'内部的字符串默认不转义
df.replace(r'\?|\.|\$',np.nan) #和原来没有变化
df.replace(r'\?|\.|\$',np.nan,regex=True)#用np.nan替换?或.或$原字符
df.replace([r'\?',r'\$'],np.nan,regex=True)#用np.nan替换?和$
df.replace([r'\?',r'\$'],[np.nan,'NA'],regex=True)#用np.nan替换?用NA替换$符号
df.replace(regex={r'\?':None})
当然,如果不想使用inplace=True,也可以这样子表达
df=df.replace(20,30)
df.replace(20,30,inplace=True)
批量处理:
#简单的逻辑
import pandas as pd
import os
xlsx_path='../data/x/'
txt_path='../data/t/'
for xlsxfile in os.listdir(xlsx_path):
if xlsxfile == '.DS_Store':
continue
df = pd.read_excel(xlsx_path+xlsxfile,usecols="C,X")
df['Class'] = df['Class'].str.replace('.', '/', regex=True)
df.to_csv(txt_path+xlsxfile.split('.xlsx')[0]+'.txt', header=None, sep=' ', index=False)
os.listdir()用于返回指定文件夹下包含的所有文件或文件夹名字的列表
.DS_Store:隐藏文件。这里用来过滤隐藏文件
2022.3.11
pandas为一列数据添加前后缀
将DataFrame的列视为str,随后利用str的连接操作即可。
# 添加前缀
newDF = strs + oldDF[col].astype('str')
# 添加后缀
newDF = oldDF[col].astype('str') + strs
其中oldDF为原始的DataFrame,col为列索引名,strs为需要添加的字符串,新的列将被保存在newDF中。
若其余位置需要添加代码类似,可直接按照字符串的操作进行切片与拼接。
参考为一列数据添加前后缀
根据条件添加相应的前缀:
import pandas as pd
import os
xlsx_path='../data/x/'
txt_path='../data/t/'
for xlsxfile in os.listdir(xlsx_path):
if xlsxfile == '.DS_Store':
continue
df = pd.read_excel(xlsx_path+xlsxfile,usecols="C,X")
df['Class'] = df['Class'].str.replace('.', '/', regex=True)
if (xlsxfile == 'ant_1.5.xlsx' or xlsxfile == 'ant_1.6.xlsx' or xlsxfile == 'ant_1.7.xlsx'):
df['Class'] = 'src/main/' + df['Class'].astype('str')
elif (xlsxfile == 'camel_1.2.xlsx' or xlsxfile == 'camel_1.4.xlsx' or xlsxfile == 'camel_1.6.xlsx'):
df['Class'] = 'camel-core/src/main/java/' + df['Class'].astype('str')
elif (xlsxfile == 'ivy_1.4.xlsx' or xlsxfile == 'ivy_2.0.xlsx' or xlsxfile == 'log4j_1.0.xlsx' or xlsxfile == 'log4j_1.1.xlsx' or xlsxfile == 'lucene_2.0.xlsx' or xlsxfile == 'lucene_2.2.xlsx' or xlsxfile == 'lucene_2.4.xlsx' or xlsxfile == 'poi_1.5.xlsx' or xlsxfile == 'poi_2.5.1.xlsx' or xlsxfile == 'poi_3.0.xlsx'):
df['Class'] = 'src/java/' + df['Class'].astype('str')
elif (xlsxfile == 'synapse_1.0.xlsx' or xlsxfile == 'synapse_1.1.xlsx' or xlsxfile == 'synapse_1.2.xlsx'):
df['Class'] = 'modules/core/src/main/java/' + df['Class'].astype('str')
elif (xlsxfile == 'xalan_2.4.0.xlsx' or xlsxfile == 'xalan_2.5.0.xlsx' or xlsxfile == 'xerces_1.2.0.xlsx' or xlsxfile == 'xerces_1.3.0.xlsx'):
df['Class'] = 'src/' + df['Class'].astype('str')
df.to_csv(txt_path+xlsxfile.split('.xlsx')[0]+'.txt', header=None, sep=' ', index=False)
2022.3.12
添加文件名作为前缀:
import pandas as pd
import os
xlsx_path='../data/xlsx/'
txt_path='../data/txt/'
for xlsxfile in os.listdir(xlsx_path):
if xlsxfile == '.DS_Store':
continue
df = pd.read_excel(xlsx_path+xlsxfile,usecols="C,X")
df['Class'] = df['Class'].str.replace('.', '/', regex=True)
if (xlsxfile == 'ant_1.5.xlsx' or xlsxfile == 'ant_1.6.xlsx' or xlsxfile == 'ant_1.7.xlsx'):
df['Class'] = xlsxfile.split('.xlsx')[0] + '/src/main/' + df['Class'].astype('str')
elif (xlsxfile == 'camel_1.2.xlsx' or xlsxfile == 'camel_1.4.xlsx' or xlsxfile == 'camel_1.6.xlsx'):
df['Class'] = xlsxfile.split('.xlsx')[0] + '/camel-core/src/main/java/' + df['Class'].astype('str')
elif (xlsxfile == 'ivy_1.4.xlsx' or xlsxfile == 'ivy_2.0.xlsx' or xlsxfile == 'log4j_1.0.xlsx' or xlsxfile == 'log4j_1.1.xlsx' or xlsxfile == 'lucene_2.0.xlsx' or xlsxfile == 'lucene_2.2.xlsx' or xlsxfile == 'lucene_2.4.xlsx' or xlsxfile == 'poi_1.5.xlsx' or xlsxfile == 'poi_2.5.1.xlsx' or xlsxfile == 'poi_3.0.xlsx'):
df['Class'] = xlsxfile.split('.xlsx')[0] + '/src/java/' + df['Class'].astype('str')
elif (xlsxfile == 'synapse_1.0.xlsx' or xlsxfile == 'synapse_1.1.xlsx' or xlsxfile == 'synapse_1.2.xlsx'):
df['Class'] = xlsxfile.split('.xlsx')[0] + '/modules/core/src/main/java/' + df['Class'].astype('str')
elif (xlsxfile == 'xalan_2.4.0.xlsx' or xlsxfile == 'xalan_2.5.0.xlsx' or xlsxfile == 'xerces_1.2.0.xlsx' or xlsxfile == 'xerces_1.3.0.xlsx'):
df['Class'] = xlsxfile.split('.xlsx')[0] + '/src/' + df['Class'].astype('str')
df.to_csv(txt_path+xlsxfile.split('.xlsx')[0]+'.txt', header=None, sep=' ', index=False)