天天看點

自定義PYTHON批量修改EXCEL單元格内文本(增加字元)的函數

By Mejias

背景:如圖所示,下列有一個表格,

自定義PYTHON批量修改EXCEL單元格内文本(增加字元)的函數

在具體的工作中,要求某些列長度一緻,未達到指定長度的單元格前面需要加‘0‘直到指定長度。同時要求第二列’gl_name‘的開頭都為’gl_‘。

自定義PYTHON批量修改EXCEL單元格内文本(增加字元)的函數
自定義PYTHON批量修改EXCEL單元格内文本(增加字元)的函數

思路:dataFrame的每一個單獨的資料都可可以被操作,即可以對其進行字元串操作。

如下所示,我們能夠通過字元操作去修改單元格的值。即可以實作向單元格增加字元擴充單元格的長度。

#fill gl
gl = list(df1.loc[:,'GL'])
for i in range(len(gl)):
    txt = df1.loc[i,'GL']
        if txt[0:2]!='gl':#判斷GL列每個單元格開頭是不是’gl_’,不是的話加入
            df1.loc[i,'GL'] = 'gl' + df1.loc[i,'GL']
           

從這個思路出發,筆者自定義了兩個普遍使用的方法,來實作工作需求。

自定義的方法:

第一個方法ZeroAutoFill(table,column_name,column_length)實作前面填‘0‘直到指定長度:

{Table:dataFrame;column_name:需要填充的列;column_length:需要達到的長度}

第二個方法Fill(table,column_name,content)實作開頭非指定内容時增加指定内容:

{Table:dataFrame;column_name:需要填充的列;content:開頭要求的内容}

#Function ZeroAutoFill
def ZeroAutoFill(table,column_name,column_length):
    listC = list(table.loc[:,column_name])
    count = 0
    
    for i in range(len(listC)):
        b = "0"
        if str(table.loc[i,column_name])!='0':#判斷替換空格之前是否為空格
            count = column_length - len(str(listC[i]))#隻需要對有實際值的asin去做添加“0”
            if count > 1:
                for j in range(1,count):
                    b = b + '0'#根據需要達到的字元串長度确定此次需要增加的'0'的個數,如需要長度為2,這裡range(1,2)條件就會将b變成'00'
                table.loc[i,column_name] = b + str(table.loc[i,column_name]) 
            elif count == 1:#如果還差1個0就達到指定長度,那麼不需要改變要增加的字元串b的值,因為b的初值是一個'0'
                table.loc[i,column_name] = b + str(table.loc[i,column_name]) 
            else:#如果不差(即已經為指定長度,那麼就不需要拼接字元串
                continue
            
#Function Fill
def Fill(table,column_name,content):
    listD = list(table.loc[:,column_name])
    leftLen = len(content)
    for i in range(len(listD)):
        txt = str(table.loc[i,column_name])
        if txt[0:leftLen]!=content:
            table.loc[i,column_name] = content + txt
           

實作效果:

自定義PYTHON批量修改EXCEL單元格内文本(增加字元)的函數

對excel操作的整體代碼:

import pandas as pd
import numpy as np
import os

a = os.getcwd()
os.chdir(r'%s'%a)

filelist = []

list_link=[]

filelist2 = [] 

for root, dirs,files in os.walk(".",topdown = False):
    for name in files:
        str1 = os.path.join(root,name)
        if str1.split('.')[-1] == 'xlsx':
            filelist.append(str1)
    
for i in filelist:
    
    name = i.split('\\')[1]
    filelist2.append(name)

for i in range(len(filelist2)):
    list_count = pd.read_excel(r'%s'%filelist2[i],dtype = str)
    list_link.append(list_count)
    
df1 = list_link[0]
df1.fillna(value = '0',inplace=True)#替換空值
df1.to_excel('替換空值後.xlsx')

#Function ZeroAutoFill
def ZeroAutoFill(table,column_name,column_length):
    listC = list(table.loc[:,column_name])
    count = 0
    
    for i in range(len(listC)):
        b = "0"
        if str(table.loc[i,column_name])!='0':#判斷替換空格之前是否為空格
            count = column_length - len(str(listC[i]))#隻需要對有實際值的asin去做添加“0”
            if count > 1:
                for j in range(1,count):
                    b = b + '0'#根據需要達到的字元串長度确定此次需要增加的'0'的個數,如需要長度為2,這裡range(1,2)條件就會将b變成'00'
                table.loc[i,column_name] = b + str(table.loc[i,column_name]) 
            elif count == 1:#如果還差1個0就達到指定長度,那麼不需要改變要增加的字元串b的值,因為b的初值是一個'0'
                table.loc[i,column_name] = b + str(table.loc[i,column_name]) 
            else:#如果不差(即已經為指定長度,那麼就不需要拼接字元串
                continue
            
#Function Fill
def Fill(table,column_name,content):
    listD = list(table.loc[:,column_name])
    leftLen = len(content)
    for i in range(len(listD)):
        txt = str(table.loc[i,column_name])
        if txt[0:leftLen]!=content:
            table.loc[i,column_name] = content + txt
            
#all columns that needs to be updated
columns = ['asin','HTS_code','PCR_code']
length =  [10,10,8]
for i in range(len(columns)):
    ZeroAutoFill(df1,columns[i],length[i])
Fill(df1,'gl_name','gl_')

df1.to_excel('修改後的表格.xlsx',index =False)