如何使用Python脚本将TSV文件按日期字段排序并覆盖原文件
TSV按日期字段排序并覆盖原文件的Python实现方案
核心思路
直接在现有Python脚本中增加排序逻辑:
- 读取TSV所有行数据
- 以第4列(索引为3)的日期字段为依据排序,这里因为日期格式是
YYYY-MM-DD,字符串本身的字典序和时间顺序完全一致,不需要额外转datetime对象就能直接排序,性能更好 - 排序后直接覆盖写入原文件
- 后续校验逻辑直接取排序后首尾行的日期做范围判断即可
修改后完整代码
import csv import datetime import os # 你之前定义的logger、edgar_path、filename变量保持不变 def edgar_filings_download(date): try: file_path = os.path.join(edgar_path, filename) # 读取TSV文件所有行 with open(file_path, 'r', encoding='utf-8') as f: tsv_reader = csv.reader(f, delimiter='|') tsv_rows = [row for row in tsv_reader if row] # 过滤空行 # 按日期降序排序:最新日期在第一行,最早日期在最后一行,适配你现有校验逻辑的取值规则 # 按第4列(索引3)排序,reverse=True表示降序 tsv_rows.sort(key=lambda x: x[3], reverse=True) # 排序后直接覆盖原文件 with open(file_path, 'w', encoding='utf-8', newline='') as f: tsv_writer = csv.writer(f, delimiter='|') tsv_writer.writerows(tsv_rows) # 原有校验逻辑保持不变 _CHECK = datetime.datetime.strptime(date, "%Y-%m-%d") start_date = datetime.datetime.strptime(tsv_rows[-1][3], "%Y-%m-%d") end_date = datetime.datetime.strptime(tsv_rows[0][3], "%Y-%m-%d") if start_date <= _CHECK <= end_date: logger.debug('pass') else: logger.debug('no pass') except IndexError: logger.error("TSV文件为空或格式不符合要求,缺少日期字段") except Exception as e: logger.error(e)
注意事项
- 运行前建议先备份原TSV文件,避免覆盖出错导致数据丢失
- 如果需要调整为日期升序排序(最早日期在第一行),把
sort方法的reverse=True改为reverse=False即可,同时需要对应调整校验逻辑中start_date和end_date的取值索引 - 代码默认过滤了空行,避免空行导致排序或校验报错
内容的提问来源于stack exchange,提问作者Prosy A.
相关产品推荐
相关产品推荐

