如何用Python为300万行CSV文件添加1-50范围的随机值列?
给300万行CSV文件追加随机值列的正确实现
看起来你已经尝试写代码了,但有些小问题需要调整,而且针对300万行的大文件,我们还要考虑内存效率的问题。先帮你梳理下原代码里的几个问题:
- 重复初始化了
csv.writer和csv.reader实例,这纯属多余 print(NewDict.append(row))这行完全没必要,append()方法返回的是None,打印它没任何意义- 你写的
row.append(row[0])是把每行第一列的值追加到末尾了,不是生成的随机数,逻辑搞错啦 - 把300万行数据都存在
NewDict列表里,这会占用大量内存,很容易导致程序因为内存不足崩溃
下面给出两种靠谱的实现方案,你可以根据自己的情况选择:
方案一:用标准库csv逐行处理(内存友好,推荐大文件)
这种方式不需要把所有数据加载到内存里,逐行读取、处理、写入,对内存的占用极低,非常适合300万行的大文件:
import csv import random # 打开输入文件和输出文件,newline=''是csv模块推荐的写法,避免换行符问题 with open('2019-01-1.csv', 'r') as csv_in, open('2019-01-2.csv', 'w', newline='') as csv_out: csv_reader = csv.reader(csv_in) csv_writer = csv.writer(csv_out) # 处理表头:追加新列名 header_row = next(csv_reader) header_row.append('Size') csv_writer.writerow(header_row) # 逐行处理数据行 for row in csv_reader: # 生成1到50之间的随机整数(random.randint是闭区间,包含1和50) random_size = random.randint(1, 50) # 把随机数转成字符串追加到行尾,确保CSV格式一致 row.append(str(random_size)) # 写入处理后的行 csv_writer.writerow(row)
方案二:用pandas实现(代码更简洁,适合内存充足的情况)
如果你已经安装了pandas,而且机器内存足够(300万行CSV数据一般不会超过内存上限),可以用更简洁的代码实现:
常规写法(一次性读取)
import pandas as pd import random # 读取原CSV文件 df = pd.read_csv('2019-01-1.csv') # 生成新列,填充1-50的随机整数 df['Size'] = [random.randint(1, 50) for _ in range(len(df))] # 保存到新CSV,index=False避免写入额外的索引列 df.to_csv('2019-01-2.csv', index=False)
分块写法(内存紧张时用)
如果机器内存不够,可以分块读取处理,避免一次性加载所有数据:
import pandas as pd import random # 每次处理10万行,可根据内存情况调整 chunk_size = 100000 with open('2019-01-2.csv', 'w') as output_file: is_first_chunk = True # 分块读取原文件 for chunk in pd.read_csv('2019-01-1.csv', chunksize=chunk_size): # 为当前块生成随机列 chunk['Size'] = [random.randint(1, 50) for _ in range(len(chunk))] # 第一块写入表头,后续块不写 chunk.to_csv(output_file, index=False, header=is_first_chunk) is_first_chunk = False
另外提一句:你原来用了numpy的randint,其实用标准库的random.randint就足够了,不需要额外引入numpy,减少依赖。
内容的提问来源于stack exchange,提问作者ali
相关产品推荐
相关产品推荐

