Liệt kê tất cả các tệp csv trong thư mục python

Hướng dẫn này là một tập hợp con nhỏ của một dự án mà tôi đã thực hiện gần đây. Nhiệm vụ ở đây là hợp nhất dữ liệu từ nhiều tệp csv thành một tệp sao cho không có thông tin nào bị mất và việc hợp nhất các cột từ tất cả các tệp được thực hiện mà không có bất kỳ sự mâu thuẫn nào

Giới thiệu

Bạn đã bao giờ gặp trường hợp có nhiều bảng có một cột chung và phải hợp nhất chúng dựa trên khóa chính chưa? . Có, nhưng điều gì sẽ xảy ra nếu tôi nói rằng chúng ta có mỗi bảng được lưu trữ trong một tệp csv, vì vậy mỗi tệp csv là một bảng. Và có 10 csv trong 5 thư mục khác nhau tức là. 50 tệp csv trong tất cả. Nhiệm vụ ở đây là hợp nhất tất cả csv trong mỗi thư mục và tạo một csv chính để cuối cùng chúng ta sẽ có 5 tệp csv chính. Tập dữ liệu ở đây liên quan đến lưu lượng truy cập trang web

Về dữ liệu

Hãy để tôi cung cấp cho bạn một cái nhìn nhanh về cấu trúc thư mục

Năm > Lượt xem quốc gia > 10 tệp csv

Tương tự, cả 4 thư mục còn lại đều có cấu trúc tương tự. Tất cả csv đều có 2 cột, một cột là chính tham số và cột còn lại là giá trị hoặc số lần truy cập mà tham số nhận được. Mỗi tệp csv đại diện cho một năm. Số hàng có thể tăng hoặc giảm và một số hàng có thể lặp lại với các năm khác nhau. Do đó, chúng tôi cần đảm bảo tại thời điểm hợp nhất không có dữ liệu nào bị mất

Chúng ta có thể làm điều này bằng cách sử dụng SQL và để lại các phép nối ngoài hoặc sử dụng hàm VLookUp trong excel nhưng điều đó sẽ rất tốn thời gian. Đây, Python đến để giải cứu chúng tôi

Chúng tôi sẽ tự động hóa tác vụ này với python và tạo một chức năng sẽ lấy một đầu vào duy nhất làm đường dẫn của thư mục 'Năm' và tạo một csv chính mới trong mỗi thư mục con cho chúng tôi trong một cuộc gọi. Tích tụ đủ rồi, bắt tay vào việc nào

Nhập thư viện cần thiết

import pandas as pd
import os #provides functions necessary to interact with os
import glob #used to extract file paths that match specific pattern
import re #regular expression package
Cách tiếp cận
  1. Chức năng của chúng tôi sẽ lặp qua tất cả các thư mục con có trong thư mục chính 'Năm'. Một danh sách 'sub_folders' sẽ lưu trữ tên của tất cả các thư mục con
  2. Trong mỗi thư mục con, chúng tôi sẽ lặp qua tất cả các tệp và lưu trữ từng đường dẫn tệp trong danh sách 'all_files'
  3. Dữ liệu của mỗi tệp sẽ được lưu trữ dưới dạng một khung dữ liệu và mỗi khung dữ liệu sẽ được lưu trữ trong một danh sách mới 'li'. Nói cách khác, chúng tôi sẽ tạo một danh sách trong đó mỗi chỉ mục đại diện cho một khung dữ liệu (csv)
  4. Chúng tôi cũng sẽ tạo một danh sách 'năm' sẽ chỉ trích xuất và lưu trữ năm từ tất cả các tên tệp csv bằng cách sử dụng thư viện 're'
  5. Sử dụng chỉ mục của danh sách 'li', chúng tôi sẽ hợp nhất từng khung dữ liệu với phép nối ngoài bên trái bắt đầu từ 2 chỉ mục đầu tiên và sau đó lặp lại cho đến khi kết thúc chỉ mục danh sách
  6. Sau khi chúng tôi tạo csv chính cuối cùng của mình, chúng tôi sẽ đổi tên tất cả các cột với sự trợ giúp của danh sách 'năm. ' Chúng tôi sẽ đặt tên cho tất cả các tệp trong thư mục con bằng tên thư mục tương ứng của chúng bằng cách sử dụng danh sách 'thư mục con' đã tạo trước đó
Chấp hành

