首頁 > 軟體

Python實現本地csv檔案合併

2022-02-14 19:01:01

本篇的檔案合併主要是針對.csv的檔案合併。

一、單檔案之間合併

首先,要查詢目錄底下的檔案要匯入OS。並且我們要將.csv檔案以pandas的dataframe底下,因此要匯入PANDAS,另外由於我們要遍歷目錄,因此匯入 GLOB:

import os
import pandas as pd 
import glob

注:

import os的作用:在python環境下對檔案,資料夾執行操作的一個模組。

os.name返回當前系統
os.getcwd()返回當前的路徑
os.remove(路徑)刪除路徑下的檔案

import glob的作用: glob是python自帶的一個操作檔案的相關模組,由於模組功能比較少,所以很容易掌握。用它可以查詢符合特定規則的檔案路徑名。使用該模組查詢檔案,只需要用到: “*”, “?”, “[]”這三個匹配符;

」*」匹配0個或多個字元;
」?」匹配單個字元;
」[]」匹配指定範圍內的字元,如:[0-9]匹配數位。
f1=open('../input/covid19temp/2020/12-30-2020.csv').read()
f2=open('../input/covid19temp/2020/12-31-2020.csv').read()

with open('f1112.csv','a+') as f:
    f.write('n'+f1)
    f.write('n'+f2)

合併完成之後就會多出一個f1112.csv檔案:

然而開啟f1112.csv後發現合併後的檔案有一些髒資料沒有整理:

這時候我們試試skiprows:
在讀取檔案的時候設定skiprows引數的值,設定為1,會跳過一行,這裡是要將第二個檔案的索引屬性給去掉,因為已經和第一個檔案合併了,而第一個檔案有索引屬性了。

f1=pd.read_csv('../input/covid19temp/2020/12-30-2020.csv')
f2=pd.read_csv('../input/covid19temp/2020/12-31-2020.csv',skiprows=1)
f1112=f1.append(f2)
f1112.to_csv('f1112.csv') # 匯出該檔案

在本地目錄中開啟該檔案:

二、單個資料夾底下多個檔案合併

csv_list=glob.glob('../input/covid19temp/2020/*.csv') 
# 如果不加上*的話拿到的就是目錄的名稱,如果加上*,拿到的就是完整的目錄資料
print(csv_list)

for i in csv_list:  
    fr=open(i,'r').read()
    with open('2020csvdata.csv','a') as f:
        f.write(fr)
    f.close()
print('資料檔案合併完成!')

csv_list=glob.glob('../input/covid19temp/2020/*')
for i in csv_list:
    fr=open(i,'rb').read()
    with open('2020csvdata2.csv','ab') as f:
        f.write(fr)
    f.close()
print('資料檔案合併完成!')

csv_list=glob.glob('../input/covid19temp/2020/*')
csvdatadf=pd.DataFrame()
for i in csv_list:
    csvdata=pd.read_csv(i)
    csvdatadf=csvdatadf.append(csvdata)
print('資料檔案合併完成!')

合併之後使用pd.read_csv讀取檔案資料,一共有20W+的疫情資料記錄:

三、多個資料夾底下多個檔案合併

import os
import pandas as pd 
import glob
import openpyxl
import numpy as np

path='../input/covid19temp' # 寫的路徑
csv_lists=[] # 該列表的作用

# 是否更新目錄判斷:
if os.path.isdir(path): #使用os.path.isdir判斷path是否是路徑
    if not path.endswith("/"):# 如果該路徑的最後沒有加上'/'的話,會幫忙加一個/
        path+="/"
        print(path)

如上圖所示,路徑後面多了一個 ‘/’,否則路徑會找不到

檔案操作:

os.listdir(): 列出路徑下所有的檔案

os.path.join(): 連線檔案的作用

os.path.isdir(): 判斷是否是資料夾

import os
import pandas as pd 
import glob
import openpyxl
import numpy as np

path='../input/covid19temp' # 寫的路徑
csv_lists=[] # 該列表的作用

# 是否更新目錄判斷:
if os.path.isdir(path): #使用os.path.isdir判斷path是否是路徑
    if not path.endswith("/"):# 如果該路徑的最後沒有加上'/'的話,會幫忙加一個/
        path+="/"
        print(path)
        for each in os.listdir(path):# os.listdir(): 列出路徑下所有的檔案
            print(each)

import os
import pandas as pd 
import glob
import openpyxl
import numpy as np

path='../input/covid19temp' # 寫的路徑
csv_lists=[] # 該列表的作用

# 是否更新目錄判斷:
if os.path.isdir(path): #使用os.path.isdir判斷path是否是路徑
    if not path.endswith("/"):# 如果該路徑的最後沒有加上'/'的話,會幫忙加一個/
        path+="/"
        print(path)
        for each in os.listdir(path):# os.listdir(): 列出路徑下所有的檔案
            print(each)
            sub_path=path+each
            path_list=[]
            if os.path.isdir(sub_path):
                path_list.append(sub_path)
                csv_lists.append(path_list) # 生成主目錄下路徑列表(非檔案)
# 根據路徑進行路徑下檔案列表的生成
csvlists=[]
for i in range(len(csv_lists)):
#    print(i)
    csvlists.append(glob.glob(csv_lists[i][0]+'/*.csv')) 
csvlists

# 獲取每年的檔案路徑
csvfilelist=[]
for j in range(len(csvlists)):
    for k in csvlists[j]:
        csvfilelist.append(k)
csvfilelist

csvdatadf=pd.DataFrame()
for m in csvfilelist:
    filesize=os.path.getsize(m)
    if filesize>0:
        csvdata=pd.read_csv(m)
        csvdatadf=csvdatadf.append(csvdata)
    else:
        continue
    
print('資料合併完成')

四、多資料夾[函數遞迴]

import os 
import pandas as pd 
def mergeFiles(parent,path="",pathdeep=0):
    fileAbsPath=os.path.join(parent,path)
    if os.path.isdir(fileAbsPath)==True:
        if (pathdeep!=0 and('.ipynb_checkpoints' not in str(fileAbsPath))):
            print('=='+path)
        for filename2 in os.listdir(fileAbsPath):
            mergeFiles(fileAbsPath,filename2,pathdeep=pathdeep+1)
    else:
        print(path)
path=input("請輸入需要的檔案注主目錄:")
mergeFiles(path)

總結

到此這篇關於Python實現本地csv檔案合併的文章就介紹到這了,更多相關Python csv檔案合併內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com