#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 пожалуйста, примите ответ, если он решил вашу проблему.