按日期和字符串排序 Python

0 投票
1 回答
883 浏览
提问于 2025-04-17 22:44

我有一堆文件,文件名格式是:

公司名-日期_某个数字.txt

我需要根据公司名和日期来排序这些文件,然后把它们的内容按这个顺序复制到另一个文本文件里。

这是我现在的做法:

我从每个文件名中提取出公司名和日期,把这两个信息放到一个字典里,然后把这个字典添加到一个列表中,接着根据公司名和日期对这个列表进行排序。

一旦我得到了排序后的列表,我就可以根据这个顺序在文件夹里找到对应的文件,然后把每个文件的内容复制到一个文本文件里,这样我就能得到最终的文本文件了。

这是我目前写的代码:

myfiles = [ f for f in listdir(path) if isfile(join(path,f)) ]
file_list=[]

for file1 in myfiles:

    # find indices of companyname and date in the file-name
    idx1=file1.index('-',0)
    idx2=file1.index('_',idx1)
    company=file1[0:idx1]  # extract companyname
    thisdate=file1[idx1+1:idx2]  #extract date, which is in format MMDDYY
    dict={}
    # extract month, date and year from thisdate 
    m=thisdate[0:2]
    d=thisdate[2:4]
    y='20'+thisdate[4:6]
    # convert into date object
    mydate = date(int(y), int(m), int(d))
    dict['date']=mydate
    dict['company']=company
    file_list.append(dict)  

我检查了这段代码最后的输出,发现我得到了一个字典的列表。现在,我该怎么根据公司名和日期来排序呢?我在网上查了查如何根据多个条件排序,但我该如何确保日期是按升序排列的呢?

还有没有其他方法可以根据字符串和日期字段来排序一个列表呢?

1 个回答

3
import os
from datetime import datetime

MY_DIR = 'somedirectory'

# my_files = [ f for f in os.listdir(MY_DIR) if os.path.isfile(os.path.join(MY_DIR,f)) ]
my_files = [
    'ABC-031814_01.txt',
    'ABC-031214_02.txt',
    'DEF-010114_03.txt'
]
file_list = []

for file_name in my_files:
    company,_,rhs = file_name.partition('-')
    datestr,_,rhs = rhs.partition('_')
    file_date = datetime.strptime(datestr,'%m%d%y')
    file_list.append(dict(file_date=file_date,file_name=file_name,company=company))

for row in sorted(file_list,key=lambda x: (x.get('company'),x.get('file_date'))):
    print row

函数 sorted 有一个叫 key 的参数,这个参数是一个函数,会作用于你要排序的每一个项目。如果这个函数返回的是一个元组,排序时就会依次根据元组里的项目进行排序。

这里的 lambda x: (x.get('company'),x.get('file_date'))sorted 可以先按公司名称排序,然后再按日期排序。

撰写回答