python的新手,非常感谢一点帮助。 我想通过10个目录并将每个目录中的最新文件复制回单个文件夹。每个目录中可能有多个文件。
我可以从每个目录中提取完整的列表,但不确定如何缩小范围。任何方向将不胜感激。 在STATES目录中将是每个州的目录(即CA,NY,FL,MI,GA)
**编辑是否有用,目录结构如下所示: ' / DAT /用户/状态/ CA /' ' / DAT /用户/状态/ NY /' ' / DAT /用户/状态/ MI /'
import glob
import os
data_dir = '/dat/users/states/*/'
file_dir_extension = os.path.join(data_dir, '*.csv')
for file_name in glob.glob(file_dir_extension):
if file_name.endswith('.csv'):
print (file_name)
答案 0 :(得分:1)
您可以使用os.walk()
代替glob.glob()
来遍历所有文件夹。对于每个文件夹,您将获得其中的文件名列表。这可以使用os.path.getmtime()
按日期排序。这将导致最新文件位于列表的开头。
弹出列表中的第一个元素并将其复制到目标文件夹。然后可以使用os.remove()
删除列表中的其余元素,如下所示:
import os
import shutil
root = r'/src/folder/'
copy_to = r'/copy to/folder'
for dirpath, dirnames, filenames in os.walk(root):
# Filter only csv files
files = [file for file in filenames if os.path.splitext(file)[1].lower() == '.csv']
# Sort list by file date
files = sorted(files, key=lambda x: os.path.getmtime(os.path.join(dirpath, x)), reverse=True)
if files:
# Copy the newest file
copy_me = files.pop(0)
print("Copying '{}'".format(copy_me))
shutil.copyfile(os.path.join(dirpath, copy_me), os.path.join(copy_to, copy_me))
# Remove the remaining files
for file in files:
src = os.path.join(dirpath, file)
print("Removing '{}'".format(src))
#os.remove(src)
os.path.join()
用于安全地将路径和文件名连接在一起。
注意:如果您的系统支持它,您可能需要使用以下内容:
os.stat(os.path.join(dirpath, x)).st_birthtime
根据创建日期/时间进行排序。