Chức năng của chúng tôi sẽ là một iterator. Ở đây, tôi sẽ hướng dẫn bạn qua một lần lặp lại để dễ hiểu và sau đó chúng tôi sẽ chuyển đổi nó thành một hàm động. Chúng ta sẽ sử dụng quá nhiều danh sách và vòng lặp for

Bước 1

Phân tích cú pháp thông qua thư mục chính 'Năm' và lưu trữ tên của tất cả các thư mục con trong danh sách

data_dir = r’E:\Year’
sub_folders = os.listdir(data_dir)
sub_folders

Bước 2

Lặp lại tất cả các tệp trong thư mục con 'Nhấp chuột' và lưu trữ đường dẫn tệp của chúng trong danh sách 'all_files'

path = os.path.join(data_dir, sub_folders[0])
os.chdir(path)
all_files = glob.glob(path + “/*.csv”)
all_files

Bước 3

Tạo danh sách dữ liệu của tệp mới dưới dạng khung dữ liệu 'li'

li = []
for filename in all_files:
df = pd.read_csv(filename,on_bad_lines=’skip’,names=[‘Title’, ‘Frequency’])
li.append(df)
li

li[0]

Nhìn thoáng qua chỉ mục đầu tiên trông như thế nào trong danh sách 'li'

Bước 4

Tạo một danh sách 'năm' sẽ trích xuất tất cả các năm từ tên tệp bằng thư viện re

year = []
for file in range(0,len(all_files)):
x = re.search(“[0–5][0–9][0–5][0–9]”, all_files[file])
year.append(x.group())
year

Bước 5

Hợp nhất tất cả dữ liệu từ mỗi khung dữ liệu với nối ngoài bên trái từng cái một bắt đầu từ chỉ mục 0 và 1. Trước đó, chúng tôi sẽ thêm thay thế tất cả các giá trị trống bằng 0 trong tất cả các khung dữ liệu

li[index].fillna(0)
li[index] = li[index].groupby([‘Title’]).agg(‘sum’)
left = li[0]
for i in range(0,len(year)-1):
right = li[i+1]
result = pd.merge(left, right, on=”Title”, how=”outer”,suffixes= (year[i],year[i+1]))
left = result
left.head()

Bước 6

Hãy để chúng tôi đổi tên các cột khi tần suất được thêm vào tất cả các tên cột mới được tạo bằng phép nối

left.columns = year
left.head()

Cuối cùng, chúng ta hãy xuất khung dữ liệu với tên tệp thích hợp trong thư mục con 'Nhấp chuột'

________số 8

Như vậy là ta đã hoàn thành xuất sắc nhiệm vụ trong tay. Bây giờ chúng ta hãy đặt tất cả các đoạn mã trong một chức năng duy nhất

def combine_data(data_dir):

os.chdir(data_dir)
sub_folders = os.listdir(data_dir) #list of sub_folders
for folder in range(0,len(sub_folders)): #loop through all sub_folders
path = os.path.join(data_dir, sub_folders[folder])
os.chdir(path)
all_files = glob.glob(path + “/*.csv”) #list of all files in folder
li = []
for filename in all_files:
df = pd.read_csv(filename,on_bad_lines=’skip’,names=[‘Title’, ‘Frequency’])
li.append(df) #list li of df (each csv as 1 df at each index of li)

for index in range(0,len(all_files)):
li[index].fillna(0)
li[index] = li[index].groupby([‘Title’]).agg(‘sum’)
year = []
for file in range(0,len(all_files)):
x = re.search(“[0–5][0–9][0–5][0–9]”, all_files[file])
year.append(x.group()) #list of year fetched from .csv filenames
left = li[0]
for i in range(0,len(year)-1):
right = li[i+1]
result = pd.merge(left, right, on=”Title”, how=”outer”,suffixes=(year[i],year[i+1])) #outer merge on 2 consecutive indexes of df
left = result
#year.insert(0,’Title’)
left.columns = year #updating column names of master df
left.to_csv(sub_folders[folder]+’.csv’) #exporting the df

gọi hàm

data_dir = r’E:\Year’
sub_folders = os.listdir(data_dir)
sub_folders
0

Cảm ơn bạn đã đọc bài viết. Vui lòng liên hệ với bất kỳ mối quan tâm, làm rõ hoặc vấn đề bản quyền nào trên kakadiya95@gmail. com. Ngoài ra, bạn có thể nhắn tin cho tôi trên trang Linkedin của tôi. Ngoài ra, hãy kiểm tra tài khoản github của tôi