Python实现向CSV指定行列添加数据及日期列自动填充
生成指定格式考勤CSV的Python实现
需求说明
- 收集4个用户指纹编号,写入CSV的
fingerprint列4行 - 输入统一的年份和月份,填充到对应列的所有行
- 日期列(1-31)填充规则:
- 行与行之间交替以
x/6开头循环填充 - 当天为周五时,固定填充
x
- 行与行之间交替以
- 日期列标题(1-31)无引号,精准控制数据写入指定行列
修正后的完整代码
import csv import datetime # 收集4个指纹编号 fingerprints = [] for _ in range(4): fp = input("输入指纹编号: ").strip() fingerprints.append(fp) # 收集统一的年、月 year = input("输入年份: ").strip() month = input("输入月份: ").strip() def generate_day_values(start_char, year, month): """生成一行的日期列值,遵循交替+周五固定x的规则""" day_values = [] for day in range(1, 32): try: # 计算当天是星期几,周五对应isoweekday()=5 dt = datetime.date(int(year), int(month), day) if dt.isoweekday() == 5: day_values.append('x') else: # 按交替规则填充 if (day - 1) % 2 == 0: day_values.append(start_char) else: day_values.append('6' if start_char == 'x' else 'x') except ValueError: # 处理当月不存在的日期(如2月无31号) day_values.append('') return day_values def main(): # 构造完整表头 headers = ['fingerprint', 'month', 'year'] + [str(d) for d in range(1, 32)] with open('shift.csv', 'w', newline='', encoding='utf-8') as file: # 关闭引号输出,确保日期标题无引号 writer = csv.writer(file, quoting=csv.QUOTE_NONE, escapechar='\\') writer.writerow(headers) # 为每个指纹生成对应行数据,交替起始字符 start_chars = ['x', '6', 'x', '6'] for idx, fp in enumerate(fingerprints): day_vals = generate_day_values(start_chars[idx], year, month) row = [fp, month, year] + day_vals writer.writerow(row) if __name__ == "__main__": main()
代码关键说明
- 指纹收集:用列表存储4个指纹输入,避免原代码中覆盖前序输入的问题
- 表头构造:直接生成
1到31的字符串列表作为日期列标题,配合csv.QUOTE_NONE确保标题无引号 - 日期值生成:
- 通过
datetime.date验证日期合法性,自动跳过当月不存在的日期 - 优先判断周五,固定填充
x;非周五则按行交替规则填充x/6
- 通过
- 数据写入:逐行拼接指纹、年月、日期值,精准写入对应列位置
内容的提问来源于stack exchange,提问作者Jwtiyar
相关产品推荐
相关产品推荐

