实验背景:

让工作自动化,这是很多人的在纷繁复杂的工作环境中想要达到的,尤其是一些大量的重复性劳动。而程序员则被大家认为可以实现这一目标的首选人群。这不,就有人让我来帮忙处理一堆Excel表格了。
(眼高手低的我觉得这个 so easy, 应声接下。却意外的折腾了好久。。。)

实验目标:

读取文件夹下所有Excel表格(CSV格式)的最后一行写入新文件。

实验步骤

python读取最后几行 python读取csv最后一行_python读取最后几行

代码程序

1. 遍历文件夹

#遍历文件夹
def getFileName(filepath):
    file_list = []
    for root,dirs,files in os.walk(filepath):
        for filespath in files:
            print(os.path.join(root,filespath))
            file_list.append(os.path.join(root,filespath))

    return file_list

2. 获取文件最后一行非空行

#获取文件最后一行非空行
def get_file_last_line(inputfile):
    filesize = os.path.getsize(inputfile)
    blocksize = 1024
    with open(inputfile, 'r') as f:
        last_line = ""
        if filesize > blocksize:
            maxseekpoint = (filesize // blocksize)
            f.seek((maxseekpoint - 1) * blocksize)
        elif filesize:
            f.seek(0, 0)
        lines = f.readlines()
        if lines:
            lineno = 1
            while last_line == "":
                last_line = lines[-lineno].strip()
                lineno += 1
        print (last_line)
        return last_line

3.写入新文件

def write_csv(data):
    
    with open(outfile,'a+') as f:
    	#这里要加上delimiter=‘,’ 表示以逗号作为分隔符,将读取到的数据重新写入新文件
        csv_write = csv.writer(f,delimiter=',')
     
        csv_write.writerow((str(data),))

open()函数参数说明
r 只能读,即带r的文件必须先存在
r+ 可读可写 不会创建不存在的文件 从顶部开始写 会覆盖之前此位置的内容
w+ 可读可写 如果文件存在 则覆盖整个文件不存在则创建 ,要close 之后才算完成写入
w 只能写 覆盖整个文件 不存在则创建
a 只能写 从文件底部添加内容 不存在则创建
a+ 可读可写 从文件顶部读取内容 从文件底部添加内容 不存在则创建
r+可读可写,不会创建不存在的文件。如果直接写文件,则从顶部开始写,覆盖之前此位置的内容,如果先读后写,则会在文件最后追加内容。

r、rb、rt区别

使用’r’一般情况下最常用的,但是在进行读取二进制文件时,可能会出现文档读取不全的现象;

使用’rb’按照二进制位进行读取的,不会将读取的字节转换成字符,二进制文件用二进制读取用’rb’ ;

rt模式下,python在读取文本时会自动把\r\n转换成\n,文本文件用二进制读取用‘rt’;

中间遇到的问题

写到文件中的数据分隔的不正确,

本来是这样的数据82.1875,41.99480057,1689,11.79143657,1

python读取最后几行 python读取csv最后一行_Python_02


由于最开始是这样写的

csv_write = csv.writer(f)
 
 csv_write.writerow(data)

然后写到表中的数据就成了这样。。

每个数据单独在一格。

python读取最后几行 python读取csv最后一行_python读取最后几行_03


逗号分隔符

使用逗号分隔符,下面一行不改,左右数据却都写在了第一列。

csv_write = csv.writer(f,delimiter=’,’)

python读取最后几行 python读取csv最后一行_Python_04


最后一行修改为下面代码,.将其作为一个元组

writer.writerow((str(row),))
总算OK了。。

4 程序

#!/usr/bin/env python3
# coding=utf-8
import pandas as pd
import os
import os.path
import csv

from xlutils.copy import copy

def getFileName(filepath):
    file_list = []
    for root,dirs,files in os.walk(filepath):
        for filespath in files:
            print(os.path.join(root,filespath))
            file_list.append(os.path.join(root,filespath))

    return file_list


#last line
def get_file_last_line(inputfile):
    filesize = os.path.getsize(inputfile)
    blocksize = 1024
    with open(inputfile, 'r') as f:
        last_line = ""
        if filesize > blocksize:
            maxseekpoint = (filesize // blocksize)
            f.seek((maxseekpoint - 1) * blocksize)
        elif filesize:
            f.seek(0, 0)
        lines = f.readlines()
        if lines:
            lineno = 1
            while last_line == "":
                last_line = lines[-lineno].strip()
                lineno += 1
        print (last_line)
        return last_line     
     


def MergeExcel(filepath,outfile):
    #df=pd.read_csv(outfile,  engine='python')
    
    file_list=getFileName(filepath) 

    print (len(file_list))

    for each in file_list:
        
        data = get_file_last_line(each)
        write_csv(data)
  

def write_csv(data):
    
    with open(outfile,'a+') as f:
        csv_write = csv.writer(f,delimiter=',')
       
      
        csv_write.writerow((str(data),))
        
if __name__ == '__main__':

    filepath='/home//file/table_file'
    outfile = '/home//file/result.csv'
    MergeExcel(filepath, outfile)