使用大型(1.7gig)csv 文件在 python 中清理数据
Posted
技术标签:
【中文标题】使用大型(1.7gig)csv 文件在 python 中清理数据【英文标题】:data clean-up in python using large (1.7gig) csv files 【发布时间】:2016-06-01 10:52:13 【问题描述】:我正在尝试使用 python 进行一些数据清理。我有一些大的 (1 - 2gigs) csv
文件,我想按某些属性(例如日期、时间)进行排序,然后输出另一个带有此信息的 csv
文件,目的是使其能够在 excel 中使用。
当我遍历行时,我遇到了一些大的内存问题。最初我使用的是 32 位 Idle,它不会运行我的代码,然后切换到 64-bit Spyder
。现在代码运行,但在第一个迭代行停止(似乎正在处理,内存被消耗,但在过去半小时内没有看到它继续运行)。
我的代码如下。该过程在第 10 行停止(突出显示)。我对python很陌生,所以我确信我的代码非常原始,但它是我能做的最好的!提前感谢您的帮助:)
def file_reader(filename):
"function takes string of file name and returns a list of lists"
global master_list
with open(filename, 'rt') as csvfile:
rows = []
master_list = []
rowreader = csv.reader(csvfile, delimiter=',', quotechar='|')
**for row in rowreader:**
rows.append(','.join(row))
for i in rows:
master_list.append(i.replace(' ', '').replace('/2013', ',').split(","))
return master_list
def trip_dateroute(date,route):
dateroute_list = []
for i in master_list:
if str(i[1]) == date and str(i[3]) == route:
dateroute_list.append(i)
return dateroute_list
def output_csv(filename, listname):
with open(filename, "w") as csvfile:
writer = csv.writer(csvfile, delimiter=',', quotechar='|', lineterminator='\n')
for i in listname:
writer.writerow(i)
【问题讨论】:
【参考方案1】:如果您不需要将整个文件内容保存在内存中,您可以只处理每一行并立即将其写入输出文件。此外,在您的示例中,您解析 CSV,然后再次生成 CSV,但您似乎没有使用解析的数据。如果这是正确的,您可以这样做:
def file_converter(infilename, outfilename):
with open(infilename, 'rt') as infile, open(outfilename, "w") as outfile:
for line in infile:
line.replace(' ', '').replace('/2013', ',')
outfile.write(line)
如果函数 trip_dateroute()
用于过滤应该实际写出的行,您也可以添加它,但实际上您必须解析 CSV:
def filter_row(row, date, route):
return str(row[1]) == date and str(row[3]) == route
def cleanup(field):
return field.replace(' ', '').replace('/2013', ',')
def file_converter(infilename, outfilename, date, route):
with open(infilename, 'rt') as infile, open(outfilename, "w") as outfile:
reader = csv.reader(infile, delimiter=',', quotechar='|')
writer = csv.writer(outfile, delimiter=',', quotechar='|', lineterminator='\n')
for row in reader:
row = [cleanup(field) for field in row if filter_row(row, date, route)]
writer.writerow(row)
【讨论】:
以上是关于使用大型(1.7gig)csv 文件在 python 中清理数据的主要内容,如果未能解决你的问题,请参考以下文章