PYTHON EXCEL转换CSV并汇总成一个文件

请大神帮忙调一下程序 DEBUG没走通 请反馈源代码非常感谢 代码如下:

#载入需要的库
import os
import pandas as pd
import glob
#excel转化为csv
def xlsx_to_csv_pd():
c=os.getcwd()
excel_list1=glob.glob('*.xls')
excel_list2=glob.glob('*.xlsx')
for a in excel_list1:
data_xls = pd.read_excel(a, index_col=0)
outfile=c+"/"+a
data_xls.to_csv(outfile, encoding='utf-8')
for b in excel_list2:
data_xls = pd.read_excel(b, index_col=0)
outfile=c+"/"+b
data_xls.to_csv(outfile, encoding='utf-8')

定义函数hebing

def hebing():
csv_list = glob.glob('*.csv') # 查看同文件夹下的csv文件数
print(u'共发现%s个CSV文件' % len(csv_list))
print(u'正在处理............')
for i in csv_list: # 循环读取同文件夹下的csv文件
fr = open(i, 'r').read()
with open('result.csv', 'rb') as f: # 将结果保存为result.csv
f.write(fr)
print(u'合并完毕!')

定义函数quchong(file),将重复的内容去掉,主要是去表头

def quchong(file):
df = pd.read_csv(file, header=0)
datalist = df.drop_duplicates()
datalist.to_csv(file)

#运行函数
if name == '__main__':

xlsx_to_csv_pd()

print("转化完成!!!" )
hebing()
quchong("result.csv")
print("已完成数据文件合并清单所处位置:"+str(file))

之前有人问类似的问题,要C#的,我用C#写了一个给他,结果那人拿了程序就跑了,再也不采纳

https://download.csdn.net/download/caozhy/10585160

我上传上来,是0分资源,白送给你。要改python的,采纳本回答可以帮你改。

具体还是要看你的excel格式

我的程序仅仅作为参考

#! /usr/bin/env python
#coding=utf-8
#writer:parming    Email:ming5536@163.com
from pyExcelerator import *
import sys
import glob
class batxls2csv:
    def __init__(self):
                pass
    def savecsv1(self,arg):
        matrixgolb = []
        for sheet_name, values in parse_xls(arg, 'cp1251'): # parse_xls(arg) -- default encoding
            matrix = [[]]
            for row_idx, col_idx in sorted(values.keys()):
                #print row_idx,col_idx
                #print matrix
                v = values[(row_idx, col_idx)]
                if isinstance(v, unicode):
                    v = v.encode('cp866', 'backslashreplace')
                else:
                    v = str(v)
                last_row, last_col = len(matrix), len(matrix[-1])
                #下一行修改过
                while last_row <=row_idx:
                    matrix.extend([[]])
                    last_row = len(matrix)

                while last_col < col_idx:
                    matrix[-1].extend([''])
                    last_col = len(matrix[-1])

                matrix[-1].extend([v])
            for row in matrix:
                 csv_row = ','.join(row)
                 matrixgolb.append(csv_row)
        return matrixgolb        
        print  matrixgolb
    def savecsv2(self):

        filelist = glob.glob("*.xls")
        for filenam in filelist:
            matrixgolb=self.savecsv1(filenam)
            namecsv=filenam[:-4]+'.csv'
            file_object = open(namecsv, 'w+')
            for item in matrixgolb:
                file_object.write(item)
                file_object.write('\n')
            file_object.close( )

if __name__ == "__main__":
    test=batxls2csv()
    test.savecsv2()

导入所需的包

import os
import pandas as pd
import glob
1
2
3
合并多个csv文件

csv_list = glob.glob('*.csv') #查看同文件夹下的csv文件数
print(u'共发现%s个CSV文件'% len(csv_list))
print(u'正在处理............')
for i in csv_list: #循环读取同文件夹下的csv文件
fr = open(i,'rb').read()
with open('result.csv','ab') as f: #将结果保存为result.csv
f.write(fr)
print(u'合并完毕!')
1
2
3
4
5
6
7
8
共发现9个CSV文件
正在处理............
合并完毕!
1
2
3
去重函数

