使用numpy读取txt文件时跳过包含字符串的结尾行以生成数值数组

10 投票
4 回答
15246 浏览
提问于 2025-04-17 04:59

我正在尝试从互联网上读取一个文本文件来生成一个数组。

我的目标是用Python来代替MATLAB,来替换MATLAB中的这一步:

url=['http://www.cdc.noaa.gov/Correlation/amon.us.long.data'];
urlwrite(url,'file.txt');

我正在使用这段代码:

urllib.urlretrieve('http://www.cdc.noaa.gov/Correlation/amon.us.long.data', '/Users/epy/file2.txt')
a = np.loadtxt('/Users/epy/file2.txt', skiprows=1, dtype=None)

但是因为文件末尾的文本描述,它失败了。

你知道有没有办法跳过最后的X行,还是我需要使用某种字符串处理的方法(比如readlines?)呢?

4 个回答

1

这其实应该是对riddleculous评论的一个回复,但我还没有这个资格。

根据今天的情况,使用jack onsl的解决方案,代码如下:

a = np.loadtxt(open(file,'rt').readlines()[:-1], skiprows=1, dtype=None)

这个方法比使用np.genfromtext快大约30%。

这里用的是137个文件,每个文件大约有500行。

2

对于那些最近来到这里的人来说,这个方法简单多了(np.loadtxt 也可以用生成器):

与其使用

a = np.loadtxt('/Users/epy/file2.txt', skiprows=1, dtype=None)

不如直接写

a = np.loadtxt(open('/Users/epy/file2.txt','rt').readlines()[:-1]), skiprows=1, dtype=None)

这样也会跳过最后一行

11

如果你需要加载更复杂的文本数据,可以看看 numpy.genfromtxt 这个工具。

它的速度比 numpy.loadtxt 慢一些,但功能更强大,使用起来更灵活。

在你的情况下(我这里不打算保存一个临时文件...):

import numpy as np
import urllib2

url = 'http://www.cdc.noaa.gov/Correlation/amon.us.long.data'
data = np.genfromtxt(urllib2.urlopen(url), skip_header=1, skip_footer=4)

撰写回答