将5GB CSV文件读入pandas数据帧时出现意外行为

时间:2015-12-16 17:00:23

标签: python csv pandas

我有一个大型(5GB)CSV文件,我想加载到df = pd.read_csv('./original-utf8.csv') 。我试着运行以下内容:

CParserError: Error tokenizing data. C error: Expected 92 fields in line 3098834, saw 163

但它产生了一个错误:

3098834 +/- 1

我手动检查了行df = pd.read_csv('./original-utf8.csv', error_bad_lines=False) ,没关系。

然后,我试图忽略违规行:

b'Skipping line 3098834: expected 92 fields, saw 163\n'

这一次,我收到了以下风格的23个警告:

DataFrame

似乎没有它们是有问题的。

此外,所产生的pandas中的行数与CSV文件中的行数不匹配(即使考虑了警告的数量)。似乎<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections> <connectionStrings> <add name="HelpDeskBPMEntities" connectionString="metadata=res://*/Model.ModelReparaliaView.csdl|res://*/Model.ModelReparaliaView.ssdl|res://*/Model.ModelReparaliaView.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=MAMSQLT01;initial catalog=ProcesosBackOffice;user id=User_ro_HD;password=@n@cl3t;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> </connectionStrings> <system.serviceModel> <bindings> <webHttpBinding> <binding maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" transferMode="Streamed"> </binding> </webHttpBinding> </bindings> </system.serviceModel> </configuration> (?)会删除更多行而不说任何内容。

有什么想法吗?我怎样才能发现问题出在哪里?

2 个答案:

答案 0 :(得分:0)

确保所有列的列数相同

awk -F, '{print NF}' file.csv | sort -u

如果您获得的结果超过1,则表示文件格式不正确。

此外,您可以尝试加载这样的数据

df=pd.read_csv("file.csv",nrows=3098834-1)

如果有效,你就会知道以前的线路是好的。然后你可以尝试像这样加载文件

df=pd.read_csv("file.csv",skiprows=3098834+2)

答案 1 :(得分:0)

看起来你的五个gig文件缺少换行符......

 delim= ","
 a = []    
 f = open(file)
 text = f.read()
 text = text.split("\n")
 fields = len(text[0])
 c = 0
 for k in text:
     if( len(k.split(delim))==fields ):
         a.append(k[0:fields])
         a.append(["wonkyRow"+str(c)]+k[fields:len(k)]+[0]*(92-len(k)))
         c+=1
     else:
         a.append(k)
 df = pandas.df(data = [tuple(k) for k in a])