【问题标题】:Seperate files to folders and sub folders using python script使用python脚本将文件分离到文件夹和子文件夹
【发布时间】:2019-07-24 12:01:02
【问题描述】:

在下面的代码中,所有输出文件都被写入 T1 文件夹。如何将这些输出文件分成与原始子文件夹(原始 csv 文件所在的位置)同名的子文件夹?谢谢

import pandas as pd
import numpy as np
import glob
import os

path = '/root/Desktop/TT1/'
mystep = 0.4

#define the function
def data_splitter(df, name):
    max_time = df['Time'].max() # get max value of Time for the current csv file (df)
    myrange= np.arange(0, max_time, mystep) # build the threshold range
    for k in range(len(myrange)):
        # build the upper values 
        temp = df[(df['Time'] >= myrange[k]) & (df['Time'] < myrange[k] + mystep)]
        temp.to_csv("/root/Desktop/T1/{}_{}.csv".format(name, k))

# use os.walk(path) on the main path to get ALL subfolders inside path
for root,dirs,_ in os.walk(path):
    for d in dirs:
        path_sub = os.path.join(root,d) # this is the current subfolder
        for filename in glob.glob(os.path.join(path_sub, '*.csv')):
            df = pd.read_csv(filename)
            name = os.path.split(filename)[1] # get the name of the current csv file
            data_splitter(df, name)

【问题讨论】:

    标签: python python-3.x csv


    【解决方案1】:

    这应该会有所帮助

    演示:

    import pandas as pd
    import numpy as np
    import glob
    import os
    
    path = '/root/Desktop/TT1/'
    mystep = 0.4
    
    #define the function
    def data_splitter(df, name, dest_folder):
        max_time = df['Time'].max() # get max value of Time for the current csv file (df)
        myrange= np.arange(0, max_time, mystep) # build the threshold range
        basepath = "/root/Desktop/"
        for k in range(len(myrange)):
            # build the upper values 
            temp = df[(df['Time'] >= myrange[k]) & (df['Time'] < myrange[k] + mystep)]
            dest_f = os.path.join(basepath, dest_folder)
            if not os.path.isdir(dest_f):
                os.mkdir(dest_f)
            temp.to_csv(os.path.join(dest_f, "{}_{}.csv".format(name, k)))
    
    # use os.walk(path) on the main path to get ALL subfolders inside path
    for root,dirs, files in os.walk(path):
        for f in files:
            if f.endswith(".csv"):
                filename = os.path.join(root, f)
                df = pd.read_csv(filename)
                name = os.path.split(os.path.basename(filename))[1]
                dest_folder = os.path.basename(os.path.dirname(filename))
                data_splitter(df, name, dest_folder)
    

    【讨论】:

    • 谢谢。有一个小错误。假设在 TT1 文件夹中有两个子文件夹“sub1”和“sub2”。在 sub1 里面有文件夹 'sub1a'、'sub1b'.. 在 sub2 里面也有文件夹 'sub2a'、'sub2b'。在这些子文件夹中,我得到了 csv 文件。根据您的代码,只有 sub1a、sub1b、sub2a、sub2b 是使用 csv 文件创建的。但是它上面的文件夹 Sub1 和 Sub2 没有被创建。 Sub1 和 Sub2 内没有 csv 文件。但是那些需要被创造。而在这些 (Sub1, Sub2) 中,只有 sub1a、sub1b、sub2a、sub2b 需要使用 csv 文件创建
    • 马丁展示的方法很好stackoverflow.com/questions/57039336/…,但我不知道如何将它应用于这个问题
    【解决方案2】:

    类似的方法应该在这里工作:

    import pandas as pd
    import numpy as np
    import glob
    import os
    
    input_root = '/root/Desktop/TT1'
    output_root = '/root/Desktop/T1'
    
    mystep = 0.4
    
    #define the function
    def data_splitter(input_file, output_path, output_basename):
    
        df = pd.read_csv(input_file)
        max_time = df['Time'].max() # get max value of Time for the current csv file (df)
        myrange = np.arange(0, max_time, mystep) # build the threshold range
    
        for k in range(len(myrange)):
            # build the upper values 
            temp = df[(df['Time'] >= myrange[k]) & (df['Time'] < myrange[k] + mystep)]
            temp.to_csv(os.path.join(output_path, f"{output_basename}_{k}.csv"))
    
    
    # use os.walk(path) on the main path to get ALL subfolders inside path
    for dirpath, dirnames, filenames in os.walk(input_root):
        for filename in filenames:
            if filename.lower().endswith('.csv'):
                input_file = os.path.join(dirpath, filename)
                sub_folders = dirpath[len(input_root)+1:]
                output_path = os.path.join(output_root, sub_folders)
                os.makedirs(output_path, exist_ok=True)  # Ensure the output folder exists
                output_basename = os.path.join(output_path, os.path.splitext(filename)[0] + '.csv')
    
                data_splitter(input_file, output_path, output_basename)
    

    这应该会导致在您的输出根文件夹中重新创建文件夹结构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 2016-03-10
      • 2021-05-13
      • 1970-01-01
      • 1970-01-01
      • 2015-01-20
      • 1970-01-01
      相关资源
      最近更新 更多