如何在Python中从txt文件读取数据集?
我有一个这样的数据集:
我需要导入这些数据并进行处理。
主要的问题是,第一列和第四列是字符串,而第二列是浮点数,第三列是整数。
我想把这些数据放进一个矩阵里,或者至少得到每一列的数据列表。
我尝试把整个数据集当作字符串读取,但结果很乱:
f = open ( 'input.txt' , 'r')
l = [ map(str,line.split('\t')) for line in f ]
有什么好的解决办法吗?
5 个回答
这里有一个方法,可以读取数据,并把第二列和第三列转换成数字类型:
f = open('input.txt', 'r')
rows = []
for line in f:
# Split on any whitespace (including tab characters)
row = line.split()
# Convert strings to numeric values:
row[1] = float(row[1])
row[2] = int(row[2])
# Append to our list of lists:
rows.append(row)
print rows
假设我们有一个名为 input.txt
的文件,内容如下:
string1 5.005069 284 D
string2 5.005049 142 D
string3 5.005066 284 D
string4 5.005037 124 D
运行后会得到以下输出:
[['string1', 5.005069, 284, 'D'],
['string2', 5.005049, 142, 'D'],
['string3', 5.005066, 284, 'D'],
['string4', 5.005037, 124, 'D']]
将列表拆分并转置:
with open ( 'in.txt' , 'r') as f: # use with to open your files, it close them automatically
l = [x.split() for x in f]
rows = [list(x) for x in zip(*l)]
rows[1],rows[2] = map(float,rows[1]),map(int,rows[2])
In [16]: rows
Out[16]:
[['bbbbffdd', 'bbbWWWff', 'ajkfbdafa'],
[434343.0, 43545343.0, 2345345.0],
[228, 289, 2312],
['D', 'E', 'F']]
使用 numpy.loadtxt("data.txt")
可以把数据读取成一行一行的列表
[[row1],[row2],[row3]...]
每一行都有每一列的元素
[row1] = [col1, col2, col3, ...]
使用 dtype = string
可以把每个数据项当作字符串来读取
你可以用一个循环把对应的值转换成整数、浮点数等。
参考链接: https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.loadtxt.html
你似乎有一些CSV格式的数据(用制表符作为分隔符),那为什么不使用csv模块呢?
import csv
with open('data.csv') as f:
reader = csv.reader(f, delimiter='\t')
data = [(col1, float(col2), int(col3), col4)
for col1, col2, col3, col4 in reader]
data
是一个包含转换后数据的元组列表(第2列转换为浮点数,第3列转换为整数)。如果data.csv的内容是(用制表符分隔,而不是空格):
thing1 5.005069 284 D
thing2 5.005049 142 D
thing3 5.005066 248 D
thing4 5.005037 124 D
data
将会包含:
[('thing1', 5.005069, 284, 'D'),
('thing2', 5.005049, 142, 'D'),
('thing3', 5.005066, 248, 'D'),
('thing4', 5.005037, 124, 'D')]
你可以使用pandas库。它非常适合读取csv文件、制表符分隔的文件等。pandas几乎总是能正确识别数据类型,并在你通过行或列访问时,将它们放入一个numpy数组中,就像下面演示的那样。
我使用了这个制表符分隔的'test.txt'文件:
bbbbffdd 434343 228 D
bbbWWWff 43545343 289 E
ajkfbdafa 2345345 2312 F
下面是pandas的代码。你只需要一行Python代码,就能把你的文件读入一个漂亮的数据框(dataframe)中。你可以根据你的文件需要,修改'sep'的值。
import pandas as pd
X = pd.read_csv('test.txt', sep="\t", header=None)
然后试试:
print X
0 1 2 3
0 bbbbffdd 434343 228 D
1 bbbWWWff 43545343 289 E
2 ajkfbdafa 2345345 2312 F
print X[0]
0 bbbbffdd
1 bbbWWWff
2 ajkfbdafa
print X[2]
0 228
1 289
2 2312
print X[1][1:]
1 43545343
2 2345345
你可以像这样添加列名:
X.columns = ['random_letters', 'number', 'simple_number', 'letter']
然后获取列数据的方法是:
X['number'].values
array([ 434343, 43545343, 2345345])