如何用Python向已有CSV文件添加符合条件的行?
问题描述


各位好,如您所见,我已创建两个CSV文件,二者的前6行内容完全一致。我现在想要在每个文件中再添加两行,要求这两行的前8列在两个文件中保持一致(和前6行一样),但最后两列包含不同的随机字符串和浮点数。
原代码
import random import csv # Generate 10 rows of random data data = [] for i in range(10): row = {} for j in range(2): row[f"key{j+1}"] = ''.join(random.choices('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', k=20)) for j in range(8): row[f"val{j+1}"] = round(random.uniform(-1000, 1000), 2) data.append(row) # Write the data to two separate CSV files header = ["key1", "key2"] + ["val" + str(j+1) for j in range(8)] with open("file1.csv", "w", newline="") as file1, open("file2.csv", "w", newline="") as file2: writer1 = csv.DictWriter(file1, fieldnames=header) writer2 = csv.DictWriter(file2, fieldnames=header) writer1.writeheader() writer2.writeheader() for i in range(10): if i < 6: writer1.writerow(data[i]) writer2.writerow(data[i]) else: writer1.writerow(data[i]) writer2.writerow(data[i - 6])
解决方案
原代码的问题在于后续行直接复用了之前生成的数据,导致file2的后半部分是前半部分的重复,无法满足需求。以下是针对两种常见列定义场景的修正代码:
场景1:前8列为val1-val8(浮点数),最后两列为key1-key2(随机字符串)
新增两行的8个数值列在两个文件中完全相同,仅字符串列各自随机生成:
import random import csv # 生成前6行完整数据(所有列完全一致) header = ["key1", "key2"] + [f"val{j+1}" for j in range(8)] rows_common = [] for _ in range(6): row = { "key1": ''.join(random.choices('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', k=20)), "key2": ''.join(random.choices('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', k=20)) } for j in range(8): row[f"val{j+1}"] = round(random.uniform(-1000, 1000), 2) rows_common.append(row) # 生成新增2行的公共数值列(val1-val8) additional_common_cols = [] for _ in range(2): common_part = {} for j in range(8): common_part[f"val{j+1}"] = round(random.uniform(-1000, 1000), 2) additional_common_cols.append(common_part) # 写入两个CSV文件 with open("file1.csv", "w", newline="") as file1, open("file2.csv", "w", newline="") as file2: writer1 = csv.DictWriter(file1, fieldnames=header) writer2 = csv.DictWriter(file2, fieldnames=header) # 写入表头和前6行 writer1.writeheader() writer2.writeheader() for row in rows_common: writer1.writerow(row) writer2.writerow(row) # 写入新增的2行:公共列保持一致,字符串列分别随机生成 for common_part in additional_common_cols: # 为file1生成随机字符串列 row1 = common_part.copy() row1["key1"] = ''.join(random.choices('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', k=20)) row1["key2"] = ''.join(random.choices('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', k=20)) writer1.writerow(row1) # 为file2生成全新的随机字符串列 row2 = common_part.copy() row2["key1"] = ''.join(random.choices('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', k=20)) row2["key2"] = ''.join(random.choices('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', k=20)) writer2.writerow(row2)
场景2:前8列为key1-key2+val1-val6,最后两列为val7-val8(随机浮点数)
新增两行的字符串列和前6个数值列保持一致,仅最后两个数值列各自随机生成:
import random import csv header = ["key1", "key2"] + [f"val{j+1}" for j in range(8)] rows_common = [] for _ in range(6): row = { "key1": ''.join(random.choices('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', k=20)), "key2": ''.join(random.choices('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', k=20)) } for j in range(8): row[f"val{j+1}"] = round(random.uniform(-1000, 1000), 2) rows_common.append(row) # 生成新增2行的公共前8列(key1-key2 + val1-val6) additional_common_cols = [] for _ in range(2): common_part = { "key1": ''.join(random.choices('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', k=20)), "key2": ''.join(random.choices('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', k=20)) } for j in range(6): common_part[f"val{j+1}"] = round(random.uniform(-1000, 1000), 2) additional_common_cols.append(common_part) # 写入两个CSV文件 with open("file1.csv", "w", newline="") as file1, open("file2.csv", "w", newline="") as file2: writer1 = csv.DictWriter(file1, fieldnames=header) writer2 = csv.DictWriter(file2, fieldnames=header) writer1.writeheader() writer2.writeheader() for row in rows_common: writer1.writerow(row) writer2.writerow(row) # 写入新增的2行:公共列保持一致,最后两个数值列分别随机生成 for common_part in additional_common_cols: # 为file1生成最后两个数值列 row1 = common_part.copy() row1["val7"] = round(random.uniform(-1000, 1000), 2) row1["val8"] = round(random.uniform(-1000, 1000), 2) writer1.writerow(row1) # 为file2生成全新的最后两个数值列 row2 = common_part.copy() row2["val7"] = round(random.uniform(-1000, 1000), 2) row2["val8"] = round(random.uniform(-1000, 1000), 2) writer2.writerow(row2)
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

