[英]Inputting data from a text file with multiple numbers on each line - Python
[英]Inputting data from text as array
大家好,
我有一個文本文件,其數據格式如下:
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,1,4,9,0,0,0,0,2,8,13,47,0,0,0,0,0,0,12,139,11,1,0,0,4,8,44,139,14,4,1,1,30,45,80,139,34,28,0,0,7,34,117,43,0,0,0,0,0,5,40,139,78,9,0,0,0,12,100,139,121,42,4,1,6,7,16,122,101,117,22,13,4,1,10,0,0,0,0,0,0,10,9,33,7,0,0,0,0,42,87,139,20,2,0,0,0,6,95,83,9,5,8,39,73,13,45]
也就是說,每一行都是128維的樣本,同樣,整個文本文件中有5萬個樣本。
我正在為上述給定的數據格式執行K-Means聚類。 當我直接輸入數據時,在以下代碼中可以很好地工作:
from sklearn.cluster import MiniBatchKMeans
import numpy
data = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,1,4,9,0,0,0,0,2,8,13,47,0,0,0,0,0,0,12,139,11,1,0,0,4,8,44,139,14,4,1,1,30,45,80,139,34,28,0,0,7,34,117,43,0,0,0,0,0,5,40,139,78,9,0,0,0,12,100,139,121,42,4,1,6,7,16,122,101,117,22,13,4,1,10,0,0,0,0,0,0,10,9,33,7,0,0,0,0,42,87,139,20,2,0,0,0,6,95,83,9,5,8,39,73,13,45]]
mbkm = MiniBatchKMeans(init='k-means++', n_clusters=8, batch_size=100, n_init=10, max_no_improvement=10, verbose=0)
mbkm.fit(data)
mbk_means_cluster_centers = mbkm.cluster_centers_
numpy.set_printoptions(threshold=numpy.nan)
print mbk_means_cluster_centers
但是當我使用這段代碼
f = open("sample_input.txt", "r")
out = f.readlines()
for line in out:
print line
要將文本文件中的內容讀取為數組格式,它將失敗,並且出現錯誤“值錯誤:無法將字符串轉換為浮點數”。
我無法理解我要去哪里。 請建議我一種更好的方法來運行代碼。 提前致謝!
PS:我正在ubuntu平台中使用python 2.7進行編碼。
首先,我必須說,將數據存儲在文本文件中作為數組的代碼表示是一個壞主意。 如果可以,請以可序列化的格式(如CSV或JSON)存儲數據。
發生的情況是您正在讀取該行,並且它是字符串格式,而不是數組格式。 當您遍歷字符串時(字符串仍然是可枚舉的),它會獲取每個字母,但是您的代碼隨后抱怨無法使用該字符串,因為它需要浮點數。
如果您確實需要以該格式讀取該文件並且您信任文件的來源,請嘗試執行此操作。
f = open("sample_input.txt", "r")
out = [eval(arr) for arr in f.readlines()]
請注意,這還將在該文件中執行代碼,因此請確保您信任文件的來源。
我的python經驗有限,因此可能會有更安全的方法。 下次,使用CSV格式的文件存儲數據。
重申Moox的觀點,使用csv來存儲此信息可能是一個好主意。 然后,您可以使用csv模塊來解析文件。
避免評估也是一個好主意。 您可以執行類似的操作來解析當前格式的數據-
def line_to_list_of_ints(line):
# Split each line on commas and convert to an int
return [int(item) for item in line.split(',')]
with open("sample_input.txt", "r") as f:
lines = [line.strip() for line in f] # Remove new lines / whitespace
lines = [line[1:-1] for line in lines] # Remove square brackets from each end
lines = [line_to_list_of_ints(line) for line in lines] # Convert the line to a list of integers
如果您使用的是csv文件,則可以將其簡化為以下內容-
import csv
with open("sample_input.csv", "r") as f:
reader = csv.reader(f)
lines = []
for line in reader:
lines.append([int(item) for item in line])
使用ast.literal_eval
:
如果文件中有一個數組:
from ast import literal_eval
with open("sample_input.txt") as f:
out = literal_eval(f.read())
for line in out:
print line
0
0
0
0
0
0
0
0
...............
對於多個陣列:
with open("in.txt") as f:
for line in f:
print literal_eval(line)
說您的數據在mydata.txt
...
% sed '1idata=[
s/$/,/;$a]' < mydata.txt > mydata.py
創建一個可以在程序中導入的python模塊
from mydata import data
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.