文件操作
规范文件名
# 文件夹名字的处理
import re
def validatetitle(title): # 将无效的文件名字修改
rstr='[/\:*?<>|@]'
new_title=re.sub(rstr,'_',title) # 将文件夹名不能包含的字符替换为下划线
return new_title
validatetitle(':*fdkfjdlkf?')
# output: '__fdkfjdlkf_'
Pandas文件导出
- 多个DataFrame导入到同一个工作簿
#常规用法
ew = pd.ExcelWriter("sheet123.xlsx") #先定义要存入的文件名xxx,然后分别存入xxx下不同的sheet
df_01.to_excel(ew, "sheet1", index=False)
df_02.to_excel(ew, "sheet2", index=False)
df_03.to_excel(ew, "sheet3", index=False)
ew.save()
#循环使用
sheet123 = pd.ExcelWriter("sheet123.xlsx")
for i in range(10):
df.to_excel(sheet123,"sheet" + str(i))
sheet123.save()
- 多个DataFrame导入到同一张表里面
sheet123 = pd.ExcelWriter("sheet123.xlsx")
df_01.to_excel(sheet123) #从第1行第1列开始写数据
df_02.to_excel(sheet123, startcol=8) #从第1行第9列开始
df_03.to_excel(sheet123, startrow=10) #从第11行第1列
df_04.to_excel(sheet123, startrow=10, startcol=8) #从第11行第9列
sheet123.save()
Pandas不同文件导出的内存比较
# 导出为csv文件
df.to_csv("data.csv")
#导出为pkl文件
df.to_pickle("data.pkl")
pd.read_pickle("data.pkl")
# 导出为压缩文件
data_20_01.to_csv('sample.csv.gz', compression='gzip')
pd.read_csv('sample.csv.gz', compression='gzip', index_col=0)
# 这里的'sample.csv.gz'是将文件先保存为.csv文件,再将其压缩为.gz文件,当然即使不写.csv,最后也可以读取
- 内存占用
csv文件450M,pkl文件350M,压缩文件115M。 - 读写速度
pkl最快,csv次之,压缩文件最慢
合并Excel
将若干个工作簿中的工作表上下合并到一个工作表中
- 语法说明
xl = pd.ExcelFile(filename) # 生成 pandas.io.excel._base.ExcelFile 对象
xl.sheet_names # 获取工作簿下所有的工作表表明,如果有多个工作表,返回一个列表
xl.parse(sheet_name) # 读取单个工作表的内容
- 示例
df_all = pd.DataFrame()
for file in ['文件01.xlsx','文件02.xlsx']:
xl = pd.ExcelFile(file)
sheet_names = xl.sheet_names # 返回所有的sheet名,是一个列表
for sheet_name in sheet_names:
df_all = pd.concat([df_all, xl.parse(sheet_name)])
文件解压缩
import zipfile
with zipfile.ZipFile('需解压的文件名.zip', 'r') as files:
files.extractall('解压后的文件名')
目录操作
os.getcwd() # 返回当前工作路径
os.path.abspath('data') # 返回文件或目录所在的路径
os.makedirs("data") # 新建文件夹
try:
os.makedirs("data")
except:
print('文件夹已存在')
合并目录下的文件
- 获取目录下的文件名
方法一
list_name = []
for i,j,k in os.walk('data_all/'):
list_name.extend((i,j,k)[2])
os.walk(top, topdown=True, onerror=None, followlinks=False)
对于以top为根的目录树中的每个目录(包括top本身,但不包括’.‘和’…‘),生成一个3元组:(dirpath,目录名,文件名)
dirpath是一个字符串,是到目录的路径;dirnames是dirpath中子目录的名称列表(不包括’.‘和’…‘);文件名是dirpath中非目录文件的名称列表。
请注意,列表中的名称只是名称,没有路径组件。要获得dirpath中的文件或目录的完整路径(以top开始),请执行os.path.join(dirpath, name)。
如果可选参数’topdown’为true或未指定,则一个目录的三元组会在其任何子目录的三元组之前生成(目录是自顶向下生成的)。
如果topdown为false,则目录的三元组是在其所有子目录的三元组之后生成的(目录是自下而上生成的)。
当topdown为true时,调用者可以就地修改dirnames列表(例如,通过del或slice赋值),而walk只会递归地进入那些名称仍在dirnames中的子目录;
这可以用来删除搜索,或者强制执行特定的访问顺序。
当topdown为false时修改dirnames对os.walk()的行为没有影响,因为dirnames中的目录在dirnames本身生成时已经生成了。
无论topdown的值是多少,子目录列表都是在生成目录及其子目录的元组之前检索的。
默认情况下,os.scandir()调用产生的错误被忽略。
如果指定了可选参数’onerror’,它应该是一个函数;
它将带一个参数(一个OSError实例)被调用。
它可以报告错误以继续执行遍历,也可以抛出异常以中止遍历。
注意filename可以作为异常对象的filename属性。
默认情况下,os.walk不遵循指向支持它们的系统上的子目录的符号链接。
为了获得这个功能,将可选参数“followlinks”设置为true。
注意:如果你为top传递了一个相对路径名,不要在两次恢复walk时更改当前工作目录。
walk不会更改当前目录,并且假定客户机也不会更改。
方法二
os.listdir('data_all/')
# 什么参数都不写,默认是当前文件夹下,返回的是一个由文件名组成的列表,文件名是一个字符串
- 筛选出需要合并的文件
# 保留含有'.xlsx'的文件名
list_string= ['.xlsx']
list_text = os.listdir() # 获取当前文件夹下的文件
file_name_list = list(filter(lambda text: all([word in text for word in list_string]), list_text ))
file_name_list
- 循环读取并进行表连接
data_all = pd.DataFrame()
for file_name in file_name_list:
data = pd.read_excel(file_name)
data_all = pd.concat([data_all, data], axis=0)
更改文件类型
并不是简单修改后缀名,而是改变文件的导出格式
-
获取目标文件名:见上
-
循环批量修改
for file_name in tqdm.tqdm(file_name_list):
data = pd.read_pickle(file_name) # 使用对应的读取方式,我这里是.pkl文件
data.to_csv(file_name[:-4] + '.gz', compression='gzip') # 重新保存为压缩文件
os.remove(file_name) # 将原文件删除
del data