## 幫阿雪寫的一個小程序
---------------------------------------------------------------------------------------------------
上大學的時候,總是會由很多表格需要同學們去搞,尤其是剛開學的那個時候,顯然是很煩躁,
阿雪剛開學的時候,作爲班幹部,表示有時候剛錄表不是很熟悉經常會弄到很晚,甚至還會弄錯,
這就讓我很是觸動,所以想幫她搞一搞,順便增強一下我們的友誼/hhhhhh
---------------------------------------------------------------------------------------------------
思路:
第一步: 信息還是要填的,以往是同學們發給班委,然後慢慢來搞,但現在不一樣的,我要求同學們把他們要填的信息寫在記事本里面,內容之間用中文逗號隔開,然後在發給我就行。
第二步: 阿雪只要做的事情是把每個小朋友發的txt文本點擊下載就行了,這個顯然很簡單的事情。
第三步: QQ個人接受的文件一般都會在 (FileRecv)這個文件夾內,每個朋友QQ存放的位置不一樣我這裏就不詳細說明了,我自己存放的位置是:(r’D://qq//qq文檔//‘我的qq號’/FileRecv//) 我們把這個路徑就姑且叫做qq_path吧!這個路徑我們需要事先寫入代碼內,我這裏定義的函數是copy_file()內:具體思想對了就行。
第四步: 整個程序沒啥操作難度,根據提示填入指令就行,都是批量處理,函數中我設置了時間間隔,我個人感覺這樣能讓程序有個停頓感,更友好一點吧。
函數庫:
- os庫: 用於創建文件夾,修改路徑,確定路徑,文件遍歷等操作
- csv庫: 用於表格的錄入
- time庫: 用於程序停頓感
- pandas庫: 用於csv和xlsx格式之間的轉換
- 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()