如何在Python中从txt文件读取数据集?

8 投票
5 回答
73447 浏览
提问于 2025-04-18 15:10

我有一个这样的数据集:

示例数据

我需要导入这些数据并进行处理。

主要的问题是,第一列和第四列是字符串,而第二列是浮点数,第三列是整数。

我想把这些数据放进一个矩阵里,或者至少得到每一列的数据列表。

我尝试把整个数据集当作字符串读取,但结果很乱:

f = open ( 'input.txt' , 'r')
l = [ map(str,line.split('\t')) for line in f ]

有什么好的解决办法吗?

5 个回答

0

这里有一个方法,可以读取数据,并把第二列和第三列转换成数字类型:

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']]
0

将列表拆分并转置:

 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']]
3

使用 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

3

你似乎有一些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')]
11

你可以使用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])

撰写回答