jy23451531
2019-07-13 12:48
采纳率: 50%
浏览 1.4k

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))
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • threenewbee 2019-07-13 13:11
    已采纳

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

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

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

    打赏 评论
  • dabocaiqq 2019-07-13 13:43

    具体还是要看你的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()
    
    打赏 评论
  • zqbnqsdsmd 2019-07-13 13:44

    导入所需的包

    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'表示附加方式写入,文件原有内容不会被清除

    打赏 评论
  • a22222222q 2019-07-13 13:46

    首先给定两个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'表示附加方式写入,文件原有内容不会被清除

    打赏 评论

相关推荐 更多相似问题