python使用pandas读取xlsx数据并存入txt

使用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]

参考pandas读取Excel指定列

②替换: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('地区','市')

参考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)

猜你喜欢

转载自blog.csdn.net/qq_45484237/article/details/123434392