用cedilla分隔的* .dat文件上的pandas read_csv没有拆分成数据帧中的列

时间:2016-08-23 14:33:22

标签: python pandas utf-8

这是我第一次研究熊猫,所以原谅我的无知。 我的要求是将文件从S3下载到Ec2并将dat文件放到数据帧上。这就是我的输入文件数据的外观

1Ç70Ç23929Ç4341Ç1111Ç0Ç0Ç1ÇAAÇ012ÇFillerÇ
1Ç75Ç45555Ç4324Ç2222Ç0Ç0Ç1ÇAAÇ011ÇFillerÇ
1Ç76Ç23957Ç4334Ç3333Ç0Ç0Ç1ÇAAÇ011ÇFillerÇ
1Ç72Ç47776Ç4344Ç4444Ç0Ç0Ç1ÇABÇ014ÇFillerÇ
1Ç73Ç88880Ç4354Ç4444Ç0Ç0Ç1ÇCDÇ011ÇFillerÇ
1Ç74Ç99991Ç4364Ç5555Ç0Ç0Ç1ÇEEÇ014ÇFillerÇ

由于数据似乎没有任何编码,所以我决定将带有分隔符的read_Csv用作cedilla并存储在数据帧中。

iFldDelim = 'Ç'
tf = pandas.read_csv(itextfile, iFldDelim, nrows = 5,header=None)

但由于某种原因,它不能识别相同的内容并将数据放在一列中。

                                        0
0 1Ç70Ç23929Ç4341Ç1111Ç0Ç0Ç1ÇAAÇ012ÇFi...
1 1Ç75Ç45555Ç4324Ç2222Ç0Ç0Ç1ÇAAÇ011ÇFi...
2 1Ç76Ç23957Ç4334Ç3333Ç0Ç0Ç1ÇAAÇ011ÇFi...
3 1Ç72Ç47776Ç4344Ç4444Ç0Ç0Ç1ÇABÇ014ÇFi...
4 1Ç73Ç88880Ç4354Ç4444Ç0Ç0Ç1ÇCDÇ011ÇFi...

该文件似乎是ASCII而不是编码。我尝试使用UTF-8和UTF-16编码,并将Unicode值作为分隔符,但不起作用。 我还尝试将分隔符硬编码为'F'而不是cedilla,并运行代码,认为文件本身可能有一些加密/编码。但情况并非如此,我的输出由'F'分隔。

将分隔符设为“F”。

                                   0       1
0 1Ç70Ç23929Ç4341Ç1111Ç0Ç0Ç1ÇAAÇ012Ç  illerÇ
1 1Ç75Ç45555Ç4324Ç2222Ç0Ç0Ç1ÇAAÇ011Ç  illerÇ
2 1Ç76Ç23957Ç4334Ç3333Ç0Ç0Ç1ÇAAÇ011Ç  illerÇ
3 1Ç72Ç47776Ç4344Ç4444Ç0Ç0Ç1ÇABÇ014Ç  illerÇ
4 1Ç73Ç88880Ç4354Ç4444Ç0Ç0Ç1ÇCDÇ011Ç  illerÇ

我正在加载的文件通常很大,而且这个文件运行了很长时间。所以我不确定我是否使用编解码器将文件编码为UTF-8然后放入数据帧是一个明智的选择。

我尝试手动创建一个cedilla分隔文件,当通过相同的命令时,它工作得很好。我无法弄清楚这里出了什么问题。有没有办法弄清楚它是否被编码?

非常感谢任何建议。

谢谢, VB

采用Edchum建议,我使用下面的,

#file location
dataPath = "C:/Users/Documents/Pytest/"
itextfile = join(dataPath,'sample.dat')

fb = open(itextfile, 'r')
data = fb.read() 
print(data)
tf=pandas.read_csv(StringIO(data), sep='Ç', header=None)
#tf=pandas.read_csv(StringIO(data), sep='\Ç', header=None)
print(tf)

数据如下文所示

1Ç71Ç23929Ç44Ç5685Ç0Ç0Ç1ÇaaÇ012ÇFillerÇ
1Ç72Ç23953Ç40Ç3319Ç0Ç0Ç1ÇbbÇ011ÇFillerÇ
1Ç73Ç23957Ç43Ç7323Ç0Ç0Ç1ÇccÇ011ÇFillerÇ
1Ç74Ç24006Ç41Ç6938Ç0Ç0Ç1ÇbbÇ014ÇFillerÇ
1Ç75Ç24140Ç45Ç0518Ç0Ç0Ç1ÇddÇ011ÇFillerÇ

Output

    0    1      2   3     4   5   6   7   8   9      10  11
0    1  71  23929  44  5685   0   0   1  aa  12  Filler NaN
1    1  72  23953  40  3319   0   0   1  bb  11  Filler NaN
2    1  73  23957  43  7323   0   0   1  cc  11  Filler NaN

所以使用sep ='Ç'而不是sep ='\Ç'工作。不知道为什么当我运行脚本时它会出现这种情况,因为它是肉眼(当我打开sample.dat文件时),它显示为以cedilla符号分隔。

有没有办法传递文本文件而无需外部读取pandas.read_csv(StringIO)命令? 我问这个是因为我想限制我读取并放入Dataframe的行数。如果我想只有前几行我添加了一个Totrows,并且最后几个我使用了skrows。这种处理具有数百万行的巨大文件的方式将花费最少的时间。如果这是不可能的,我将使用for循环的课程。只是想检查是否有办法没有for循环。

谢谢,VB

2 个答案:

答案 0 :(得分:0)

尝试传递sep='\Ç',因为这对我有用:

In [35]:
import pandas as pd
import io
t="""1Ç70Ç23929Ç4341Ç1111Ç0Ç0Ç1ÇAAÇ012ÇFillerÇ
1Ç75Ç45555Ç4324Ç2222Ç0Ç0Ç1ÇAAÇ011ÇFillerÇ
1Ç76Ç23957Ç4334Ç3333Ç0Ç0Ç1ÇAAÇ011ÇFillerÇ
1Ç72Ç47776Ç4344Ç4444Ç0Ç0Ç1ÇABÇ014ÇFillerÇ
1Ç73Ç88880Ç4354Ç4444Ç0Ç0Ç1ÇCDÇ011ÇFillerÇ
1Ç74Ç99991Ç4364Ç5555Ç0Ç0Ç1ÇEEÇ014ÇFillerÇ"""
pd.read_csv(io.StringIO(t), sep='\Ç', header=None)

Out[35]:

   0   1      2     3     4   5   6   7   8   9       10  11
0   1  70  23929  4341  1111   0   0   1  AA  12  Filler NaN
1   1  75  45555  4324  2222   0   0   1  AA  11  Filler NaN
2   1  76  23957  4334  3333   0   0   1  AA  11  Filler NaN
3   1  72  47776  4344  4444   0   0   1  AB  14  Filler NaN
4   1  73  88880  4354  4444   0   0   1  CD  11  Filler NaN
5   1  74  99991  4364  5555   0   0   1  EE  14  Filler NaN

答案 1 :(得分:0)

作为标准练习,您可能希望使用编解码器包打开文档。这将允许您指定编码(在大多数情况下为UTF-16),并且编解码器包似乎非常擅长解密诸如行终止符和编码之类的内容。

Reading tab-delimited file with Pandas - works on Windows, but not on Mac

import codecs

doc = codecs.open('document','rU','UTF-16') (open for reading with "universal" type set)

df = pandas.csv_read(doc, sep='Ç', nrows=Totrows, header=Skiprows)