Hướng dẫn python combine csv files into excel - python kết hợp các tệp csv thành excel

Chúng tôi đang trong quá trình chuyển đổi tại nơi làm việc từ Python 2.7 sang Python 3.5. Đó là một sự thay đổi rộng rãi của công ty và hầu hết các tập lệnh hiện tại của chúng tôi đã được viết trong 2.7 và không có thư viện bổ sung. Tôi đã tận dụng lợi thế của bản phân phối Anaconda mà chúng tôi đang sử dụng và đã thay đổi hầu hết các tập lệnh của chúng tôi bằng cách sử dụng mô -đun 2TO3 hoặc viết lại hoàn toàn chúng. Mặc dù vậy, tôi bị mắc kẹt trên một đoạn mã, mà tôi đã không viết và tác giả ban đầu không ở đây. Anh ấy cũng không cung cấp nhận xét để tôi chỉ có thể đoán toàn bộ kịch bản. 95% tập lệnh hoạt động chính xác cho đến khi kết thúc sau khi nó tạo 7 tệp CSV với thông tin được phân tích phân tích cú pháp khác nhau, nó có chức năng tùy chỉnh để kết hợp các tệp CSV thành và XLS Workbook với mỗi CSV là tab mới.

import csv
import xlwt
import glob
import openpyxl
from openpyxl import Workbook

Parsefiles = glob.glob[directory + '/' + "Parsed*.csv"]
def xlsmaker[]:
    for f in Parsefiles:
        [path, name] = os.path.split[f]
        [chort_name, extension] = os.path.splittext[name]
        ws = wb.add_sheet[short_name]
        xreader = csv.reader[open[f, 'rb']]
        newdata = [line for line in xreader]
        for rowx, row in enumerate[newdata]
            for colx, value in enumerate[row]:
                if value.isdigit[]:
            ws.write[rowx, colx, value]

xlsmaker[]

for f in Parsefiles:
    os.remove[f]

wb.save[directory + '/' + "Finished" + '' + oshort + '' + timestr + ".xls"]

Điều này đã được viết tất cả trong Python 2.7 và vẫn hoạt động chính xác nếu tôi chạy nó trong Python 2.7. Vấn đề là nó gây ra lỗi khi chạy trong Python 3.5.

File "parsetool.py", line 521, in [module]
  xlsmaker[]
File "parsetool.py", line 511, in xlsmaker
  ws = wb.add_sheet[short_name]
File "c:\pythonscripts\workbook.py", line 168 in add_sheet
  raise TypeError["The paramete you have given is not of the type '%s'"% self._worksheet_class.__name__]
TypeError: The parameter you have given is not of the type "Worksheet"

Bất kỳ ý tưởng về những gì nên được thực hiện để khắc phục lỗi trên? Iv'e đã ​​thử nhiều bản viết lại, nhưng tôi nhận được các lỗi tương tự hoặc lỗi mới. Tôi đang xem xét chỉ cần tìm ra một phương pháp hoàn toàn mới của chúng tôi để tạo ra XLS, có thể thay vào đó là gấu trúc.

Rất dễ dàng để hợp nhất nhiều tệp CSV trong Python bằng thư viện Pandas. Blog này sẽ giải thích cho bạn tất cả các phần của việc kết hợp nhiều tệp CSV và xuất chúng dưới dạng một tờ Excel.CSV files in Python using Pandas library. This blog will explain to you all the parts of concatenating multiple CSV files and export them as one excel sheet.

Điều kiện tiên quyết để hợp nhất nhiều tệp CSV bằng PythonPython


  1. Python 3,4 trở lên
  2. Gấu trúc
  3. Quả cầu

Cài đặt gấu trúcPandas

pip install pandas

Cài đặt Quả cầuGlob

pip install glob3

Bây giờ, chỉ cần đảm bảo tất cả các tệp mà bạn sẽ hợp nhất có cùng một số cột và chúng thuộc cùng một thứ tự. Nếu không, hãy sử dụng gấu trúc để cắt và sắp xếp lại các cột trước khi hợp nhất.

Đoạn mã Python để kết hợp nhiều tệp CSV khi một excel

import pandas as pd
import os as os
import glob as gl

