python csv 数据处理简单问题


#!/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")

img

img

最后一步汇总每个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删掉重新生成试试看吧。

img

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7433983
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:【Python】批量读取csv文件的第一列,并整合到嵌套列表中
  • 除此之外, 这篇博客: python数据清洗+数据可视化中的 $$$ 将几个csv文件合为一个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()
    
  • 您还可以看一下 章秀淞老师的python数据分析和可视化课程中的 读取和导出csv文件小节, 巩固相关知识点