在python中迭代一个大的CSV文件时,如何轻松使用内存?
我目前有一个csv文件,有200k行,每行包括80个条目,用逗号分隔。我尝试用open()打开csv文件,并将数据附加到二维python列表中。当我尝试遍历该列表并将80个条目附加到单个条目时,计算机冻结。我的代码是否会产生某种内存问题?我应该分批处理我的数据,还是有更有效的方法来完成我的工作 简而言之:打开csv,浏览200k条目的内容,并将它们从[1,2,3,4,5,…,80],[1,…,80]。。。。200k->[12345…80]。[1…80],20万在python中迭代一个大的CSV文件时,如何轻松使用内存?,python,csv,Python,Csv,我目前有一个csv文件,有200k行,每行包括80个条目,用逗号分隔。我尝试用open()打开csv文件,并将数据附加到二维python列表中。当我尝试遍历该列表并将80个条目附加到单个条目时,计算机冻结。我的代码是否会产生某种内存问题?我应该分批处理我的数据,还是有更有效的方法来完成我的工作 简而言之:打开csv,浏览200k条目的内容,并将它们从[1,2,3,4,5,…,80],[1,…,80]。。。。200k->[12345…80]。[1…80],20万 import csv # cr
import csv
# create empty shells
raw_data = []
concatenate_data = []
def get_data():
counter = 1
# open the raw data file and put it into a list
with open('raw_data_train.csv', 'r') as file:
reader = csv.reader(file, dialect='excel')
for row in reader:
print('\rCurrent item: {0}'.format(counter), end='', flush=True)
raw_data.append(row)
counter += 1
print('\nReading done')
def format_data():
counter = 1
temp = ''
# concatenate the separated letters for each string in the csv file
for batch in raw_data:
for letters in batch:
temp += letters
concatenate_data.append(temp)
print('\rCurrent item: {0}'.format(counter), end='', flush=True)
counter += 1
print('\nTransforming done')
print(concatenate_data[0:10])
format\u data()
例程一定会占用您的CPU很多时间:
- 使用
串联,这是次优的,与其他方法不同(string
,StringIO
)str.join
- 在整个例程中使用相同的
变量temp
- 在循环中追加
(基本上追加一个越来越大的字符串)temp
str.join
可以更快地避免字符串连接:
for batch in raw_data:
concatenate_data.append("".join(batch))
如果你能去掉指纹,速度会更快:
concatenate_data = ["".join(batch) for batch in raw_data]
temp
仅在开始时初始化是正常的吗?@Jean-FrançoisFabre你所说的正常是什么意思?我只需要这个变量暂时保存80个条目,并将它们转换为一个条目。这就是为什么它只包含在format data函数中。我明白了这一点,因为反复添加相同的数据毫无意义。很抱歉,我完全忘记了将temp变量设置回空字符串。我们的目标是将80个单个字符串附加到一个大字符串中,并对所有200k个条目进行附加。您的意思是concatenate_data
是一个连接行列表,还是一个包含csv文件所有字符串的大字符串,flat?我是指连接字符列表。因此,将[a,b,c,d,…],[a,b,c,d,…],…[]更改为[abcd…,abdc…,abcd…,…]非常感谢。我不知道。连接比通常的连接要快得多。打印内容仅用于调试:)