os.chdir[r"path_to_multiple_csv_directory"]

Excel_File = pd.ExcelFile["new_excel_filename.xlsx"]
Sheet_Name = Excel_File.sheet_names
length_of_Sheet = len[Excel_File.sheet_names]
print["List of sheets in you xlsx file :\n",Sheet_Name]

for i in range[0,length_of_Sheet]:
    df = pd.read_excel["new_excel_filename.xlsx", sheet_name = i]
    df = df.iloc[:,0:3]
    df.to_csv[Sheet_Name[i]+".csv", index = False]
    print["Created :",Sheet_Name[i],".csv"]
    
filenames = [i for i in gl.glob['*.{}'.format['csv']]]
combined_csv = pd.concat[[pd.read_csv[f] for f in filenames ]]
combined_csv.to_csv[ "combined_csv_filename.csv", index=False, encoding='utf-8-sig']

Xin chúc mừng!! Bây giờ bạn có thể đã hợp nhất nhiều tệp CSV như một Excel bằng Python.CSV files as one excel using Python.

Đọc tập tin

Trong bài viết trước của tôi, tôi đã chỉ ra cách chuyển đổi các tệp Excel hoặc CSV thành khung dữ liệu PANDAS. Điều đó sẽ hữu ích khi bạn chỉ có 1 tệp Excel để giải quyết. Trong thực tế, nhiều công ty phân tách dữ liệu trong một tệp CSV mỗi ngày/tuần/tháng/năm. Trong trường hợp này, bạn có thể muốn kết hợp chúng để phân tích tất cả các dữ liệu nói, trong cả năm.

Để đơn giản, chúng tôi sẽ sử dụng các tệp CSV chứa giá cổ phiếu hàng tháng của mỗi năm được phân tách bằng ticker và năm. Trong thư mục dữ liệu này, chúng tôi có giá cổ phiếu của Apple, Amazon và Microsoft.

Đọc các tệp trong một thư mục

Để đọc tất cả các tệp trong một thư mục, hãy viết mã liệt kê tất cả các tệp trong một thư mục được chỉ định.

# List out files in 'writeCSV' folder

import os
data_files = os.listdir['writeCSV']
data_files

Ở đây, chúng tôi đã liệt kê tất cả các tệp trong thư mục 'WriteCSV' ** Bạn có thể muốn tham khảo đường dẫn tệp của riêng bạn ** và bây giờ chúng tôi nên đọc tất cả dữ liệu trong các tệp này và kết hợp chúng thành 1 bảng.

Vòng lặp tất cả dữ liệu

Đầu tiên, chúng tôi sẽ lặp qua tất cả các dữ liệu.

import pandas as pd
for filename in data_files:
    # Read data from each file
    df = pd.read_csv[f'writeCSV/{filename}']
    print[df]

Bây giờ vấn đề là, chúng ta không biết hàng nào thuộc về tệp excel nào. Do đó, chúng tôi sẽ thêm một cột khác để cho biết nó từ tệp excel nào. Vì vậy, chúng ta hãy thêm các cột vào bảng để chỉ ra nguồn của chúng.

import pandas as pd
for filename in data_files:
    # Read data from each file
    df = pd.read_csv[f'writeCSV/{filename}']
    # Get ticker & year from filename
    csvTicker = filename[0:4]
    csvYear = filename[5:9]
    # Add columns "Ticker" and "Year" to the table
    df['Ticker'] = csvTicker
    df['Year'] = csvYear
    print[df]

Lưu ý rằng có một mẫu trong tên tệp excel của chúng tôi: 'MSFT-2009 một tháng một lần-stock-price.csv' 4 chữ cái đầu tiên và 4 chữ cái theo chúng cho chúng tôi biết cổ phiếu và năm nào dữ liệu thuộc về. Tên tệp trong data_files là chuỗi [tên của các tệp] Tên tệp [0: 4] có nghĩa là chúng tôi đang lấy 4 ký tự đầu tiên. Lưu ý rằng chúng tôi bắt đầu số lượng từ 0 và kết thúc bằng 4. 0 là chỉ mục cho phần tử đầu tiên và 4 là chỉ mục cho phần tử thứ 5 và v.v. Đợi một giây, chúng tôi chỉ quan tâm đến 4 đầu tiên tính cách? Vậy thì tại sao chúng ta lại lấy [0: 4] thay vì [0: 3]? Trong khi việc lập chỉ mục bắt đầu với 0, [A, B] trong Python có nghĩa là từ A đến B-1 nghĩa là, bỏ qua số cuối cùng. Vì vậy, tên tệp [0: 4] sẽ chỉ lấy 4 ký tự đầu tiên thay vì 5.

