2013-04-09 31 views
1

在下面,您可以看到来自ephemeris.txt文件的数据。现在我想要检索几个列(比如说,例如从00:00,27.69和44.1开始的列)并将数组命名为x,y,z。我需要做什么?使用python从.txt文件中检索数据?

我想这

x, y, z = numpy.loadtxt("ephemeris.txt", unpack=True) 

这得到这个错误

"ValueError: could not convert string to float: Date__(UT)__HR:MN" 

你能不能也帮我在转换,人力资源:MN到只有几分钟吗?

Date__(UT)__HR:MN  R.A.__(a-apparent)__DEC\ 
**********************************************\ 
2013-Jan-01 00:00 * 14 31 27.69 -12 29 44.1\ 
2013-Jan-01 00:01 * 14 31 27.71 -12 29 44.1\ 
2013-Jan-01 00:02 * 14 31 27.72 -12 29 44.2\ 
2013-Jan-01 00:03 * 14 31 27.73 -12 29 44.2\ 
2013-Jan-01 00:04 * 14 31 27.75 -12 29 44.3\ 
2013-Jan-01 00:05 * 14 31 27.76 -12 29 44.3\ 
2013-Jan-01 00:06 * 14 31 27.77 -12 29 44.4\ 
2013-Jan-01 00:07 * 14 31 27.78 -12 29 44.4\ 
2013-Jan-01 00:08 * 14 31 27.80 -12 29 44.4\ 
2013-Jan-01 00:09 * 14 31 27.81 -12 29 44.5\ 

在此先感谢

+0

对不起,我没有得到你。 – user22180 2013-04-09 19:11:08

+0

对不起,我没注意到你已经在使用'numpy.loadtxt'了。看看我的答案,然后:o) – heltonbiker 2013-04-09 22:30:33

回答

1

可以使用loadtxt功能的一些更多的参数。

您得到的错误最可能是由于前两个标题行,因此请跳过skiprows=2参数;

另外,每行都包含不同格式的数据,并以空格分隔。为防万一,请使用delimiter=' ',您可以在dtype=stringdtype=object之间选择。

a = numpy.loadtxt("ephemeris.txt", delimiter=' ', dtype=string, skiprows=2) 

这应该给你从那里你可以执行多种“转换”的单一阵列:分割每列一个阵列,创建行的列表等

x,y,z,etc = numpy.hsplit(a, a.shape[1]) 
x = x.astype(datetime) 

# or 
x = a[:,0].astype(datetime) 
y = a[:,1].astype(some_type) 

或沿东西这些线...

希望这可以帮助,如果需要请在评论中详细说明。

+0

a = np.loadtxt(“ephemeris.txt”,delimiter ='',dtype = string,skiprows = 2)给出以下错误:“name'string'未定义” a.shape = 11 x,y,z等= numpy.hsplit(a,a。形状)给出了错误: ValueError:太多的值来解压 – user22180 2013-04-10 09:41:31

+0

1)抱歉,它应该是'dtype ='string''(类型“字符串”必须在引号之间)。 2)'x,y,z等'不应该是字面意思,你要创建的数组数量取决于你在txt文件中有多少列。假设你有8列,你可以做'b,c,d,e,f,g,h,i = numpy.hsplit(a,8)'。最后,我的印象是,你并不熟悉Python或编程,你真的理解了解释,还是只是复制代码并试图盲目运行它? (没有冒犯,但也许你需要DEEPER帮助)。 – heltonbiker 2013-04-10 13:49:12

+0

也许你是通过看'etc'来说的,但我也尝试过'string',并且它给了ValueError:不能设置数组元素的序列。之后,我尝试了对象而不是'string'并且没有错误。但以下 b,c,d,e,f,g,h,i,j,k,l = numpy.hsplit(a,a.shape)给出了错误 “ValueError:需要超过2个值才能解包“ 我同意你的一件事我需要更好的帮助来理解错误。从错误“需要超过2个值才能解包”说,我什么也没有理解,这就是为什么我不能纠正错误。是 有任何解释不同类型的错误的网站 – user22180 2013-04-10 21:19:32

0
import re 
f = open("ephemeris.txt") 
for line in f.readlines(): 
    r = re.search("(\d{4})\-(\w{3})-(\d{2}) (\d{2}):(\d{2}) \* (.*?)\\\n", line) 
    if r: 
     print "Year: "+r.group(1) 
     print "Month: "+r.group(2) 
     print "Day: "+r.group(3) 
     print "Hour: "+r.group(4) 
     print "Minute: "+r.group(5) 
     print "Data: "+r.group(6) 

这将读取该文件的每一行,检查它是否匹配的模式,如果它这样做,打印所有它可以检索数据。

+0

对不起,这显示以下错误: 错误:假冒逃生(行尾) – user22180 2013-04-09 19:51:16

+0

@ user22180:修正,在模式结束时忘记了一个\ n :( – jazzpi 2013-04-09 19:57:02

+0

可能 – user22180 2013-04-10 09:15:27

0

您也可以拆分每一行,设置一个字符分隔符。然后,你可以在每个(串)访问令牌使用索引:

def prova(): 
    f = open('/home/frenk/Desktop/ephemeris.txt') 
    l = [] 
    for line in f: 
     l = line.split(" ") 
     print "date: " + l[1] 

第二,如果你想要一个字符串转换,如“31”整数31,你可以简单的写:

x = int('31') 

注您可以使用切片表示法选择串片:

string = "This is a slice of string" 
print string[10:15]