2014-12-11 74 views
2

我有一個相當大的固定寬度的文件(〜30M行,4GB),當我試圖使用熊貓read_fwf()創建一個數據幀時,它只加載了一部分文件,只是好奇,如果任何人有這個解析器沒有讀取文件的全部內容類似的問題。熊貓read_fwf不加載整個文件的內容

import pandas as pd 

file_name = r"C:\....\file.txt" 
fwidths = [3,7,9,11,51,51] 

df = read_fwf(file_name, widths = fwidths, names = [col0, col1, col2, col3, col4, col5]) 
print df.shape #<30M 

如果我使用read_csv()天真文件讀入到1列中,所有文件的讀入到存儲器,並且沒有數據丟失。

import pandas as pd 

file_name = r"C:\....\file.txt" 

df = read_csv(file_name, delimiter = "|", names = [col0]) #arbitrary delimiter (the file doesn't include pipes) 
print df.shape #~30M 

當然,沒有看到的內容,或者它可能與我的東西到底該文件的格式,但想看看是否有人曾在過去的這個任何問題。我做了一個健全性檢查,並測試了文件中的幾行,並且他們似乎都格式正確(進一步驗證了當我能夠使用相同規格將它與Talend拉到Oracle數據庫中時)。

讓我知道,如果任何人有任何想法,這將是巨大通過Python運行一切,而不是來回走時,我開始發育分析。看到日期怎麼看起來象輸入文件的

回答

1

幾行會很有用。不過,我產生類似的格式(我覺得)你有一些隨機文件,並應用於pd.read_fwf進去。這是生成和閱讀它的代碼:從隨機隨機進口

import pandas as pd 


file_name = r"/tmp/file.txt" 

lines_no = int(30e6) 

with open(file_name, 'w') as f: 
    for i in range(lines_no): 
     if i%int(1e5) == 0: 
      print("Writing progress: {:0.1f}%" 
        .format(float(i)/float(lines_no)*100), end='\r') 
     f.write(" ".join(["{:<10.8f}".format(random()*10) for v in range(6)])+"\n") 


print("File created. Now read it using pd.read_fwf ...") 

fwidths = [11,11,11,11,11,11] 

df = pd.read_fwf(file_name, widths = fwidths, 
       names = ['col0', 'col1', 'col2', 'col3', 'col4', 'col5']) 


#print(df) 

print(df.shape) #<30M 

所以在這種情況下,接縫它做工精細

。我使用Python 3.4,Ubuntu 14.04 x64和熊貓0.15.1。這需要一段時間來創建文件,並使用pd.read_fwf閱讀。但它似乎在工作,至少對我和我的設置。

結果是:(30000000, 6)

實施例文件中創建:

7.83905215 9.64128377 9.64105762 8.25477816 7.31239330 2.23281189 
8.55574419 9.08541874 9.43144800 5.18010536 9.06135038 2.02270145 
7.09596172 7.17842495 9.95050576 4.98381816 1.36314390 5.47905083 
6.63270922 4.42571036 2.54911162 4.81059164 2.31962024 0.85531626 
2.01521946 6.50660619 8.85352934 0.54010559 7.28895079 7.69120905