軟體應用 | Python實現CSV文件的合併與拆分

2021-12-29 數據Seminar

收錄於話題 #軟體應用 124個


啟研學社由知名學者擔任學術顧問,由高校師生與企研數據科學團隊聯合組建的,是以大數據資源及相關技術助力中國學術、智庫與行業研究為宗旨的研究組織。團隊當前的主要目標是挖掘行政、經濟與社會大數據資源在經濟學學術、智庫與相關行業研究領域中的應用價值,以學術研究為標準開展大數據治理研究,努力探索大數據分析技術融入中國經濟社會研究的可行進路。 


Part1引言

CSV(逗號分隔值文件格式,有時也稱為字符分隔值,因為分隔字符也可以不是逗號)是一種通用的、相對簡單的文件格式,被用戶、商業和科學廣泛應用。CSV最廣泛的應用是在程序(軟體)之間轉移表格數據

假設有以下場景,張三從Oracle資料庫中導出一張數據表格發送給王五,王五使用Stata軟體對該表格數據進行計量分析。從資料庫中導出的數據可以保存為txt、csv、xls、json等常見的文件格式但一般不支持保存為Stata的dta格式,所以張三導出資料庫中表格時,選擇了Stata支持的csv格式。

某次計量分析時,王五發現接收到的CSV文件很大,整個CSV文件大小約為16GB,數據量達到1500萬行,變量有20個以上。遺憾的是,王五的計算機只有16GB內存,如果將這個CSV文件完整得導入到Stata中進行處理,可能會發生內存不足的報錯。

Part2處理大CSV文件的思路

王五與張三溝通後,設計了如下的解決方案:

依次處理小CSV文件,刪除不需要的數據,縮減文件大小;

王五用上面的思路處理大CSV文件,處理得到的CSV文件大約為1GB,變量8個,數據量為20萬行,已經可以用Stata進行分析。

王五樂於分享,他把第1步和第3步的python代碼分享給大家

Part3Python代碼

python代碼如下(若要測試代碼請準備好python3.7環境並安裝pandas模塊):

類PyCSV中有兩個主要的方法:

import pandas as pd
import os
import warnings

warnings.filterwarnings('ignore')


class PyCSV:

    def merge_csv(self, save_name, file_dir, csv_encoding='utf-8'):
        """
        :param save_name: 合併後保存的文件名稱,需要用戶傳入
        :param file_dir: 需要合併的csv文件所在文件夾
        :param csv_encoding: csv文件編碼, 默認 utf-8
        :return: None
        """
        # 合併後保存的文件路徑 = 需要合併文件所在文件夾 + 合併後的文件名稱
        self.save_path = os.path.join(file_dir, save_name)
        self.__check_name()
        # 指定編碼
        self.encoding = csv_encoding
        # 需要合併的csv文件所在文件夾
        self.file_dir = file_dir
        self.__check_dir_exist(self.file_dir)
        # 文件路徑列表
        self.file_list = [os.path.join(self.file_dir, i) for i in os.listdir(self.file_dir)]
        self.__check_singal_dir(self.file_list)
        # 合併到指定文件中
        print("開始合併csv文件 !")
        for file in self.file_list:
            df = pd.read_csv(file, encoding=self.encoding)
            df.to_csv(self.save_path, index=False, quoting=1, header=not os.path.exists(self.save_path), mode='a')
            print(f"{file} 已經被合併到 {self.save_path} !")
        print("所有文件已經合併完成 !")

    def split_csv(self, csv_path, save_dir, split_line=100000, csv_encoding='utf-8'):
        """
        切分文件並獲取csv文件信息。
        :param csv_path: csv文件路徑
        :param save_dir: 切分文件的保存路徑
        :param split_line: 按照多少行數進行切分,默認為10萬
        :param csv_encoding: csv文件的編碼格式
        :return: None
        """

        # 傳入csv文件路徑和切分後小csv文件的保存路徑
        self.csv_path = csv_path
        self.save_dir = save_dir

        # 檢測csv文件路徑和保存路徑是否符合規範
        self.__check_dir_exist(self.save_dir)
        self.__check_file_exist(self.csv_path)

        # 設置編碼格式
        self.encoding = csv_encoding

        # 按照split_line行,進行切分
        self.split_line = split_line

        print("正在切分文件... ")

        # 獲取文件大小
        self.file_size = round(os.path.getsize(self.csv_path) / 1024 / 1024, 2)

        # 獲取數據行數
        self.line_numbers = 0
        # 切分後文件的後綴
        i = 0
        # df生成器,每個元素是一個df,df的行數為split_line,默認100000行
        df_iter = pd.read_csv(self.csv_path,
                              chunksize=self.split_line,
                              encoding=self.encoding)
        # 每次生成一個df,直到數據全部取玩
        for df in df_iter:
            # 後綴從1開始
            i += 1
            # 統計數據總行數
            self.line_numbers += df.shape[0]
            # 設置切分後文件的保存路徑
            save_filename = os.path.join(self.save_dir, self.filename + "_" + str(i) + self.extension)
            # 列印保存信息
            print(f"{save_filename} 已經生成!")
            # 保存切分後的數
            df.to_csv(save_filename, index=False, encoding='utf-8', quoting=1)

        # 獲取數據列名
        self.column_names = pd.read_csv(self.csv_path, nrows=10).columns.tolist()
        print("切分完畢!")

        return None

    def __check_dir_exist(self, dirpath):
        """
        檢驗 save_dir 是否存在,如果不存在則創建該文件夾。
        :return: None
        """
        if not os.path.exists(dirpath):
            raise FileNotFoundError(f'{dirpath} 目錄不存在,請檢查!')

        if not os.path.isdir(dirpath):
            raise TypeError(f'{dirpath} 目標路徑不是文件夾,請檢查!')

    def __check_file_exist(self, csv_path):
        """
        檢驗 csv_path 是否是CSV文件。
        :return: None
        """
        if not os.path.exists(csv_path):
            raise FileNotFoundError(f'{csv_path} 文件不存在,請檢查文件路徑!')

        if not os.path.isfile(csv_path):
            raise TypeError(f'{csv_path} 路徑非文件格式,請檢查!')

        # 文件存在路徑
        self.file_path_root = os.path.split(csv_path)[0]
        # 文件名稱
        self.filename = os.path.split(csv_path)[1].replace('.csv', '').replace('.CSV', '')
        # 文件後綴
        self.extension = os.path.splitext(csv_path)[1]

        if self.extension.upper() != '.CSV':
            raise TypeError(f'{csv_path} 文件類型錯誤,非CSV文件類型,請檢查!')

    def __check_name(self):
        """
        檢查文件名稱是否 .csv 結尾
        :return:
        """
        if not self.save_path.upper().endswith('.CSV'):
            raise TypeError('文件名稱設置錯誤')

    def __check_singal_dir(self, file_list):
        """
        檢查需要被合併的csv文件所在文件夾是否符合要求。
        1. 不應該存在除csv文件以外的文件
        2. 不應該存在文件夾。
        :return:
        """
        for file in file_list:
            if os.path.isdir(file):
                raise EnvironmentError(f'發現文件夾 {file}, 當前文件夾中存其他文件夾,請檢查!')
            if not file.upper().endswith('.CSV'):
                raise EnvironmentError(f'發現非CSV文件:{file}, 請確保當前文件夾僅存放csv文件!')


