Python對csv文件指定單元格的處理


CSV文件:Comma-Separated Values,逗號分隔值或者字符分割值,其文件以純文本的形式存儲表格數據。用文本文件和Excel都可以打開CSV文件。

下面是分別用excel和記事本打開的兩個csv文件。
規范的t.csv
圖1
在這里插入圖片描述

非規范的test.csv
在這里插入圖片描述在這里插入圖片描述

注意:
如果單元格內容中存在逗號,那么這個單元格內容會用雙引號分隔出來。如圖中test.csv中第一個單元格。
如果單元格內容中存在雙引號,那在記事本打開同樣會多加引號,具體怎么加這里csv的處理規則好像有點奇怪,目前我也還沒完全搞明白。

一般的csv文件都有規范的表頭和對應的每行數據,前兩張圖片中打開的都是規范的csv文件,后兩張圖片打開的是非規范的csv文件,而Python的csv庫中也只有對csv文件整行的操作,並沒有像excel一樣可以對任意單元格操作,所以要對非規范的csv文件操作任意單元格是困難的。

本文實現了對非規范的csv文件的操作。
思路:csv–>二維列表–>通過列表定位單元格–>列表重寫成csv

代碼如下:

import csv


class HandleCsv:
    # 定義存放csv內容的list
    csv_list = []

    def __init__(self, filename):
        self.filename = filename
        with open(self.filename)as fp:
            self.csv_list = list(csv.reader(fp))
            print(self.csv_list)

    # 在第N行第M列空白單元格處修改內容
    def modify(self, n, m, value):
        self.csv_list[n - 1][m - 1] = value

    # 插入第N行
    def insert_row(self, n):
        self.csv_list.insert(n - 1, [])

    # 在第N行第M列單元格插入
    def insert_col(self, n, m, value):
        # 如果該單元格左邊的單元格為空,那么先對左邊的單元格寫入空格
        if len(self.csv_list[n - 1]) < m:
            if len(self.csv_list[n - 1]) == m - 1:
                self.csv_list[n - 1].append(value)
            else:
                for i in range(len(self.csv_list[n - 1]), m - 1):
                    self.csv_list[n - 1].append('')
                self.csv_list[n - 1].append(value)
        else:
            self.modify(n, m, value)

    # 刪除第N行
    def del_row(self, n):
        del self.csv_list[n - 1]

    # 獲取第n行第m列單元格內容
    def get_value(self, n, m):
        return self.csv_list[n - 1][m - 1]

    def list2csv(self, file_path):
        try:
            fp = open(file_path, 'w')
            for items in self.csv_list:
                for i in range(len(items)):
                    # 若元素中含有逗號,那么需要加雙引號
                    if items[i].find(',') != -1:
                        fp.write('\"')
                        fp.write(items[i])
                        fp.write('\"')
                    else:
                        fp.write(items[i])
                    # 最后一個元素不用加逗號
                    if i < len(items) - 1:
                        fp.write(',')
                fp.write('\n')
        except Exception as e:
            print(e)


if __name__ == '__main__':
    h_csv = HandleCsv(u'test.csv')
    # 在第4行處插入一行
    h_csv.insert_row(4)
    # 在第4行第4列處插入單元格
    h_csv.insert_col(4, 4, '第4行,第4列')
    h_csv.list2csv(u'test.csv')

運行程序前的csv:
在這里插入圖片描述
運行程序后的csv:
在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM