#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sun Dec 18 11:16:42 2022
@author: andychen
"""
import os
import shutil
import csv
from datetime import datetime
from collections import defaultdict
source_folder = '/Users/andychen/Desktop/untitled folder/' # 源文件夹(根据绝对路径替换)
target_folder = '/Users/andychen/Desktop/untitled folder 2/' # 目标文件夹(根据绝对路径替换)
latest_files = {} # 每个 SN 对应的最新文件
for filename in os.listdir(source_folder): # 文件夹路径,使用相对路径
name, ext = os.path.splitext(filename)
if ext == '.csv':
time_str = name.split('_')[2] # 获取时间字符串
h, m, s = time_str.split('-') # 分割小时、分钟和秒
new_time_str = f'{h.zfill(2)}-{m.zfill(2)}-{s.zfill(2)}' # 构造新的时间字符串
new_name = name.replace(time_str, new_time_str) + ext # 构造新的文件名
os.rename(os.path.join(source_folder, filename), os.path.join(source_folder, new_name))
# 遍历源文件夹中的所有文件
for file_name in os.listdir(source_folder):
sn = file_name.split('_')[0] # 获取文件名中的 SN
time_str = file_name.split('_')[1] + '_' + file_name.split('_')[2] # 获取文件名中的时间字符串
time = datetime.strptime(time_str, '%Y%m%d_%H-%M-%S') # 将时间字符串转换为 datetime 对象
if sn not in latest_files or time > latest_files[sn][1]: # 如果当前 SN 还没有对应的最新文件,或者当前文件的时间比已知的最新时间更晚
latest_files[sn] = (file_name, time) # 更新最新文件和最新时间
# 遍历每个 SN 对应的最新文件
for sn, (latest_file, latest_time) in latest_files.items():
shutil.copy(f'{source_folder}/{latest_file}', f'{target_folder}/{latest_file}') # 拷贝最新文件到目标文件夹中
# 创建一个字典来存储每个SerialNumber的Panel_Grade值
serialnumber_panelgrade = defaultdict(list)
# 获取文件夹中的所有文件名
filenames = os.listdir(source_folder)
# 遍历文件夹中的每个csv文件
for filename in filenames:
if filename.endswith('.csv'):
with open(os.path.join(source_folder, filename), newline='') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
serialnumber = row['SerialNumber']
panel_grade = row['Panel_Grade']
if panel_grade:
serialnumber_panelgrade[serialnumber].append(panel_grade)
# 创建一个新的csv文件
with open('/Users/andychen/Desktop/untitled folder 2/summary.csv', 'w', newline='') as csvfile: #(根据绝对路径替换)
fieldnames = ['SerialNumber', 'Panel_Grade_test1', 'Panel_Grade_test2']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for serialnumber, panel_grades in serialnumber_panelgrade.items():
row = {'SerialNumber': serialnumber}
for i in range(1, 3):
if i <= len(panel_grades):
row[f'Panel_Grade_test{i}'] = panel_grades[i-1]
else:
row[f'Panel_Grade_test{i}'] = 0
writer.writerow(row)
print("finish")
最后一步汇总每个csv 文件中特定列的值并整合为一个summary 这一步,要读取每一个csv 的特定列“panel grade”并汇总,目标以csv 的文件名中的时间信息排序,更早的时间排在左边,依次向右排列。
引用chatGPT作答,你提供的代码会读取一个文件夹中的每个CSV文件,提取“SerialNumber”和“Panel_Grade”列中的值,并将它们存储在名为“serialnumber_panelgrade”的字典中,其中键为“SerialNumber”值,值为“Panel_Grade”值的列表。然后,它创建一个名为“summary.csv”的新CSV文件,并将“SerialNumber”值写入第一列,相应的“Panel_Grade”值分别写入第二列和第三列。
要按CSV文件名中的时间戳对数据进行排序,可以按如下修改代码:
定义一个函数来从文件名中提取时间戳:
def get_timestamp(filename):
time_str = filename.split('_')[1] + '_' + filename.split('_')[2] # 获取文件名中的时间字符串
time = datetime.strptime(time_str, '%Y%m%d_%H-%M-%S') # 将时间字符串转换为 datetime 对象
return time
然后,在遍历文件夹中的每个CSV文件之前,使用sorted()函数对文件名进行排序,以便按时间戳升序排列。例如:
# 获取文件夹中的所有文件名,并按时间戳升序排列
filenames = sorted(os.listdir(source_folder), key=get_timestamp)
# 遍历排序后的文件名,处理每个CSV文件
for filename in filenames:
# ...
这将按时间戳升序处理CSV文件,从而达到目标。
目的就是在最后的summary 文件,把11 和4 改一下顺序,根据csv 文件名中的时间先后排序罗列
第56行,按降序排列就行
reader = csv.DictReader(csvfile)
你好,我看了一下代码,代码直接能跑的,没有什么问题,我这边跑是正常的,可能是你那个哪里没刷新导致你的问题吧,把summary.csv删掉重新生成试试看吧。
csv_name_list=['1_100.csv','101_200.csv', '201_300.csv', '301_400.csv', '401_500.csv', '501_600.csv', '601_700.csv', '700_719.csv']
length=len(csv_name_list)
# 读取第一个CSV文件并包含表头,用于后续的csv文件拼接
f=open('component:Blink>JavaScript status:Fixed Type=Bug-Regression_2021_11_6/1_100.csv',encoding='utf-8')
df=pd.read_csv(f)
df.to_csv('all_csv',index=False)
f.close()
for i in range(1,length):
filename='component:Blink>JavaScript status:Fixed Type=Bug-Regression_2021_11_6/'+csv_name_list[i]
f=open(filename,encoding='utf-8')
df=pd.read_csv(f)
df.to_csv('all_csv',index=False, header=False, mode='a+')
f.close()