2017-10-04 150 views
1

我有文本文件,其中每個文件有90列時間序列數據的長度不同。在這90列之前,我想刪除6行垃圾字符串數據。從第7行開始,數據都是float類型的。python:通過txt文件循環並刪除前幾行字符串

我曾嘗試以下,但它並沒有改變我的文件:

folder = '/Users/LR/Desktop/S2' 
files = os.listdir(folder) 
for filename in files: 
     lines = open(filename).readlines() 
     open(filename, 'w').writelines(lines[6:]) 

我也嘗試加載文件,並跳過第6行,但numpy.loadtxt沒有工作,除非我設置dtype ='str'。它成功地刪除了前6行..但它導入爲一個字符串ndarray對象,我不知道如何將其轉換爲浮點數組。

data = np.loadtxt('STS2.txt', delimiter = '\t', skiprows=6, dtype='str') 
data = data.astype(float) # this gives the error: ValueError: could not convert string to float: 

當我設置的D型=浮動,我會得到相同的ValueError異常:

data_float = np.loadtxt('STS2.txt', delimiter='\t', dtype=float, skiprows=7) # this gives the error: ValueError: could not convert string to float: 

任何人都知道的方式來解決這個問題?

+2

您可能想要使用'os.path.join(文件夾,文件名)'。 – smarx

+0

我在哪裏添加這個到我的代碼?對不起,即時通訊新的python和編碼一般 – thymeandspace

+0

'打開(os.path.join(文件夾,文件名))'和'打開(os.path.join(文件夾,文件名),'W')' – smarx

回答

1

每行的最後一個字段爲空字符串,所以numpy無法解析它作爲一個float。您只反正第90列感興趣,所以加usecols=range(90):(當然,如果你已經砍掉那些前六行,你現在可以放下skiprows=6

np.loadtxt('STS2.txt', skiprows=6, usecols=range(90)) 

編輯

由於第一列似乎只是一個索引,您可以使用usecols=range(1, 90)來忽略它。

+0

完美。謝謝。然後,我會如何用清理過的文件覆蓋舊的txt文件? – thymeandspace

+0

我不確定我是否知道你的意思。什麼清理文件? – smarx

+0

@thymeandspace我想你想['numpy.savetxt'](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.savetxt.html)? – displayname

1

您可以使用pandas來幫助你。使用下面的代碼:

import pandas as pd 
import numpy as np 

df = pd.read_csv('STS1.txt', delimiter='\t', skiprows=[0,1,2], index_col=0) 
df = df.T.set_index(np.nan, append=True).T 

我能夠如下表裝入:

enter image description here

請注意,您的欄目爲分層。您可以檢查您類型:

df.dtypes 

輸出:

1  float64 
2  float64 
3  float64 
4  float64 
... 

您還可以將數據輕鬆地如到int

df = df.fillna(0).astype(int)