这个函数将重复的内容去掉,主要是去表头。

df = pd.read_csv("result.csv",header=0)
1
df.info()
1

RangeIndex: 659867 entries, 0 to 659866
Data columns (total 3 columns):
UrbanRuralCode 659867 non-null object
code 659867 non-null object
name 659867 non-null object
dtypes: object(3)
memory usage: 15.1+ MB
1
2
3
4
5
6
7
8
IsDuplicated = df.duplicated()
1
True in IsDuplicated
1
True
1
这说明了这个DataFrame格式的数据含有重复项。

DataFrame.drop_duplicates函数的使用

DataFrame.drop_duplicates(subset=None, keep='first', inplace=False)
1
subset : column label or sequence of labels, optional
用来指定特定的列,默认所有列
keep : {‘first’, ‘last’, False}, default ‘first’
删除重复项并保留第一次出现的项
inplace : boolean, default False
是直接在原来数据上修改还是保留一个副本
datalist = df.drop_duplicates(keep = False)
1
datalist.info()
1

Int64Index: 659859 entries, 0 to 659866
Data columns (total 3 columns):
UrbanRuralCode 659859 non-null object
code 659859 non-null object
name 659859 non-null object
dtypes: object(3)
memory usage: 20.1+ MB
1
2
3
4
5
6
7
8
排序函数

datalist_sorted = datalist.sort_values(by = ['code']) #按1列进行升序排序
1
结果写入csv文件

datalist_sorted.to_csv("village_all.csv", sep = ',', header = True,index = False)
1
问题

Python读取文件问题

错误信息

"UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 205: illegal multibyte sequence"

1
解决方案

fr = open(i,'r').read() 改为 fr = open(i,'rb').read()
with open('result.csv','a') as f: 改为 with open('result.csv','ab') as f:
1
2
重复值问题

这里我合并了9个csv文件,检查最后合并结果发现,里面还有一个列名。这是因为9个为文件,其中8个的列名被认为是DataFrame的值,第1个的列名依旧为列名,然后再去重的过程中,8个相同值被保留了1个,所以这会导致最后的csv文件多了一个列名。

解决方案

IsDuplicated = df.duplicated() 改为 IsDuplicated = df.duplicated(keep = False) #重复数据全部去除

在将多个csv文件拼接到一起的时候,可以用Python通过pandas包的read_csv和to_csv两个方法来完成。

这里不采用pandas.merge()来进行csv的拼接,而只是通过简单的文件的读取和附加方式的写入来完成拼接。

1 import pandas as pd
2 for inputfile in os.listdir(inputfile_dir):
3 pd.read_csv(inputfile, header=None)                    #header=None表示原始文件数据没有列索引,这样的话read_csv会自动加上列索引
4 pd.to_csv(outputfile, mode='a', index=False, header=False)      #header=0表示不保留列名,index=False表示不保留行索引,mode='a'表示附加方式写入,文件原有内容不会被清除

首先给定两个CSV文件的内容
1.CSV

2.CSV

将2.CSV文件里的数据追加到1.CSV后面
直接敲写Python代码

with open('1.csv','ab') as f:
f.write(open('2.csv','rb').read())#将2.csv内容追加到1.csv的后面

在将多个csv文件拼接到一起的时候,可以用Python通过pandas包的read_csv和to_csv两个方法来完成。

这里不采用pandas.merge()来进行csv的拼接,而只是通过简单的文件的读取和附加方式的写入来完成拼接。

1 import pandas as pd
2 for inputfile in os.listdir(inputfile_dir):
3 pd.read_csv(inputfile, header=None)                    #header=None表示原始文件数据没有列索引,这样的话read_csv会自动加上列索引
4 pd.to_csv(outputfile, mode='a', index=False, header=False)      #header=0表示不保留列名,index=False表示不保留行索引,mode='a'表示附加方式写入,文件原有内容不会被清除