HomeLập trìnhPythonCách tạo, đọc,...

Cách tạo, đọc, cập nhật và tìm kiếm thông qua các tệp Excel bằng Python


Bài viết này sẽ hướng dẫn chi tiết cách thao tác với file Excel và cách chỉnh sửa dữ liệu cụ thể bằng Python.

Trước tiên, chúng ta sẽ tìm hiểu cách làm việc với các tệp CSV bằng cách đọc, viết và cập nhật chúng. Sau đó, chúng ta sẽ xem cách đọc tệp, lọc chúng theo trang tính, tìm kiếm hàng/cột và cập nhật ô của tệp xlsx.

Hãy bắt đầu với định dạng bảng tính đơn giản nhất: CSV.

Phần 1 — Tệp CSV

Tệp CSV là tệp giá trị được phân tách bằng dấu phẩy, trong đó dữ liệu văn bản thuần túy được hiển thị ở định dạng bảng. Chúng có thể được sử dụng với bất kỳ chương trình bảng tính nào, chẳng hạn như Microsoft Office Excel, Google Spreadsheets hoặc LibreOffice Calc.

Tuy nhiên, tệp CSV không giống như các tệp bảng tính khác vì chúng không cho phép bạn lưu ô, cột, hàng hoặc công thức. Hạn chế của chúng là chúng cũng chỉ cho phép một trang tính trên mỗi tệp. Kế hoạch của tôi cho phần đầu tiên của bài viết này là chỉ cho bạn cách tạo tệp CSV bằng Python 3 và mô-đun thư viện tiêu chuẩn CSV.

Hướng dẫn này sẽ kết thúc với hai kho lưu trữ GitHub và một ứng dụng web trực tiếp thực sự sử dụng mã của phần thứ hai của hướng dẫn này (chưa được cập nhật và sửa đổi cho một mục đích cụ thể).

Ghi vào tệp CSV

Đầu tiên, mở một tệp Python mới và nhập mô-đun Python CSV.

import csv

Mô-đun CSV

Mô-đun CSV bao gồm tất cả các phương pháp cần thiết được tích hợp sẵn. Chúng bao gồm:

  • csv.reader
  • csv.writer
  • csv.DictReader
  • csv.DictWriter
  • và những người khác

Trong hướng dẫn này, chúng tôi sẽ tập trung vào các phương pháp của người viết, DictWriter và DictReader. Những thứ này cho phép bạn chỉnh sửa, sửa đổi và thao tác dữ liệu được lưu trữ trong tệp CSV.

Trong bước đầu tiên, chúng ta cần xác định tên của tệp và lưu nó dưới dạng một biến. Chúng ta cũng nên làm tương tự với thông tin tiêu đề và dữ liệu.

filename = "imdb_top_4.csv"
header = ("Rank", "Rating", "Title")
data = [
(1, 9.2, "The Shawshank Redemption(1994)"),
(2, 9.2, "The Godfather(1972)"),
(3, 9, "The Godfather: Part II(1974)"),
(4, 8.9, "Pulp Fiction(1994)")
]

Bây giờ chúng ta cần tạo một hàm có tên nhà văn sẽ có ba tham số: tiêu đề, dữ liệu tên tập tin.

def writer(header, data, filename):
  pass

Bước tiếp theo là sửa đổi nhà văn chức năng để nó tạo ra một tệp chứa dữ liệu từ tiêu đề dữ liệu biến. Điều này được thực hiện bằng cách viết hàng đầu tiên từ tiêu đề biến và sau đó viết bốn hàng từ dữ liệu biến (có bốn hàng vì có bốn bộ trong danh sách).

def writer(header, data, filename):
  with open (filename, "w", newline = "") as csvfile:
    movies = csv.writer(csvfile)
    movies.writerow(header)
    for x in data:
      movies.writerow(x)

Tài liệu Python chính thức mô tả cách hoạt động của phương thức csv.writer. Tôi thực sự khuyên bạn nên dành một phút để đọc nó.

Và Voila! Bạn đã tạo tệp CSV đầu tiên có tên imdb_top_4.csv. Mở tệp này bằng ứng dụng bảng tính ưa thích của bạn và bạn sẽ thấy nội dung như sau:

Đọc thêm  Python Find in List – Cách tìm chỉ mục của một mục hoặc phần tử trong danh sách
1*DuYsqu8EFzU15u_0HgNDKg
Sử dụng LibreOffice Calc để xem kết quả.

Kết quả có thể được viết như thế này nếu bạn chọn mở tệp trong một số ứng dụng khác:

