科研小白的学习笔记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()