文件夹中的所有内容上移,并修改文件名
import os
import re
import shutil
o_dir = "C:\Users\name\Desktop <指定文遍历的文件夹路径> "
dirs = os.listdir(o_dir) #文件夹
for i in dirs: # 遍历所有当前路径下的文件夹
# print(i)
absolutepath = o_dir + i+"\\" #得到文件夹所在的绝对路径
list = os.listdir(absolutepath)#文件夹下的内容
# print(absolutepath)
for f in list:#遍历
# print(f)
oldname = absolutepath + f #文件所在地址
newname = o_dir + f #目标地址
# os.rename(oldname, newname)#直接移出
shutil.copy2(oldname,newname)
print("%s====>>>%s \n" % (oldname, newname))
FindName = "2021-12-14- <指定要替换的名称>"
ReplaceName = ""
os.chdir(o_dir)
for filename in list:
NewReplace = re.sub(FindName, ReplaceName, filename)
print(NewReplace)
os.rename(filename, NewReplace)
部分改进 (根据文件名称,移出文件并创建对应文件夹)
import os
import re
import shutil
'''
函数作用:移除文件夹中的指定文件
输入:
o_dir为包含多个子文件夹的地址
输出:
创建A1下,A2下,A3下,A4下四个文件夹,并添加对应文件
'''
def upDIR(o_dir):
dirs = os.listdir(o_dir) #文件夹
for i in dirs: # 遍历所有当前路径下的文件夹
# print(i)
absolutepath = o_dir + i+"\\" #得到文件夹所在的绝对路径
list = os.listdir(absolutepath)#文件夹下的内容
print(absolutepath)
for f in list:#遍历
# print(f)
if f.find("A1下") != -1 and f.find("Peak") == -1:
dst_dir = o_dir+"A1下"+"\\"
oldname = absolutepath + f #文件所在地址
newname = dst_dir + f #目标地址
# os.rename(oldname, newname)#直接移出
if os.path.exists(dst_dir):
shutil.copy2(oldname,newname)#复制移出
print("%s====>>>%s \n" % (oldname, newname))
else:
os.mkdir(dst_dir)
shutil.copy2(oldname,newname)#复制移出
print("%s====>>>%s \n" % (oldname, newname))
elif f.find("A2下") != -1 and f.find("Peak") == -1:
dst_dir = o_dir+"A2下"+"\\"
oldname = absolutepath + f #文件所在地址
newname = dst_dir + f #目标地址
# os.rename(oldname, newname)#直接移出
if os.path.exists(dst_dir):
shutil.copy2(oldname,newname)#复制移出
print("%s====>>>%s \n" % (oldname, newname))
else:
os.mkdir(dst_dir)
shutil.copy2(oldname,newname)#复制移出
print("%s====>>>%s \n" % (oldname, newname))
elif f.find("A3下") != -1 and f.find("Peak") == -1:
dst_dir = o_dir+"A3下"+"\\"
oldname = absolutepath + f #文件所在地址
newname = dst_dir + f #目标地址
# os.rename(oldname, newname)#直接移出
if os.path.exists(dst_dir):
shutil.copy2(oldname,newname)#复制移出
print("%s====>>>%s \n" % (oldname, newname))
else:
os.mkdir(dst_dir)
shutil.copy2(oldname,newname)#复制移出
print("%s====>>>%s \n" % (oldname, newname))
elif f.find("A4下") != -1 and f.find("Peak") == -1:
dst_dir = o_dir+"A4下"+"\\"
oldname = absolutepath + f #文件所在地址
newname = dst_dir + f #目标地址
# os.rename(oldname, newname)#直接移出
if os.path.exists(dst_dir):
shutil.copy2(oldname,newname)#复制移出
print("%s====>>>%s \n" % (oldname, newname))
else:
os.mkdir(dst_dir)
shutil.copy2(oldname,newname)#复制移出
print("%s====>>>%s \n" % (oldname, newname))
'''
函数作用:替换文件名并保存
输入:
1.FindName为原字符串
2.ReplaceName为替换字符串
3.dst_dir为目标地址
输出:
替换之后保存在dst_dir中
'''
def reName(FindName,ReplaceName,dst_dir):
#替换文件名
os.chdir(dst_dir)
list = os.listdir(dst_dir)#文件夹下的内容
for filename in list:
NewReplace = re.sub(FindName, ReplaceName, filename)
print(NewReplace)
os.rename(filename, NewReplace)
if __name__ == '__main__':
o_dir = "D:\\soft\\数据采集系统\\2022-02-22\\0KG\\"
# dst_dir = o_dir+"A1下\\"
upDIR(o_dir)
# reName(FindName="2022-2-18-",ReplaceName="",dst_dir=dst_dir)
批量读取.csv文件指定列,并汇总到.xlsx文件中
#!/usr/bin/env python3
# coding: utf-8
import csv
import os
from pandas import DataFrame
import pandas as pd
o_dir = "D:\\soft\\A3\\ <需批量处理的文件所在的路径>"
dirs = os.listdir(o_dir) #文件
dirs.sort(key=lambda x: int(x.split("g-")[0].split("下-")[1]))#排序
print(dirs)
writer= pd.ExcelWriter(o_dir+'数据.xlsx') #将内容写入新建的.xlsx文件中
for x in range(1,3):
count=0
for i in dirs: # 遍历所有当前路径下的文件
# print(i)
count=count+1
absolutepath = o_dir + i #得到文件所在的绝对路径
if x==1:
rbook = pd.read_csv(absolutepath, usecols=[9],encoding='gbk')
# print(rbook,"\n\n")
rbook.to_excel(excel_writer=writer,encoding="utf_8_sig",index=False,startcol=count,sheet_name='Sheet'+str(x))
else:
rbook = pd.read_csv(absolutepath, usecols=[12],encoding='gbk')
# print(rbook,"\n\n")
rbook.to_excel(excel_writer=writer,encoding="utf_8_sig",index=False,startcol=count,sheet_name='Sheet'+str(x))
writer.save()
问题
- 运行结果,两个选取的列在不同的Sheet中。
- 读取.csv时注意编码格式为"gbk",写入.xlsx中的编码格式为"utf_8_sig"。
- pd.read_csv()函数的usecols参数使用数字12指定读取的列,也可用列名表示可见函数说明。但在实验中使用列名表示会出错。
函数说明
代码中 pd.read_csv( ) 用到了 filepath_or_buffer ,usecols,encoding 三个参数,下面是重要参数说明:
filepath_or_buffer : 路径 URL 可以是http, ftp, s3, 和 file.
sep: 指定分割符,默认是’,’C引擎不能自动检测分隔符,但Python解析引擎可以
delimiter: 同sep
delimiter_whitespace: True or False 默认False, 用空格作为分隔符等价于spe=’\s+’如果该参数被调用,则delimite不会起作用
header: 指定第几行作为列名(忽略注解行),如果没有指定列名,默认header=0; 如果指定了列名header=None
names: 指定列名,如果文件中不包含header的行,应该显性表示header=None
index_col: 默认为None 用列名作为DataFrame的行标签,如果给出序列,则使用MultiIndex。如果读取某文件,该文件每行末尾都有带分隔符,考虑使用index_col=False使panadas不用第一列作为行的名称。
usecols: 默认None 可以使用列序列也可以使用列名,如 [0, 1, 2] or [‘foo’, ‘bar’, ‘baz’],选取的列
as_recarray: 默认False , 将读入的数据按照numpy array的方式存储,0.19.0版本后使用 pd.read_csv(…).to_records()。 注意,这种方式读入的na数据不是显示na,而是给以个莫名奇妙的值
squeeze: 默认为False, True的情况下返回的类型为Series
prefix: 默认为none, 当header =None 或者没有header的时候有效,例如’x’ 列名效果 X0, X1, …
mangle_dupe_cols: 默认为True,重复的列将被指定为’X.0’…’X.N’,而不是’X’…’X’。如果传入False,当列中存在重复名称,则会导致数据被覆盖。
dtype: E.g. {‘a’: np.float64, ‘b’: np.int32} 指定数据类型
engine: {‘c’, ‘python’}, optional 选择读取的引擎目前来说C更快,但是Python的引擎有更多选择的操作
skipinitialspace: 忽略分隔符后的空格,默认false,
skiprows: list-like or integer or callable, default None 忽略某几行或者从开始算起的几行
skipfooter: 从底端算起的几行,不支持C引擎
nrows: int 读取的行数
na_values: 默认None NaN包含哪些情况,默认情况下, ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’, ‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’, ‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘n/a’, ‘nan’, ‘null’. 都表现为NAN
keep_default_na: 如果na_values被定义,keep_default_na为False那么默认的NAN会被改写。 默认为True
na_filter: 默认为True, 针对没有NA的文件,使用na_filter=false能够提高读取效率
skip_blank_lines: 默认为True,跳过blank lines 而且不是定义为NAN
thousands: 千分位符号,默认‘,’
decimal: 小数点符号,默认‘.’
encoding: 编码方式
memory_map: 如果为filepath_or_buffer提供了文件路径,则将文件对象直接映射到内存上,并直接从那里访问数据。使用此选项可以提高性能,因为不再有任何I/O开销。
low_memory: 默认为True 在块内部处理文件,导致分析时内存使用量降低,但可能数据类型混乱。要确保没有混合类型设置为False,或者使用dtype参数指定类型。请注意,不管怎样,整个文件都读入单个DataFrame中,请使用chunksize或iterator参数以块形式返回数据。(仅在C语法分析器中有效)
注:与read_excel类似
修改版本 (增加参数选择功能)
#!/usr/bin/env python3
# coding: utf-8
import csv
import os
from pandas import DataFrame
import pandas as pd
import argparse
'''
函数作用:提取多个excel文件指定列,并写入新的文档
输入:
1.path 包含多个子文件夹的目录
2.DATADIR 需提取文件的子文件夹目录
3.num 循环次数,与需提取得的列数对应
输出:
在 path+DATADIR 的地址下生成新文件NewData.xlsx
'''
def extractExcel(path,DATADIR,num):
o_dir = os.path.join(path,DATADIR,'')
dirs = os.listdir(o_dir) #文件
dirs.sort(key=lambda x: int(x.split("g-")[0].split("下-")[1]))#排序
print(dirs)
writer= pd.ExcelWriter(o_dir+'NewData.xlsx')
for x in range(1,num):
count=0
for i in dirs: # 遍历所有当前路径下的文件
# print(i)
count=count+1
absolutepath = o_dir + i #得到文件所在的绝对路径
if x==1:#存入sheet1中
rbook = pd.read_csv(absolutepath, usecols=[9],encoding='gbk')#[9]为第9列数据
# print(rbook,"\n\n")
rbook.to_excel(excel_writer=writer,encoding="utf_8_sig",index=False,startcol=count,sheet_name='Sheet'+str(x))
else:
rbook = pd.read_csv(absolutepath, usecols=[12],encoding='gbk')#[12]为第12列数
# print(rbook,"\n\n")
rbook.to_excel(excel_writer=writer,encoding="utf_8_sig",index=False,startcol=count,sheet_name='Sheet'+str(x))
writer.save()
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='input this argparse')
parser.add_argument("--path", type=str,
default="D:/soft/数据采集系统/2022-02-22/0KG/")
parser.add_argument("--DataDIR", type=str,
default="A1下")
parser.add_argument("--num", type=int, default=3)
args = parser.parse_args()
# print(args.path)
# print(args.num)
extractExcel(path=args.path,DATADIR=args.DataDIR,num=args.num)