pandas在一个*.dat文件上读取_csv,该文件用cedilla分隔,而不是在datafram中拆分成列

2024-05-02 17:11:20 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我第一次研究熊猫,请原谅我的无知。 我的需求是从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并存储在dataframe中。在

^{pr2}$

但由于某些原因,它没有识别出相同的数据,并将数据放在一列中。在

                                        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Ç

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

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

如有任何建议,我们将不胜感激。在

谢谢, VB语言

采纳了埃德丘姆的建议,我使用了以下方法

#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='\chp'起作用了。不知道为什么我运行脚本时会出现这种情况,因为肉眼(当我打开样品.dat文件)显示为用符号分隔。在

有没有一种方法可以在不从外部读取文本文件的情况下传递到熊猫.read_csv(命令)StringIO? 我这么问是因为我想限制我读取并放入数据帧的行数。假设我只想拥有前几行,我添加了Totrows,而最后几行我使用了skiprows。这样处理包含数百万行的巨大文件所需的时间最少。若这不可能,我将使用for循环。只是想看看是否有办法不使用for循环。在

谢谢,VB


Tags: 文件数据编码readdataabcdsep
2条回答

尝试传递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

作为标准做法,您可能希望使用codecs包打开您的文档。这将允许您指定编码(在大多数情况下是UTF-16),而codecs包似乎非常擅长对诸如行结束符和编码之类的内容进行解码。在

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)

相关问题 更多 >