python合并具有相同表头的多个csv文件

科研小白的学习笔记1.0

开始做研究生毕设了,发现写过的代码学过的知识很容易忘记,自己调试代码时候也遇到不少坑,在这里记录一下,希望可以帮到大家!

import os
import pandas as pd

#定义函数
def merge_csv():
   #输出路径和结果存放路径
   input_path = r'F:/yxy_test/hebing_csv/
   result_path = r'F:/yxy_test/'
   result_name = r'Result1.0.csv‘

   #读取输入路径下的所有文件
   os.chdir(input_path)
   file_list = os.listdir()
   #读取第一个csv表的表头并保存
   df = pd.read_csv(input_path+file_list[0],encoding="utf_8_sig")
   df.to_csv(result_path+result_name,encoding="utf_8_sig",index=False)
   #遍历文件夹内所有csv文件,并且header=False意为不重新载入表头
   for i in range(1,len(file list)):
       if not file_list[il.startswith("."):
           df = pd.read_csv(input_path+file_list[i],encoding="utf_8_sig")
           df.to_csv(result_path+result_name,encoding="utf_8_sig",index=False,header=False,mode='a+'
           
#调用           
if __name__=='__main__':
   merge_csv()

下面是我遇到的问题及解决方法。
1.一开始encoding的值是gbk,然后拼接的csv表里中文成了乱码。
解决办法:换了utf-8发现还是不行,百度了一下改成utf-8-sig就可以了,遇到这种问题可以多试几种编码格式,总有一种行得通。
2.我的csv文件是从1-170号,XXX_1.csv这样的格式,拼接时候发现顺序会错乱,会按照字符顺序拼接,比如说先拼接1,然后接10,然后是100,然后是101,102这样类推,直到把1开头的表拼接完才会拼接2。
解决方法:增加了下文的代码,提取所有csv文件名进行统一修改。[添加链接描述]我参考了(https://m.jb51.net/article/246524.htm)及其他文章。但是这样解决的弊端就是需要对原数据文件进行重新命名,我觉得应该有可以不重新命名就可以改正文件乱序的方法,但是我没查到相关的代码资料,只能暂时先这样,原数据的话只能自行备份了,后续我查到了相关资料再放上来。

import os
import pandas as pd
import re
def merge_csv():
	input_path = r'F:/yxy_test/duididaji/'
	result_path = r'F:/yxy_test/'
	result_name = r'Result2.0.csv'

	#csv批量改名
	os.chdir(input_path)
	original_name = os.listdir()
	for i in original_name:
		#print(i)
		text=str(i)    #文件名转为字符串
		a = re.findall(r" d+".text)   #提取文件名里的所有数字
		#print(a)
		b ="".join(a)+".csv"  #re.findaLl输出结果为字符串,需要改为普通字符,再加后缀
		#print(b)						
		os.rename(os.path.join(input_path,i),os.path.join(input_path,b))   #用新的文件名(包括后缀)替换原文件名

	#重新提取文件,进行排序
	os.chdir(input_path)
	file_list = os.listdir(input_path)
	print(file_list)
	file_list.sort(key=lambda x:int(x[:-4]))   #x[:-4]文件名从右往左数,去掉后缀.csv,只进行数字的排序
	print(file_list)

	df = pd.read_csv(input_path+file_list[o],encoding="utf_8_sig")
	df.to_csv(result_path+result_name,encoding="utf_8_sig"index=False)
	for i in range(1,len(file list)):
		if not file_list[i].startswith("."):
	df = pd.read_csv(input path+file list[ilencoding="utf 8_sig")
	df.to_csv(result_path+result name,encoding-"utf 8 sig"index-False,header=False,mode='a+')

if __name__=='__main__':
	merge_csv()

你可能感兴趣的:(pandas,python,数据分析)