Trong thực tế, bạn có thể thấy mẫu tương tự, ví dụ: '20211123Sales.csv'. Trong trường hợp này, chúng ta có thể lấy tên tệp [0: 4] làm năm, tên tệp [4: 6] là tháng và tên tệp [6: 8] là ngày.

Tại thời điểm này, chúng tôi đang in từng bảng một mà không kết hợp chúng trong một bảng. Đây không phải là những gì chúng tôi muốn. Nhưng trước đó, chúng ta hãy tạo lại các bảng riêng lẻ này bằng cách sử dụng trình tạo.

# Generator
def load_files[data_files]:
    for filename in data_files:
        # Read data from each file
        df = pd.read_csv[f'writeCSV/{filename}']
        # Get ticker & year from filename
        csvTicker = filename[0:4]
        csvYear = filename[5:9]
        # Add columns "Ticker" and "Year" to the table
        df['Ticker'] = csvTicker
        df['Year'] = csvYear
        yield df       

Chờ đã, một máy phát điện? Đó là gì? Giống như chúng ta đã in từng bảng một, DEN DF giúp chúng ta 'tạo', như tên của nó, bảng thay vì trả lại hoặc in chúng. Chúng tôi sẽ 'tạo' bảng này và sử dụng hàm Concat [] để nối hàng sau khi chúng tôi tạo một bảng khác.

# Generate a list of file names
data = [x for x in data_files]


# load_files takes 1 argument [a list of file names]
stockprice = pd.concat[load_files[data]]
stockprice

Hãy nhìn xem, chúng tôi đã kết hợp thành công các bảng này thành 1. Tuy nhiên, chúng tôi chưa gần thực hiện được vì: 1. Lập chỉ mục hàng là kỳ lạ [0,0,1,2,3, ..., 6,7,8,9 , 10] Trong khi chúng ta có 792 hàng. 2. Chúng tôi có thêm một cột 'Không tên: 0'.

Lập chỉ mục

Hãy nhớ lại rằng đây là các bảng riêng lẻ có 12 hàng cho mỗi tệp [ngoại trừ bản đầu tiên]. Khi chúng tôi sử dụng Concat [] để kết hợp bảng, về cơ bản chúng tôi sẽ nối thêm các hàng [bao gồm cả chỉ mục] và do đó nó vẫn là 0-11 ngay cả sau khi chúng tôi kết hợp các bảng.

File "parsetool.py", line 521, in [module]
  xlsmaker[]
File "parsetool.py", line 511, in xlsmaker
  ws = wb.add_sheet[short_name]
File "c:\pythonscripts\workbook.py", line 168 in add_sheet
  raise TypeError["The paramete you have given is not of the type '%s'"% self._worksheet_class.__name__]
TypeError: The parameter you have given is not of the type "Worksheet"
0

Chúng ta cần sử dụng StockPrice.reset_index [Drop = true] để thả chỉ mục gốc và sử dụng một chỉ mục mới. Trong khi thay thế = true có nghĩa là bảng sửa đổi sẽ được chỉ định lại cho biến StockPrice thay vì xác định một bảng mới.

Không tên: 0 cột

Lưu ý sự khác biệt giữa một vài hàng trên cùng và một vài hàng dưới cùng của cột không tên: 0. Đối với cổ phiếu của Apple, giá trị là NAN trong khi đối với Microsoft, giá trị thực sự là số chỉ mục ban đầu của nó. Điều này cho chúng ta biết rằng đối với các tệp Microsoft, có một cột chỉ mục trong dữ liệu trong khi Apple không có.

Khi chúng tôi sử dụng pd.concat [] để nối các bảng, gấu trúc sẽ lấy cột chỉ mục đó ra và đổi tên nó thành không tên: 0. Đối với các tệp excel không có cột đó, các giá trị sẽ là null [nan].

