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
- Python 3,4 trở lên
- Gấu trúc
- 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"
0Chú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"
1DataFrame.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"
2Lư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"
3Nế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"
4Re 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"
6Mã 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 :]