if __name__ == '__main__':
    # 測試切分
    csv_path = r'E:\simple.csv'
    save_dir = r'E:\simple_splited_files'
    PyCSV().split_csv(csv_path, save_dir, split_line=10000)

    # 測試合併
    files_dir = r'E:\simple_splited_files'
    save_name = r'merge_simple.csv'
    PyCSV().merge_csv(save_name, files_dir)

Part4效果展示1拆分csv文件2合併csv文件

點擊搜索你感興趣的內容吧

點擊下方「閱讀全文」了解更多

相關焦點

  • PDF合併拆分軟體免費分享
    上篇文章寫的是一個合併PDF的python腳本。
  • 【軟體推薦】| PDF文件的拆分與合併
    於是,小編去網上各種論壇找優質的pdf拆分軟體,終於在下載嘗試了各種拆分軟體,最終找到了操作簡單而且佔用內存極小的幾個。        耐不住性子的小編本著「好東西要大家分享」的原則,馬上給大家安利下這系列超級神器的軟體。註:以下軟體的安裝包資源,點擊左下角的【閱讀原文】獲取。
  • Python處理CSV文件
    在數據處理過程中,可能會需要採用篩選、提取、重新生成等方法來對數據進行處理,下面以csv文件為例,介紹使用Python處理文本文件的方法。開始之前在面對文件讀寫類的問題時,open函數是一定繞不開的,下面先介紹幾種open函數使用的技巧。
  • Python對CSV文件的處理
    在接口自動化測試中,把測試的數據存儲到csv的文件也是一種很不錯的選擇,下面就詳細的介紹如何實現CSV文件內容的讀取和如何把數據寫入到
  • Python筆記:批量合併Excel文件信息
    但是,如果文件的數目太多(比如幾十個、上百個、幾百上千個)的時候,再一個一個地去加載,會是一件很折騰人的事情。我們又知道,for循環可用來進行批處理,來幫我們自動實現大量重複的操作步驟。例如:我在桌面上的「python」文件夾內放置4個表結構相同(表頭相同)的文件,接下來我準備用for循環優雅地實現上面我所吹過的牛。文件截圖如下:註:為了不洩露工作信息,所以我對表格內容進行了模糊化處理。
  • CSV文件在Python中的幾種處理方式
    二、使用Python基本語法讀寫CSV文件 使用基本語法讀取CSV文件中的數據大概思路是:獲取文件對象,讀取表頭,按逗號分隔符拆分表頭欄位,使用for循環語句獲取表體記錄數據,拆分後再次寫入另一張CSV文件中(如果要將數據寫入xls*格式的文件中,請參考前期公眾號文章),步驟如下:Step 1:導入必要模塊,獲取輸入輸出文件路徑。
  • 如何批量合併txt、csv文件?1s時間足矣
    收錄於話題 #Excel文件合併/拆分專輯 5個
  • Python讀取csv文件常見的兩種方法
    一、數據存取之csv(一)什麼是csvCSV是一種通用的、相對簡單的文件格式,被用戶、商業和科學廣泛應用。最廣泛的應用是在程序之間轉移表格數據,而這些程序本身是在不兼容的格式上進行操作的(往往是私有的和/或無規範的格式)。
  • Python讀寫csv文件專題教程(2)
    ,默認為c, 因為c引擎解析速度更快,但是特性沒有python引擎高,如果使用c引擎沒有的特性時,會自動退化為python引擎。skiprows還可以被賦值為某種過濾規則的函數skip_footer從文件末尾過濾行,解析器退化為python. 這是因為c解析器沒有這個特性。
  • 怎樣使用Pandas批量拆分與合併Excel文件?
    ,tensorflow,特徵工程12583Pandas實現數據的合併concatpandas,python,數據分析22574Pandas的Index索引有什麼用途?total_row_count = df_source.shape[0]total_row_count258一、將一個大Excel等份拆成多個Excel使用df.iloc方法,將一個大的dataframe,拆分成多個小dataframe將使用dataframe.to_excel保存每個小Excel1、計算拆分後的每個
  • 一個函數實現PDF文檔合併與拆分
    爬蟲俱樂部將於2020年8月25日至28日在線上舉行Stata數據分析法律與制度專題訓練營,主要是為了讓學員掌握Stata軟體進階操作,涉及內容包括基本字符串函數及其應用、正則表達式、法律與制度數據網絡爬蟲技巧、判案文書的文本分析等技術。
  • 跟小白學Python數據分析——批量合併CSV文件
    Python進行批量合併處理操作需要使用到os模塊。
  • 基於Python實現對各種數據文件的操作
    常見的數據文件類型如下:txtcsvexcel(xls\xlsx)在線網頁數據pdf\word其他數據軟體格式1 txt文件更多參考:https://docs.python.org/3/tutorial/inputoutput.html
  • python用PyPDF2庫解決pdf合併拆分問題
    pdf拆分合併是現在辦公中比較常用的功能,它能省去辦公中許多不必要的麻煩。PyPDF是一個處理PDF的庫,今天就用它實戰操作一番,完成拆分合併PDF。pdf拆分合併專業戶PyPDF2庫還是先對PyPDF2庫簡單介紹一下,PyPDF2是一個純python的PDF庫,能夠拆分、合併、裁剪和轉換
  • Python 簡單操作 CSV
    CSV 文件格式簡單、通用,在現實中有著廣泛的應用,其中使用最多的是在程序之間轉移表格數據」。CSV與Excel區別Python 通過 csv 模塊來實現 CSV 格式文件中數據的讀寫,該模塊提供了兼容 Excel 方式輸出、讀取數據文件的功能,這樣我們無需知道 Excel 所採用 CSV 格式的細節,同樣的它還可以定義其他應用程式可用的或特定需求的 CSV 格式。
  • python讀寫csv文件
    這樣的方式在處理制表符分隔的文件時,沒什麼問題,但是在處理csv文件時,會非常的頭痛。CSV文件格式簡單理解,是逗號分隔的純文本,但是實際上非常靈活。在excel導出的csv文件中,會遇到某個欄位內部出現了逗號的情況,這樣的字符在兩端添加雙引號來進行區分,示意如下>>> with open('file.csv') as f:... for line in f:... print(line.rstrip().split(','))...
  • Python讀寫csv文件專題教程(1)
    1 前言Python的數據分析包Pandas具備讀寫csv文件的功能,read_csv 實現讀入csv文件,to_csv寫入到csv文件。
  • CSV是什麼文件 怎麼打開csv文件
    經常使用資料庫軟體的朋友都清楚csv文件是什麼用的,最早是使用在簡單的資料庫裡,由於其格式簡單,並具備很強的開放性,如果使用到csv文件該怎麼打開呢?下面給大家介紹幾種打開csv文件的常用方法。最早出現csv文件是為了實現簡單的數據存儲,是一個純文本的文件,最廣泛的應用是在程序之間轉移表格數據,能夠兼容各類程序,那面對這樣的文件類型該怎麼打開呢,下面一起來學習下csv文件怎麼打開的方法。以下是csv文件怎麼打開的詳細教程:了解什麼是csv文件?
  • python學習筆記(6):csv文件讀取
    昨天發了篇文章,是講如何讀取.xls格式文件的,今天來說下CSV文件怎麼讀取。我個人用CSV還是比較多的,因為讀取起來比較方便。小試牛刀「示例文件」「來個簡單式的」讀取csv文件,用的是csv.reader()這個方法。
  • python 處理 csv 文件
    csv 文件是一種逗號分隔的純文本形式存儲的表格數據,Python內置了CSV模塊,可直接通過該模塊實現csv文件的讀寫操作,在web應用中導出數據是比較常見操作