使用 Python 自动将昨天的日期附加到文件名的末尾?

Automate appending yesterday's date to end of file names using Python?

我正在努力解决工作中的问题,我不是开发人员,但从事一般 IT 运营工作,我想在这里和那里学习一些东西,所以我现在可能离我的目标还很远我想在这里做。我刚刚一直在利用在线资源,这里还有一点来自《用 Python 自动化无聊的东西》一书。这是我的 objective:

我有两个文件使用 post 处理器每天早上同时自动放在我电脑上的一个文件夹中,我需要在我之前将昨天的日期添加到文件名的末尾将它们上传到 FTP 服务器,我每天早上大约在同一时间这样做。我正在尝试编写一个 Python 脚本,我可以在文件放入文件夹后立即以某种方式安排到 运行,这将以 MMDDYYYY 格式附加昨天的日期。例如,如果文件夹中的文件名为“holdings.CSV”和“transactions.CSV”,我需要将它们重命名为“holdings01112022.CSV”和“[=21=” ]”。我只想重命名文件夹中的新文件,前几天已经附加日期的文件将保留在文件夹中。再一次,我是一个完全的初学者,所以我的代码可能没有意义并且可能有多余或多余的行,我很乐意更正......我在这里走的路是正确的,我完全离开了吗?有什么建议吗?

import os, re
from datetime import date
from datetime import timedelta

directory = 'C:\Users\me\main folder\subfolder'
filePattern = re.compile('%s.CSV', re.VERBOSE)

for originalName in os.listdir('.'):
        mo = filePattern.search(originalName)

        if mo == None:
            continue

today = date.today()
yesterday = today - timedelta(days = 1), '%M%D%Y'

for originalName in directory:
        newName = originalName + yesterday
        os.rename(os.path.join(directory, originalName), os.path.join(directory, newName))

感谢任何帮助。谢谢

你运行有什么问题吗?如果您只想获取 csv 文件,则可以使用一个 if 语句而不是使用正则表达式来简化代码。在将日期添加到文件名之前,您还需要将日期转换为字符串。 (即:newName = originalName[:-3] +str(yesterday))。

如果此代码没有解决您的问题,请提及您收到的错误,以便其他人更容易地帮助您。

这是我的建议,可以在不知道您遇到的错误类型的情况下消除可能的错误。

import os, re
from datetime import date
from datetime import timedelta

directory = 'C:/Users/me/main folder/subfolder'

for originalName in os.listdir(directory):
  print(f'original name is = {originalName}') 
  if originalName[-3:].lower() =='csv':
    today = date.today()
    yesterday = today - timedelta(days = 1) 
    yesterday_file_name = originalName[:-4]+yesterday.strftime("%m%d%Y")+'.csv'
    os.rename(os.path.join(directory, originalName), os.path.join(directory, yesterday_file_name))
    #print('formatted file names are')
    #print(yesterday_file_name)

#here is the sample output
#original name is = holdings.csv
#formatted file names are
#holdings01112022.csv
#original name is = transactions.CSV
#formatted file names are
#transactions01112022.csv    

这是一个关于如何编写算法代码的简短示例。

import pathlib
from datetime import date, timedelta


if __name__ == '__main__':
    directory = pathlib.Path('/Users/cesarv/Downloads/tmp')
    yesterday = date.today() - timedelta(days=1)
    for file in directory.glob('*[!0123456789].csv'):
        new_path = file.with_stem(file.stem + yesterday.strftime('%m-%d-%Y'))
        if not new_path.exists():
            print(f'Renaming {file.name} to {new_path.name}')
            file.rename(new_path)
        else:
            print(f'File {new_path.name} already exists.')

通过使用 pathlib,您将简化文件名和路径的处理,如果您 运行 在 Linux 或 macOS 上使用此程序,它的工作原理是一样的。

注意:

  1. 我们限制要处理的文件列表 glob(),其中模式 *[!0123456789].csv 表示“所有不以后缀前的数字结尾的文件名([!0123456789] 代表一个字符,在后缀之前,不应 - ! - 等于括号中的任何字符)。”这允许您只处理名称中不包含日期的文件。
  2. for循环给出的元素,用file变量引用,是classPath的对象,它给了我们可以工作的方法和属性与,例如 with_stem()stem.
  3. 我们创建了一个新的 Path 对象,new_path,它将把它的词干(没有后缀 .csv 的文件名部分)重命名为原始文件名(file.name) 加上你需要的格式的昨天,方法是 with_stem().
  4. 由于这个新的 Path 对象包含与原始文件相同的路径,我们可以用它来重命名原始文件。
  5. 如您所见,我们还可以使用 exists() 方法在重命名之前检查是否存在具有新名称的文件。

您还可以查看 pathlib 上的文档。

如有疑问,请尽管提问!