1*Q0U_MBj6mr3ekidC299lbQ
Sử dụng SublimeText để xem kết quả.

Cập nhật tệp CSV

Để cập nhật tệp này, bạn nên tạo một chức năng mới có tên người cập nhật sẽ chỉ nhận một tham số được gọi là tên tập tin.

def updater(filename):
    with open(filename, newline= "") as file:
        readData = [row for row in csv.DictReader(file)]
        # print(readData)
        readData[0]['Rating'] = '9.4'
        # print(readData)

    readHeader = readData[0].keys()
    writer(readHeader, readData, filename, "update")

Hàm này trước tiên sẽ mở tệp được xác định trong tên tập tin biến và sau đó lưu tất cả dữ liệu mà nó đọc từ tệp bên trong một biến có tên đọc dữ liệu. Bước thứ hai là mã hóa cứng giá trị mới và đặt nó thay vì giá trị cũ trong đọc dữ liệu[0][‘Rating’] Chức vụ.

Bước cuối cùng trong hàm là gọi nhà văn chức năng bằng cách thêm một tham số mới cập nhật điều đó sẽ cho chức năng biết rằng bạn đang thực hiện cập nhật.

csv.DictReader được giải thích thêm trong tài liệu Python chính thức tại đây.

nhà văn để làm việc với một tham số mới, bạn cần thêm một tham số mới ở mọi nơi nhà văn được định nghĩa. Quay trở lại nơi mà lần đầu tiên bạn gọi là nhà văn và thêm “write” làm tham số mới:

writer(header, data, filename, "write")

Ngay bên dưới chức năng nhà văn, hãy gọi người cập nhật và vượt qua tên tập tin tham số vào nó:

writer(header, data, filename, "write")
updater(filename)

Bây giờ bạn cần sửa đổi nhà văn chức năng lấy một tham số mới có tên Tùy chọn:

def writer(header, data, filename, option):

Từ giờ trở đi, chúng tôi hy vọng sẽ nhận được hai tùy chọn khác nhau cho nhà văn chức năng (viết và cập nhật). Do đó, chúng ta nên thêm hai câu lệnh if để hỗ trợ chức năng mới này. phần đầu tiên của chức năng dưới “nếu tùy chọn == “ghi:” đã được biết đến với bạn. Bạn chỉ cần thêm “tùy chọn elif == “cập nhật”: phần của mã và khác một phần giống như chúng được viết dưới đây:

def writer(header, data, filename, option):
        with open (filename, "w", newline = "") as csvfile:
            if option == "write":

                movies = csv.writer(csvfile)
                movies.writerow(header)
                for x in data:
                    movies.writerow(x)
            elif option == "update":
                writer = csv.DictWriter(csvfile, fieldnames = header)
                writer.writeheader()
                writer.writerows(data)
            else:
                print("Option is not known")

Hoan hô! Bạn đã hoàn tất!

Bây giờ mã của bạn sẽ trông giống như thế này:

0*vPoREgLGJU8VmB5k
Mật mã.

Bạn cũng có thể tìm thấy mã ở đây:

https://github.com/GoranAviani/CSV-Viewer-and-Editor

Trong phần đầu tiên của bài viết này, chúng ta đã thấy cách làm việc với các tệp CSV. Chúng tôi đã tạo và cập nhật một tệp như vậy.

Phần 2 — Tệp xlsx

Trong vài ngày cuối tuần tôi đã làm việc trên dự án này. Tôi đã bắt đầu làm việc với nó vì công ty của tôi có nhu cầu về loại giải pháp này. Ý tưởng đầu tiên của tôi là xây dựng giải pháp này trực tiếp trong hệ thống của công ty tôi, nhưng sau đó tôi sẽ không có gì để viết, phải không?

Tôi xây dựng giải pháp này bằng Python 3 và openpyxl thư viện. Lý do tại sao tôi đã chọn openpyxl là bởi vì nó đại diện cho một giải pháp hoàn chỉnh để tạo trang tính, tải, cập nhật, đổi tên và xóa chúng. Nó cũng cho phép chúng ta đọc hoặc ghi vào các hàng và cột, hợp nhất hoặc hủy hợp nhất các ô hoặc tạo biểu đồ excel Python, v.v.

Đọc thêm  Cách xử lý dữ liệu văn bản bằng TF-IDF trong Python

