Python中的大型csv文件[重复]
Posted
技术标签:
【中文标题】Python中的大型csv文件[重复]【英文标题】:Large csv files in Python [duplicate] 【发布时间】:2019-08-06 03:05:53 【问题描述】:我使用 Python 在一个大型 csv 文件(120 万行,250MB)中查找一些模式,如果找到这样的模式,则对每一行进行一些修改。 我的做法是这样的:
dfile=open(csvfile,'r')
lines=dfile.readlines()
dfile.close()
for i in range(0, len(lines)):
lines[i]=f(lines[i])
# f(.) is a function that modifies line string if a pattern is found
# then I have a code to write the processed data in another csv file.
问题是在某些迭代之后,代码停止运行,返回内存错误。我的系统有 32GB RAM。 如何提高内存性能? 我尝试使用以下方法逐行读取数据:
import cache
j=1
while True:
line=cache.getline(csvfile,j)
if line='':
break
outp=open(newfile,'w')
outp.write(f(line))
outp.close()
j+=1
这种方法也失败了:
encoding error reading location 0X9b?!
有什么办法吗?
如果您对我的 csv 文件中的功能和模式感兴趣,瞧。 这是我的 csv 文件的一个小例子。
Description Effectivity AvailableLengths Vendors
Screw 2" length 3" "machine1, machine2" 25mm "vend1, ven2"
pin 3" machine1 2-3/4" vend3
pin 25mm "machine2, machine4" 34mm "vend5,Vend6"
Filler 2" red machine5 "4-1/2", 3"" vend7
"descr1, descr2" "machin1,machin2,machine3" 50 "vend1,vend4"
csv文件中的字段用逗号分隔,所以第一行是这样的:
Screw 2" length 3","machine1, machine2",25mm,"vend1, ven2"
由于多值字段和维度引用的使用,csv 阅读器无法读取此文件。如果逗号位于属于同一字段的两个数据之间,我的函数(上述代码中的函数 f)用分号替换逗号,如果该引用是维度事物,则用“英寸”替换它。
f(firstline)=Screw 2INCH length 3INCH,machine1;machine2,25mm,vend1;ven2
【问题讨论】:
你试过用熊猫吗? 文件内容是什么样的,请解释您正在寻找的模式。这将非常有帮助!请edit您对这些问题的问题不要在评论中回复。 问题是如果我用逗号分割每一行,或者用pandas读取csv文件,每行的字段数会不同,不一致。因此,在读取为 csv 文件之前,我需要对每一行进行一些修改。 究竟为什么包括您正在执行的操作类型以及您正在执行的数据样本认为本身是必要的。 另外,每次迭代都打开 outfile 绝对不是一个好主意。我建议保持打开状态并在需要时写一行,然后关闭它 【参考方案1】:尝试使用以下编码错误:
open(csvfile, 'r', encoding = 'utf8')
就性能而言,您的函数 f() 的问题可能是它具有高复杂性/内存消耗。
你能把函数 f() 贴在这里吗?如果您正在尝试查找模式,也可以考虑使用正则表达式。
【讨论】:
还可以考虑查看我关于在循环中打开 outfile 的评论。它对内存的影响可能不如对性能的影响。 谢谢。我以为打开输出文件,在其中写入一些内容并在之后立即关闭它,会释放一些内存,因此我的代码将一直运行到 csv 文件的末尾,但它不起作用! 我现在无法访问我的 f() 函数。我很快就会把它贴在这里 谢谢你,尼克。关于您的第一条评论,我尝试了几种格式,但错误没有消失。此外,在记事本++中,我看到格式为 utf-8,但 cache.getline 无法读取该行。 用notepad++打开试试看编码。以上是关于Python中的大型csv文件[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何在python中对没有标题的大型csv信号文件进行分类?
如何使用 spark(python)读取 zip 文件中的 CSV 文件的内容 [重复]