Моя цель - взять содержимое всех текстовых файлов в подпапках, созданных сегодня, и переместить их в один существующий файл report.txt, но я не могу найти хороший способ сделать это. Я не очень опытен в кодировании, поэтому любая помощь будет очень признательна. Вот что у меня есть на данный момент (я знаю, что это мусор):
if getmtime == today:
with open(glob.iglob(drive + "://CADIQ//CADIQ_JOBS//?????????????????????")) as f:
for line in f:
content += line
with open(reportFile, "a") as f:
f.write(content)
Я бы начал с создания объекта desired_date
, который является datetime.date
. Затем вы можете отформатировать эту дату в строку, которая составляет шаблон, который вы хотите искать в своем глобусе. Шаблон глобуса не заботится о времени, только о дате.
from pathlib import Path
import datetime
desired_date = datetime.date(year=2020, month=12, day=22)
pattern = "13.2.1_" + desired_date.strftime("%y_%m_%d") + "_*"
for path in Path("path/to/folders").glob(pattern):
if not path.is_dir():
continue
print(path)
Оттуда вы можете посетить каждый путь, подставить все текстовые файлы по текущему пути и накапливать строки в каждом текстовом файле. Наконец, запишите все в один файл.
import glob
contents = b''
for file in glob.glob('./*/*.txt'): # u can change as per your directory
fname = file.split(r'\\')[-1]
with open(fname, 'rb') as f1:
contents += f1.read()
with open('report.txt','wb') as rep:
rep.write(contents)
Надеюсь, это так поможет :) Лучше попробуйте читать или записывать файлы в байтах, потому что иногда может быть вероятность повреждения данных.
Это просто для того, чтобы определить, что все содержимое будет в двоичном формате
Попробуйте это, основываясь на Как вывести список всех файлов каталога?
import os, time
def last_mod_today(path):
'''
return True if getmtime and time have year, mon, day coincinding in their localtime struct, False else
'''
t_s = time.localtime(os.path.getmtime(path))
today = time.localtime(time.time())
return t_s.tm_mday==today.tm_mday and t_s.tm_year == today.tm_year and t_s.tm_mon == today.tm_mon
name_to_path = lambda d,x:os.path.normpath(os.path.join(os.path.join(os.getcwd(), d),x))
def log_files(d):
'''
walking through the files in d
log the content of f when last modif time for f is today
WARNING : what happens when the file is a JPEG ?
'''
scand_dir = os.path.join(os.getcwd(), d)
print(f"scanning {scand_dir}...")
(_, _, filenames) = next(os.walk(scand_dir))
log = open("log.txt", 'a')
for f in filenames:
if last_mod_today(name_to_path(d,f)):
with open(name_to_path(d,f), 'r') as todays_file:
log.write('##############################\n')
log.write(f"file : {name_to_path(d,f)}\n")
log.write(todays_file.read())
log.write('\n')
log.write('##############################\n')
log.close()
#first scanning files in the current directory
(_, dirnames, _) = next(os.walk('./'))
log_files('./')
#then crawling through the subdirs (one level)
for d in dirnames:
log_files(d)
Если вы хотите, чтобы я подробно рассказал об этом, чтобы получить полный ответ, пожалуйста.
Пробуем это прямо сейчас. Я дам вам знать.
Посмотрите на ссылку над кодом, так как os.walk также предоставит вам каталоги, через которые вы хотите зациклиться. Дайте мне знать, как это происходит. Ты можешь это сделать !
Спасибо, мужик. Я очень ценю это. Таким образом, первая попытка вернула неправильные файлы, но что-то вернула, так что это прогресс, лол.
Итак, в настоящее время он нацелен на каталог, в котором находится командный файл, но мне нужно, чтобы он нацеливался на все подкаталоги в другом каталоге.
изменить параметр os.walk()
Возникла небольшая проблема. Мне нужно получить все текстовые файлы из подпапок. Я не буду знать названия подпапок, потому что они меняются в зависимости от времени создания. Что бы я ввел для параметра os.walk(), чтобы получить это?
Сколько у вас папок в папках в папках? (насколько глубоко мы будем сканировать?
Текстовые файлы находятся в подпапках папки, для которой у меня есть путь. FolderIKnow/SubfoldersIHaveToObtainRelativelyByDate/TextFiles
хорошо, у меня должно быть что-то подходящее
Я сделал некоторые изменения в первом ответе выше. Не забудьте пометить его как принятый ответ, если он соответствует вашим потребностям!
Проверяем это через мгновение. Если это сработает, я обязательно отмечу это как принятый ответ. Большое вам спасибо за вашу помощь. Ты обалденный.
На самом деле я не использовал ваш код для T, но контент и знания, которыми вы поделились, определенно помогли мне в этом, поэтому я отмечаю ваш ответ как принятый ответ. Большое вам спасибо за вашу помощь!
Не за что ! Удачи
Что представляет содержимое = b ''?