Thuật ngữ Openpyxl và thông tin cơ bản

  • Sổ làm việc là tên của một tệp Excel trong Openpyxl.
  • Một workbook bao gồm các sheet (mặc định là 1 sheet). Trang tính được tham chiếu theo tên của họ.
  • Một trang tính bao gồm các hàng (dòng ngang) bắt đầu từ số 1 và các cột (dòng dọc) bắt đầu từ chữ A.
  • Các hàng và cột dẫn đến một lưới và các ô biểu mẫu có thể chứa một số dữ liệu (giá trị số hoặc chuỗi) hoặc công thức.

Openpyxl trong tài liệu độc đáo và tôi khuyên bạn nên xem tại đây.

Bước đầu tiên là mở môi trường Python của bạn và cài đặt openpyxl trong thiết bị đầu cuối của bạn:

pip install openpyxl

Tiếp theo, nhập khẩu openpyxl vào dự án của bạn và sau đó tải một sổ làm việc vào tập tin Biến đổi.

import openpyxl

theFile = openpyxl.load_workbook('Customers1.xlsx')
print(theFile.sheetnames)
currentSheet = theFile['customers 1']
print(currentSheet['B4'].value)

Như bạn có thể thấy, mã này in tất cả các trang tính theo tên của chúng. Sau đó, nó chọn trang tính có tên là “khách hàng 1” và lưu nó vào một trang tính hiện tại Biến đổi. Ở dòng cuối cùng, mã in giá trị nằm ở vị trí B4 của trang tính “khách hàng 1”.

Mã này hoạt động bình thường nhưng nó rất khó mã hóa. Để làm cho điều này năng động hơn, chúng tôi sẽ viết mã sẽ:

  • Đọc tập tin
  • Nhận tất cả tên trang tính
  • Lặp qua tất cả các trang tính
  • Ở bước cuối cùng, mã sẽ in các giá trị nằm trong các trường B4 của mỗi trang tính được tìm thấy trong sổ làm việc.
import openpyxl

theFile = openpyxl.load_workbook('Customers1.xlsx')
allSheetNames = theFile.sheetnames

print("All sheet names {} " .format(theFile.sheetnames))


for x in allSheetNames:
    print("Current sheet name is {}" .format(x))
    currentSheet = theFile[x]
    print(currentSheet['B4'].value)

Điều này tốt hơn trước, nhưng nó vẫn là một giải pháp được mã hóa cứng và nó vẫn giả định giá trị bạn sẽ tìm kiếm nằm trong ô B4, điều này thật ngớ ngẩn 🙂

Tôi cho rằng dự án của bạn sẽ cần tìm kiếm bên trong tất cả các trang tính trong tệp Excel để tìm một giá trị cụ thể. Để làm điều này, chúng tôi sẽ thêm một vòng lặp for nữa trong phạm vi “ABCDEF” và sau đó chỉ cần in tên ô và giá trị của chúng.

import openpyxl

theFile = openpyxl.load_workbook('Customers1.xlsx')
allSheetNames = theFile.sheetnames

print("All sheet names {} " .format(theFile.sheetnames))


for sheet in allSheetNames:
    print("Current sheet name is {}" .format(sheet))
    currentSheet = theFile[sheet]
    # print(currentSheet['B4'].value)

    #print max numbers of wors and colums for each sheet
    #print(currentSheet.max_row)
    #print(currentSheet.max_column)

    for row in range(1, currentSheet.max_row + 1):
        #print(row)
        for column in "ABCDEF":  # Here you can add or reduce the columns
            cell_name = "{}{}".format(column, row)
            #print(cell_name)
            print("cell position {} has value {}".format(cell_name, currentSheet[cell_name].value))

Chúng tôi đã làm điều này bằng cách giới thiệu “cho hàng trong phạm vi ..” vòng. Phạm vi của vòng lặp for được xác định từ ô trong hàng 1 đến số hoặc hàng tối đa của trang tính. Tìm kiếm vòng lặp thứ hai trong các tên cột được xác định trước “ABCDEF”. Trong vòng lặp thứ hai, chúng tôi sẽ hiển thị vị trí đầy đủ của ô (tên cột và số hàng) và một giá trị.

Đọc thêm  Cách gửi thông báo đến Ứng dụng web của bạn bằng Python

Tuy nhiên, trong bài viết này, nhiệm vụ của tôi là tìm một cột cụ thể có tên là “điện thoại” rồi duyệt qua tất cả các hàng của cột đó. Để làm điều đó, chúng ta cần sửa đổi mã như dưới đây.

import openpyxl

theFile = openpyxl.load_workbook('Customers1.xlsx')
allSheetNames = theFile.sheetnames

print("All sheet names {} " .format(theFile.sheetnames))


