幫阿雪寫的一個自動錄入表格的小程序

## 幫阿雪寫的一個小程序
---------------------------------------------------------------------------------------------------
上大學的時候,總是會由很多表格需要同學們去搞,尤其是剛開學的那個時候,顯然是很煩躁,
阿雪剛開學的時候,作爲班幹部,表示有時候剛錄表不是很熟悉經常會弄到很晚,甚至還會弄錯,
這就讓我很是觸動,所以想幫她搞一搞,順便增強一下我們的友誼/hhhhhh

---------------------------------------------------------------------------------------------------

思路:

第一步: 信息還是要填的,以往是同學們發給班委,然後慢慢來搞,但現在不一樣的,我要求同學們把他們要填的信息寫在記事本里面,內容之間用中文逗號隔開,然後在發給我就行。

第二步: 阿雪只要做的事情是把每個小朋友發的txt文本點擊下載就行了,這個顯然很簡單的事情。

第三步: QQ個人接受的文件一般都會在 (FileRecv)這個文件夾內,每個朋友QQ存放的位置不一樣我這裏就不詳細說明了,我自己存放的位置是:(r’D://qq//qq文檔//‘我的qq號’/FileRecv//) 我們把這個路徑就姑且叫做qq_path吧!這個路徑我們需要事先寫入代碼內,我這裏定義的函數是copy_file()內:具體思想對了就行。

第四步: 整個程序沒啥操作難度,根據提示填入指令就行,都是批量處理,函數中我設置了時間間隔,我個人感覺這樣能讓程序有個停頓感,更友好一點吧。

函數庫:

  1. os庫: 用於創建文件夾,修改路徑,確定路徑,文件遍歷等操作
  2. csv庫: 用於表格的錄入
  3. time庫: 用於程序停頓感
  4. pandas庫: 用於csv和xlsx格式之間的轉換
  5. shutil庫: 用於文件的複製

複製函數:把qq接受的文件全部轉移到我們指定的位置便於操作

def copy_file():  # 將qq地址下的文本文件轉移到文本存放處待用
    qq_path = r'D://qq//qq文檔//qq//FileRecv//'  # 文本在qq的位置
    for filename in os.listdir(qq_path):
        txt_path = os.path.join(qq_path, filename)  # 拼接這二個地址 進行判斷
        if txt_path[-4:] == '.txt':
            if txt_path[-5:-4] in [str(i) for i in range(10)]:
                # 取後綴判斷 取學號判斷 是否是我們需要的txt
                shutil.copy(txt_path, patht)  # 進行復制
                os.remove(txt_path)  # 刪除在qq地址的文件 避免下次錄入 文本過多
            elif txt_path[-6:-4] in [str(i) for i in range(10, 66)]: # 班級人數個人設定
                shutil.copy(txt_path, patht)  # 進行復制
                os.remove(txt_path)  # 刪除在qq地址的文件 避免下次錄入 文本過多

    return qq_path

信息的錄入:遍歷文件夾,逐一讀入文本,將得到的信息放入列表

def luru():
    # 把文本以學號保存 文本里面信息用中文逗號分隔
    qq_path = copy_file()  # 複製文本到patht
    listss = []  # 錄入信息列表
    filenamepath = []  # 文件名稱地址
    pathtxt = r'D://測試文件//文本存放處//'
    for filename in os.listdir(pathtxt):  # 遍歷文本存放處所有的文件
        filenamepath.append(os.path.join(pathtxt, filename))
    print("當前目錄{}存放着{}個文件:".format(pathtxt, len(filenamepath)))
    if len(filenamepath) == 0:
        print('請確保文件正確存放在{}處:'.format(qq_path))
    for i in range(len(filenamepath)):  # 遍歷這個列表  獲得絕對地址
        with open(filenamepath[i], "r", encoding='utf-8') as fo:
            for j in fo:
                listss.append(j.split(','))

    return listss

在這裏我加了一個小判斷,如果錄入文本信息爲0,那麼可能qq接受信息地址沒有填對,路徑沒有很好的確定,導致這個bug

表格的錄入:這個就很簡單了,利用os庫和csv庫

def wubiaotou():
    name = input("重命名該表格名稱:")
    with open(pathb + name + ".csv", "a+", newline='') as fo:
        num = input("請輸入表頭,並用中文逗號分隔開:")
        headers = num.split(",")
        # headers = ["國籍","民族","省份"]
        fr_csv = csv.writer(fo)
        fr_csv.writerow(headers)
        fr_csv.writerows(lists)

    pathnamew = pathb + name + '.csv'
    time.sleep(0.5)
    successful(pathnamew)
    time.sleep(2)
    demo()

刪除功能:象徵性的寫了一下,爲了把功能完善一點。

def del_s(path_, fg):
    os.chdir(path_)  # 進入path_存放處地址
    biaonumber = len(os.listdir(path_))
    print("當前目錄下{}存在{}個文件:".format(path_, biaonumber))
    if biaonumber == 0:
        print("無需刪除,當前目錄下存在{}個文件".format(biaonumber))
    else:
        delnum = input("請輸入要刪除的文件名稱,並用中文逗號隔開,若輸入all則全部刪除:").split(",")
        if delnum[0] == 'all':  # 當索引第一個爲all則刪除全部
            for filename in os.listdir(path_):  # 遍歷這個文件夾
                os.remove(os.path.join(path_, filename))
            time.sleep(0.5)
            print("已經刪除{}目錄下所有文件!".format(path_))
        else:  # 刪除輸入的表格名稱
            for i in range(len(delnum)):
                fn = str(delnum[i]) + fg
                os.remove(os.path.join(path_ + fn))
            time.sleep(0.5)
            print("已經刪除{}目錄下{}個文件!".format(path_, len(delnum)))
    time.sleep(2)
    demo()


整個代碼不是很難理解,仔細看看應該都能明白,相信你們,奧力給,幹了兄弟們!

全部代碼如下:

# -*- coding :  utf-8 -*-
# @Time      :  2020/3/2  18:38
# @author    :  沙漏在下雨
# @Software  :  PyCharm
import os
import csv
import time
import pandas as pd
import shutil

path = r'D://測試文件//'
if not os.path.exists(path):  # 創建這個存放文件的大目錄
    os.mkdir(path)

patht = path + "文本存放處//"
if not os.path.exists(patht):  # 創建這個存放文本的文件夾
    os.mkdir(patht)

pathb = path + "表格存放處//"
if not os.path.exists(pathb):  # 創建這個存放表格的文件夾
    os.mkdir(pathb)


def copy_file():  # 將qq地址下的文本文件轉移到文本存放處待用
    qq_path = r'D://qq//qq文檔//qq//FileRecv//'  # 文本在qq的位置
    for filename in os.listdir(qq_path):
        txt_path = os.path.join(qq_path, filename)  # 拼接這二個地址 進行判斷
        if txt_path[-4:] == '.txt':
            if txt_path[-5:-4] in [str(i) for i in range(10)]:
                # 取後綴判斷 取學號判斷 是否是我們需要的txt
                shutil.copy(txt_path, patht)  # 進行復制
                os.remove(txt_path)  # 刪除在qq地址的文件 避免下次錄入 文本過多
            elif txt_path[-6:-4] in [str(i) for i in range(10, 66)]:
                shutil.copy(txt_path, patht)  # 進行復制
                os.remove(txt_path)  # 刪除在qq地址的文件 避免下次錄入 文本過多

    return qq_path


def luru():
    # 把文本以學號保存 文本里面信息用中文逗號分隔
    qq_path = copy_file()  # 複製文本到patht
    listss = []  # 錄入信息列表
    filenamepath = []  # 文件名稱地址
    pathtxt = r'D://測試文件//文本存放處//'
    for filename in os.listdir(pathtxt):  # 遍歷文本存放處所有的文件
        filenamepath.append(os.path.join(pathtxt, filename))
    print("當前目錄{}存放着{}個文件:".format(pathtxt, len(filenamepath)))
    if len(filenamepath) == 0:
        print('請確保文件正確存放在{}處:'.format(qq_path))
    for i in range(len(filenamepath)):  # 遍歷這個列表  獲得絕對地址
        with open(filenamepath[i], "r", encoding='utf-8') as fo:
            for j in fo:
                listss.append(j.split(','))

    return listss


lists = luru()


def youbiaotou():
    print("請將帶有表頭的表格事先放入{}處待用:".format(pathb))
    names = input("請輸入該表格名稱:")
    pathnamey = pathb + names + ".xlsx"  # 獲得原xlsx的地址
    # 使用pandas 講 xlsx 轉換爲 csv 格式 便於後續操作
    date_xlsx = pd.read_excel(pathnamey, index_col=0)
    pathnamec = pathb + names + '.csv'
    date_xlsx.to_csv(pathnamec, encoding='utf_8_sig')  # 防止轉換時候編碼錯誤
    with open(pathnamec, "a+", encoding='utf-8', newline='') as fo:
        fw_csv = csv.writer(fo)
        fw_csv.writerows(lists)  # 寫入多行
    time.sleep(0.5)
    successful(pathnamec)
    time.sleep(2)
    demo()


def successful(pathname):  # 錄入成功標識
    print("表格製作成功!".center(38, '-'))
    print("表格位置:{}".format(pathname))
    print("--" * 22)


def wubiaotou():
    name = input("重命名該表格名稱:")
    with open(pathb + name + ".csv", "a+", newline='') as fo:
        num = input("請輸入表頭,並用中文逗號分隔開:")
        headers = num.split(",")
        # headers = ["國籍","民族","省份"]
        fr_csv = csv.writer(fo)
        fr_csv.writerow(headers)
        fr_csv.writerows(lists)

    pathnamew = pathb + name + '.csv'
    time.sleep(0.5)
    successful(pathnamew)
    time.sleep(2)
    demo()


def helpss():  # 幫助信息
    helptxt = ('說明:\t該程序主要作用是實現簡單的自動錄入表格功能\n\n'
               '格式:\t文本信息寫入記事本並用中文逗號將內容隔開,命名規則爲學生學號\n\n'
               '操作:\t只需要事先獲得本臺機器騰訊QQ文件保存地址即(FileRecv地址)'
               '將其事先寫入代碼內\n\n'
               '備註:\t程序自動將文本打包放入文本存放處(具體位置:{0})進行後續操作\n\n'
               '\t若調用模塊有表頭錄入功能,請事先將待用表格放入({1})處待用\n\n'
               '\t最後表格將放入表格存放處(具體位置:{2})進行查看\n\n'
               '\t同時程序功能還實現了批量刪除文本和表格功能供給選擇\n\n'
               '\t若存在相同名稱表格的不同格式'
               '則優先刪除(.csv)格式的表格\n\n'.format(patht, pathb, pathb))
    with open(path + '幫助信息.txt', "w", encoding='utf-8') as fo:
        fo.write(helptxt)
    if os.path.exists(path + '幫助信息.txt'):
        # newname = '幫助信息.txt'
        # os.rename(path+'helptxt.txt',path+newname)
        os.system(path + '幫助信息.txt')

    demo()


def del_s(path_, fg):
    os.chdir(path_)  # 進入path_存放處地址
    biaonumber = len(os.listdir(path_))
    print("當前目錄下{}存在{}個文件:".format(path_, biaonumber))
    if biaonumber == 0:
        print("無需刪除,當前目錄下存在{}個文件".format(biaonumber))
    else:
        delnum = input("請輸入要刪除的文件名稱,並用中文逗號隔開,若輸入all則全部刪除:").split(",")
        if delnum[0] == 'all':  # 當索引第一個爲all則刪除全部
            for filename in os.listdir(path_):  # 遍歷這個文件夾
                os.remove(os.path.join(path_, filename))
            time.sleep(0.5)
            print("已經刪除{}目錄下所有文件!".format(path_))
        else:  # 刪除輸入的表格名稱
            for i in range(len(delnum)):
                fn = str(delnum[i]) + fg
                os.remove(os.path.join(path_ + fn))
            time.sleep(0.5)
            print("已經刪除{}目錄下{}個文件!".format(path_, len(delnum)))
    time.sleep(2)
    demo()


def demo():  # 目錄因素
    fix = '-' * 44
    title = '文本錄入表格系統'.center(38, '-')
    helps = '使用說明請輸入數值 1'.center(40, ' ')
    fit1 = '模板無表頭請輸數值 2'.center(40, ' ')
    fit2 = '模板有表頭請輸數值 3'.center(40, ' ')
    del1 = '刪除文本請輸入數值 4'.center(40, ' ')
    del2 = '刪除表格請輸入數值 5'.center(40, ' ')
    fix = '-' * 44
    c = ['fix', 'title', 'helps', 'fit1', 'fit2', 'del1', 'del2', 'fix']
    for i in c:
        print('{}'.format(eval(i)))
    control = input("請輸入你的數值:")
    if control == '1':
        helpss()
    elif control == '2':
        wubiaotou()
    elif control == '3':
        youbiaotou()
    elif control == '4':
        fg = '.txt'
        del_s(patht, fg)
    elif control == '5':
        fg = '.csv'
        del_s(pathb, fg)
    else:
        print("輸入選項錯誤!")


demo()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章