Nếu tất cả các tệp có cột chỉ mục đó, chúng ta có thể sử dụng index_col = 0 để nói với gấu trúc rằng cột đầu tiên thực sự là cột chỉ mục và chúng ta không cần phải đưa vào bảng kết hợp của mình.

Như hình ảnh đã hiển thị, chúng tôi không thể sử dụng index_col = 0 trong trường hợp của chúng tôi vì không phải tất cả các tệp đều có cột chỉ mục đó.

File "parsetool.py", line 521, in [module]
  xlsmaker[]
File "parsetool.py", line 511, in xlsmaker
  ws = wb.add_sheet[short_name]
File "c:\pythonscripts\workbook.py", line 168 in add_sheet
  raise TypeError["The paramete you have given is not of the type '%s'"% self._worksheet_class.__name__]
TypeError: The parameter you have given is not of the type "Worksheet"
1

DataFrame.iloc [A: B, C: D] có nghĩa là chúng ta lấy các hàng+1 đến B-1 [chỉ mục bắt đầu từ 0 và bỏ qua số cuối cùng] và các cột C+1 đến D-1. Trong ví dụ của chúng tôi, chúng tôi sử dụng ILOC [:,:-1]. 'A' và 'B' không được lấp đầy có nghĩa là chúng ta sẽ lấy tất cả các hàng. Ý tưởng tương tự áp dụng cho 'C' [không điền vào có nghĩa là c = 0] và d = -1. do đó, index = -1 có nghĩa là chỉ số đầu tiên đếm từ mặt sau, do đó, chúng tôi đang lấy tất cả các cột ngoại trừ số cuối cùng [số cuối cùng bị bỏ qua].

Đầu ra cuối cùng

Có bạn đi, đây là bảng kết hợp mà chúng tôi mong đợi. Chúng ta hãy đặt các mã này vào một hàm để chúng ta có thể gọi nó bằng một dòng mã.

File "parsetool.py", line 521, in [module]
  xlsmaker[]
File "parsetool.py", line 511, in xlsmaker
  ws = wb.add_sheet[short_name]
File "c:\pythonscripts\workbook.py", line 168 in add_sheet
  raise TypeError["The paramete you have given is not of the type '%s'"% self._worksheet_class.__name__]
TypeError: The parameter you have given is not of the type "Worksheet"
2

Lưu ý rằng chúng tôi đã thêm mã vào số lượng tệp, hàng và cột được tải vào bảng để khi chúng tôi gọi hàm mà không hiển thị bảng kết quả, chúng tôi biết rằng bảng được tải thành công.

Mã cuối cùng và đầu ra [kết hợp tất cả các tệp trong một thư mục]

File "parsetool.py", line 521, in [module]
  xlsmaker[]
File "parsetool.py", line 511, in xlsmaker
  ws = wb.add_sheet[short_name]
File "c:\pythonscripts\workbook.py", line 168 in add_sheet
  raise TypeError["The paramete you have given is not of the type '%s'"% self._worksheet_class.__name__]
TypeError: The parameter you have given is not of the type "Worksheet"
3

Nếu tất cả những gì bạn cần là đọc tất cả các tệp trong một thư mục, bạn có thể dừng ngay tại đây. Trong một số trường hợp, bạn có thể không muốn kết hợp tất cả các tệp nhưng chọn các tệp để kết hợp dựa trên tên tệp.

Để khai báo một mẫu, chúng tôi sẽ sử dụng re.compile

File "parsetool.py", line 521, in [module]
  xlsmaker[]
File "parsetool.py", line 511, in xlsmaker
  ws = wb.add_sheet[short_name]
File "c:\pythonscripts\workbook.py", line 168 in add_sheet
  raise TypeError["The paramete you have given is not of the type '%s'"% self._worksheet_class.__name__]
TypeError: The parameter you have given is not of the type "Worksheet"
4

Re là viết tắt của biểu hiện chính quy. Nó thường được sử dụng khi chúng ta muốn xác định một mẫu thay vì viết tất cả các tên phù hợp với mẫu. Kiểm tra tấm cheat Regex để biết thêm các biểu tượng Regex và sử dụng của nó.