def find_specific_cell():
    for row in range(1, currentSheet.max_row + 1):
        for column in "ABCDEFGHIJKL":  # Here you can add or reduce the columns
            cell_name = "{}{}".format(column, row)
            if currentSheet[cell_name].value == "telephone":
                #print("{1} cell is located on {0}" .format(cell_name, currentSheet[cell_name].value))
                print("cell position {} has value {}".format(cell_name, currentSheet[cell_name].value))
                return cell_name

for sheet in allSheetNames:
    print("Current sheet name is {}" .format(sheet))
    currentSheet = theFile[sheet]

Mã đã sửa đổi này đi qua tất cả các ô của mỗi trang tính và giống như trước khi phạm vi hàng là động và phạm vi cột là cụ thể. Đoạn mã lặp qua các ô và tìm ô chứa văn bản “điện thoại”. Khi mã tìm thấy ô cụ thể, nó sẽ thông báo cho người dùng biết văn bản nằm trong ô nào. Mã thực hiện điều này cho mọi ô bên trong tất cả các trang tính trong tệp Excel.

Bước tiếp theo là đi qua tất cả các hàng của cột cụ thể đó và in các giá trị.

import openpyxl

theFile = openpyxl.load_workbook('Customers1.xlsx')
allSheetNames = theFile.sheetnames

print("All sheet names {} " .format(theFile.sheetnames))


def find_specific_cell():
    for row in range(1, currentSheet.max_row + 1):
        for column in "ABCDEFGHIJKL":  # Here you can add or reduce the columns
            cell_name = "{}{}".format(column, row)
            if currentSheet[cell_name].value == "telephone":
                #print("{1} cell is located on {0}" .format(cell_name, currentSheet[cell_name].value))
                print("cell position {} has value {}".format(cell_name, currentSheet[cell_name].value))
                return cell_name

def get_column_letter(specificCellLetter):
    letter = specificCellLetter[0:-1]
    print(letter)
    return letter

def get_all_values_by_cell_letter(letter):
    for row in range(1, currentSheet.max_row + 1):
        for column in letter:
            cell_name = "{}{}".format(column, row)
            #print(cell_name)
            print("cell position {} has value {}".format(cell_name, currentSheet[cell_name].value))



for sheet in allSheetNames:
    print("Current sheet name is {}" .format(sheet))
    currentSheet = theFile[sheet]
    specificCellLetter = (find_specific_cell())
    letter = get_column_letter(specificCellLetter)

    get_all_values_by_cell_letter(letter)

Điều này được thực hiện bằng cách thêm một chức năng có tên get_column_letter mà tìm thấy một chữ cái của một cột. Sau khi tìm thấy chữ cái của cột, chúng tôi lặp qua tất cả các hàng của cột cụ thể đó. Điều này được thực hiện với get_all_values_by_cell_letter chức năng sẽ in tất cả các giá trị của các ô đó.

kết thúc

áo ngực! Có rất nhiều điều bạn có thể làm sau này. Kế hoạch của tôi là xây dựng một ứng dụng trực tuyến sẽ chuẩn hóa tất cả các số điện thoại của Thụy Điển được lấy từ một hộp văn bản và cung cấp cho người dùng khả năng chỉ cần sao chép kết quả từ cùng một hộp văn bản. Bước thứ hai trong kế hoạch của tôi là mở rộng chức năng của ứng dụng web để hỗ trợ tải tệp Excel lên, xử lý số điện thoại bên trong các tệp đó (chuẩn hóa chúng thành định dạng tiếng Thụy Điển) và cung cấp lại các tệp đã xử lý cho người dùng.

Tôi đã thực hiện cả hai nhiệm vụ đó và bạn có thể thấy chúng trực tiếp trong trang Công cụ của tôi Incodaq.com Địa điểm:

https://tools.incodaq.com/

Ngoài ra, mã từ phần thứ hai của bài viết này có sẵn trên GitHub:

https://github.com/GoranAviani/Manipulate-Excel-spreadsheets

Cảm ơn bạn đã đọc! Xem thêm các bài viết như thế này trên hồ sơ Phương tiện của tôi: https://medium.com/@goranaviani và những nội dung thú vị khác mà tôi xây dựng trên trang GitHub của mình: https://github.com/GoranAviani



Zik.vn – Biên dịch & Biên soạn Lại

spot_img

Create a website from scratch

Just drag and drop elements in a page to get started with Newspaper Theme.

Buy Now ⟶

Bài viết liên quang

DMCA.com Protection Status