这是我第一次研究熊猫,所以原谅我的无知。 我的要求是将文件从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
答案 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)