Ở đây, chúng tôi đã sử dụng ^....-es Giá cổ phiếu.csv ". Nếu chúng ta muốn chỉ định một cổ phiếu, chúng ta có thể thay thế .... bằng biểu tượng đánh dấu của nó như MSFT.

File "parsetool.py", line 521, in [module]
  xlsmaker[]
File "parsetool.py", line 511, in xlsmaker
  ws = wb.add_sheet[short_name]
File "c:\pythonscripts\workbook.py", line 168 in add_sheet
  raise TypeError["The paramete you have given is not of the type '%s'"% self._worksheet_class.__name__]
TypeError: The parameter you have given is not of the type "Worksheet"
5

Đặt điều này vào chức năng của chúng tôi:

File "parsetool.py", line 521, in [module]
  xlsmaker[]
File "parsetool.py", line 511, in xlsmaker
  ws = wb.add_sheet[short_name]
File "c:\pythonscripts\workbook.py", line 168 in add_sheet
  raise TypeError["The paramete you have given is not of the type '%s'"% self._worksheet_class.__name__]
TypeError: The parameter you have given is not of the type "Worksheet"
6

Mã cuối cùng [với Regex]

File "parsetool.py", line 521, in [module]
  xlsmaker[]
File "parsetool.py", line 511, in xlsmaker
  ws = wb.add_sheet[short_name]
File "c:\pythonscripts\workbook.py", line 168 in add_sheet
  raise TypeError["The paramete you have given is not of the type '%s'"% self._worksheet_class.__name__]
TypeError: The parameter you have given is not of the type "Worksheet"
7

Đầu ra cuối cùng

Cảm ơn bạn đã đọc! Hẹn gặp lại các bạn trong bài viết tiếp theo của tôi :]

Làm cách nào để chuyển đổi nhiều tệp CSV thành Excel trong Python?

Các bước để chuyển đổi CSV thành Excel bằng Python..
Bước 1: Cài đặt gói Pandas. Nếu bạn chưa làm như vậy, hãy cài đặt gói Pandas. ....
Bước 2: Chụp đường dẫn nơi lưu trữ tệp CSV. ....
Bước 3: Chỉ định đường dẫn nơi tệp Excel mới sẽ được lưu trữ. ....
Bước 4: Chuyển đổi CSV thành Excel bằng Python ..

Làm cách nào để kết hợp nhiều tệp CSV trong Excel?

Để kết hợp nhiều tệp CSV vào một sổ làm việc excel, đây là các bước bạn cần tuân theo:..
Đặt tất cả các tệp CSV của bạn vào một thư mục. ....
Trên tab Dữ liệu, trong nhóm dữ liệu GET & Biến đổi, nhấp vào Nhận dữ liệu> từ tệp> từ thư mục ..
Duyệt cho thư mục mà bạn đã đặt các tệp CSV và nhấp vào mở ..

Làm cách nào để hợp nhất các tệp CSV trong Python?

Cách kết hợp nhiều tệp CSV bằng Python cho phân tích của bạn..
Nhập tệp vào Pandas DataFrames: ....
Thiết lập thư mục làm việc: ....
Kết hợp nhiều tệp với cấu trúc bảng tương tự bằng cách sử dụng pandas.dataframe.append [] ....
Kết hợp nhiều tệp với cấu trúc bảng tương tự bằng pandas.concat [].

Làm cách nào để tự động nhập tệp CSV vào Excel?

Trong Excel 365, Excel 2021, Excel 2019 và Excel 2016, bạn có thể nhập dữ liệu từ một tệp văn bản bằng cách kết nối với nó với sự trợ giúp của truy vấn sức mạnh.Dưới đây là cách: Trên tab Dữ liệu, trong nhóm dữ liệu GET & Biến đổi, nhấp từ Text/CSV. Trong hộp thoại Nhập dữ liệu, chọn tệp văn bản quan tâm và nhấp vào Nhập.On the Data tab, in the Get & Transform Data group, click From Text/CSV. In the Import Data dialog box, select the text file of interest, and click Import.

Bài Viết Liên Quan

Chủ Đề