使用PYTHON做项目遇到的问题及解决办法

由於刚上手一个python做项目,会遇到各种的坑,所以边学习边实践,通过写一篇博文来记录其中的知识点,方便自己以后再用到时便于查找。

第一步:创建文件夹,用来存中间计算过程中的数据

def mkdir(path): 
    folder = os.path.exists(path) 
    if not folder:                   #判断是否存在文件夹如果不存在则创建为文件夹
        os.makedirs(path)            #makedirs 创建文件时如果路径不存在会创建这个路径
        print ("創建新文件夾:%s"%path)
    else:
        for info in os.listdir(path):
            domain=os.path.abspath(path)  #获取文件夹的路径
            info=os.path.join(domain,info) 
            os.remove(info)
#         print( "\該文件夾已經存在,已經清空文件夾下的所有內容")
file1 = "D:\\SPI\\Real"
mkdir(file1)

第二步:匹配信息,读取CSV文件夹的的数据,并存到txt文档中
老板说了,你这个程序,一些必要的信息能不能只输入一次就可以了,以后就不要认为输入了。后来我想,创建一个文件夹,里面建一个excel文档,把要输入的信息固定文件命名格式和里面内容格式定死,只要用户往里面填写东西就行了。当然了,要输入信息的这个文件名称和搜索数据的文件名称要对得上才行,例如,D:\SPI\Model里有A121231.xlsx 、A121232.xlsx 和D:\SPI\SPIDATA\A121231_dsf.csv、A121231_dss2f.csv、A121231_ds222f.csv、A121231_dsf454.csv有相同的A121231,根据这个就把A121231.xlsx和D:\SPI\SPIDAT里面的文件夹数据匹配起来了。

if not os.listdir('D:\\SPI\\SPIDATA'):
    time.sleep(2)
else:
    for info1 in os.listdir(r'D:\\SPI\\Model'):       
        a=info1.split('.')[0]        
        for info2 in os.listdir(r'D:\\SPI\\SPIDATA'):    
            b=info2.split('_')[0]            
            if a==b:                
                c=a
            else:
                continue
path=pd.read_excel('D:\SPI\\Model\\%s.xlsx'%c)   
pad=path.PAD
upA=path.upA    
downA=path.downA   
upH=path.upH
downH=path.downH   

第三部:数据定期读取

在这个程序中,每5秒钟就读取一次文件夹,把满足条件的数据读出来并存到dataframe中,当一个csv文档被读完后,把它移到到另外一个地方去,防止下次读取时重复读取,如果这个文件夹对你没有用来,也可以考虑删掉。

while 1==1: 
    if not os.listdir('D:\\SPI\\SPIDATA') or len([name for name in os.listdir(r'D:\\SPI\\SPIDATA')])<batch+1:
        time.sleep(5)   #當文件個數不等於20時,休眠5秒鐘
    else:       
        domain=os.path.abspath(r'D:\\SPI\\SPIDATA')  #获取文件夹的路径
        for info in os.listdir(r'D:\\SPI\\SPIDATA'):
            info=os.path.join(domain,info)    #将路径与文件名结合起来就是每个文件的完整路径
            infoo=open(info,'r')    #读取文件内容 
            d=infoo.readlines()
            for j in range(len(pad)):  
                DT=[]
                PAD=[]
                HIGHT=[]
                AREA=[]
                for i in range(len(d)):
                    if d[i].split(',')[1]==pad[j]:
                        dt=d[i].split(',')[0]
                        dt=datetime.datetime.strptime(dt,'%Y/%m/%d %H:%M:%S')
                        DT.append(dt)
                        PAD.append(d[i].split(',')[1])                        
                        area=int(d[i].split(',')[2])
                        hight=int(d[i].split(',')[3].split('\n')[0])            
                        HIGHT.append(hight)                        
                        AREA.append(area)
                    else:
                        continue
                A=[DT,PAD,AREA,HIGHT]
                db=pd.DataFrame(A,index=['DateTime','Pad','HIGHT','AREA'])
                db=db.T
                db=db.drop_duplicates()  #移除重複值
                db.sort_values(by='DateTime',ascending=True,inplace=True)  #按升序排序數據,並覆蓋掉原來的
               
                for s in range(len(db)):  # 面積標準化 & 清洗異常值                                    
                    if (db.AREA[s]/np.mean(db.AREA)>2) or (db.AREA[s]/np.mean(db.AREA)<0.5):
                        db.AREA[s]=np.mean(db.AREA)
                        db.HIGHT[s]=np.mean(db.HIGHT)                   
              
                fileName1='%s.txt'%pad[j]    #把每一個pad點的高度和面積存到對應的文件夾中
                filePath1=file1+os.path.sep+fileName1
                db.to_csv(filePath1,sep=',',index=False,header=None,mode='a+')  
            infoo.close()  #關閉已打開的文件 
            shutil.move(info,file3)   #移動文件到path裡

第四步|:数据排序
在这一步中,遇到数据按时间排序的问题,在在网上找到的办法是db.sort_values(by=‘DateTime’),这种办法打印出来后,看到的数据是按时间排序了,但是原始数据db的顺序并没有被打乱。要修改为db.sort_values(by=‘DateTime’,ascending=True,inplace=True)
在这里插入图片描述
这里遇到一个坑,关于时间转换的问题,我用过两种办法,一种是用datetime,另一种是time,发现用datetime 转换会不准,至于为什么,我还没搞明白。
举个例子:

import datetime
import time
Time='2019-04-23 21:15:36'
T=datetime.datetime.strptime(Time,'%Y-%m-%d %H:%M:%S')
d11=datetime.datetime.timestamp(T)
dateArray = datetime.datetime.utcfromtimestamp(d11)
otherStyleTime = dateArray.strftime("%Y-%m-%d %H:%M:%S")
print(otherStyleTime)

otherStyle=time.strptime(Time,'%Y-%m-%d %H:%M:%S')
otherStyle1=time.mktime(otherStyle)  #轉換成時間錯
otherStyle2=time.localtime(otherStyle1)
otherStyle3=time.strftime('%Y-%m-%d %H:%M:%S',otherStyle2)
print(otherStyle3)

2019-04-23 13:15:36
2019-04-23 21:15:36

至于项目中的其他程序,怕被老板看到,就不一一贴出来了。

程序要实际应用起来,还有很多路要走,还有很多地方要修改完善,这一路上的苦,跪着也要走完。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值