Команда Linux из python для выполнения внутри вложенных папок

#python #linux

#python #linux

Вопрос:

Это моя структура папок:

 ORDERNO'S  YEAR'S  MONTH'S  DATE'S  CSVFILES
408------->2010---->01-->21--->1.CSV
                           --->2.CSV
                      --->22--->1.CSV
                           --->2.CSV
               ----->02-->21--->1.CSV
                           --->2.CSV
                      --->22--->1.CSV
                           --->2.CSV
               ...
    ------->201101-->21--->1.CSV
                           --->2.CSV
                      --->22--->1.CSV
                           --->2.CSV
               ----->02-->21--->1.CSV
                           --->2.CSV
                      --->22--->1.CSV
                           --->2.CSV
    ------->201201-->21--->1.CSV
                           --->2.CSV
                      --->22--->1.CSV
                           --->2.CSV
               ----->02-->21--->1.CSV
                           --->2.CSV
                      --->22--->1.CSV
                           --->2.CSV
               ...
    ------->2013--01-->21--->1.CSV
                           --->2.CSV
                      --->22--->1.CSV
                           --->2.CSV
               ----->02-->21--->1.CSV
                           --->2.CSV
                      --->22--->1.CSV
                           --->2.CSV
               ...
  

Поскольку их много файлов csv внутри определенной даты.
я хочу объединить все csv-файлы внутри каждой папки с датой с заголовком 1-го файла только в один файл, а имя — как orderno_year_month_date.csv.
означает, что у каждого папки с датой будет только один csv, названный в честь их родителя folders.So ,
мне нужна чистая команда для этого в Linux, которую я могу запустить вне каталога ORDERNO или выполнить ту же команду с помощью скрипта python, чтобы мне не приходилось снова и снова заходить в папку и вручную выполнять команду.

** Этот же вопрос был опубликован в askubuntu за 3 месяца до этого, но там нет ответов.

Ожидаемая структура должна быть такой

 ORDERNO'S  YEAR'S  MONTH'S  DATE'S  CSVFILES
408------->2010---->01-->21--->408_2010_01_21.CSV
                      --->22--->408_2010_01_22.CSV
                      ...
  

Ранее я переходил к папкам каждой даты каждого месяца, папке каждого года, папке каждого заказа. и используйте для запуска этой команды для одного файла для заголовка.

 awk '(NR == 1) || (FNR > 1)' *.csv > 4011_2020_07_16.csv  (example)
  

Ответ №1:

Я буду использовать эту фиктивную файловую структуру (построенную с помощью tree команды и сохраненную ~/test/ на моем компьютере):

 test
└── 408
    └── 2010
        └── 01
            ├── 21
            │   ├── 1.csv
            │   └── 2.csv
            ├── 22
            │   ├── 1.csv
            │   └── 2.csv
            └── 23
                ├── 1.csv
                └── 2.csv
  

Вы можете переименовывать файлы, используя Python, с помощью pathlib и объединять их с помощью pandas :

 import pandas as pd

from pathlib import Path

def getfolders(files):
    return sorted(list(set([file.parent for file in files])))

def getpathproperty(folder, prop):
    properties = {"orderno": 3, "year": 2, "month": 1, "day": 0}
    for i in range(properties[prop]):
        folder = folder.parent
    return folder.stem

path = Path("~/test").expanduser()
allfiles = list(path.rglob("*.csv")) # Each file in allfiles is a Path object

folders = getfolders(allfiles)

for folder in folders:
    files = sorted(list(folder.glob("*.csv")))
    df = pd.concat([pd.read_csv(file) for file in files])

    # Get the values from the path to rename the files
    orderno = getpathproperty(folder, "orderno")
    year = getpathproperty(folder, "year")
    month = getpathproperty(folder, "month")
    day = getpathproperty(folder, "day")

    # Save the new CSV file
    df.to_csv(folder/f"{orderno}_{year}_{month}_{day}.csv", index=False)

    # Delete old files, commented for safety
    # for file in files:
        # file.unlink(missing_ok=True)
  

Это дает:

 test
└── 408
    └── 2010
        └── 01
            ├── 21
            │   └── 408_2010_01_21.csv
            ├── 22
            │   └── 408_2010_01_22.csv
            └── 23
                └── 408_2010_01_23.csv
  

Комментарии:

1. отлично, я попробую это вечером.

2. @NavinMishra пожалуйста, примите ответ, если он решил вашу проблему.