1

我对python很陌生,经过一些练习,我认为编写我的第一个程序是个好主意!(也许是一个过于雄心勃勃的目标)。

我有一个文本文件,想从中提取几条信息。文本文件是刺激传递软件的输出文件,并按列和行排列。

我希望程序记录某个字符串出现的次数,然后还记录文件中周围文本中的另外两条信息。

例如,从以下文本:

RXXXX   9   Picture CATCH_QUAIL_600_5_3000_2590_278 1026069 7999    2   3000    3   7900    2960    other   0

RXXX    9   Picture poststim_fixation   1029236 0   1   25997   2   0   25900   other   0

RXXXX   9   Response    115 1036879 7643    1

我希望它报告在第 9 次试验中有响应,并且响应是针对图片“CATCH_QUAIL”的。

我认为最好的方法是让程序找到字符串“响应”,然后从上面的两行和左边的一列中提取信息。

所以,这就是我到目前为止所拥有的(我很抱歉它的可悲):

    x= open('file')
    y= x.read()
    y.split()
    l= y.splitlines()

然后我知道我需要做一些循环来循环文件,如果它找到“响应”字符串然后移动到一个新的循环,它将记录我想要的信息 - 不幸的是我不知道如何做到这一点。

如果可能的话,我真的很想学习如何做到这一点,所以如果你能给我一些提示而不是完整的代码,那就太好了。

浏览了此处的其他一些问题后,如果这远低于您所期望的问题范围,我很抱歉,但我不确定还有什么地方可以转向!

谢谢,

4

3 回答 3

1

感谢大家的帮助。我认为很明显有很多方法可以做到这一点,下面是我得到的代码——它可能不是最整洁的,但我发现它相当透明且易于操作。

x= open('file')
logs=x.readlines()
iLine = logs[6]

log_enumerater = enumerate(logs)
for iLine in log_enumerater:
    if iLine[1].find('CATCH') != -1: 
            Event=iLine[1].split('\t')[3]
            word=Event.split('_')[1]
            t0=int(iLine[1].split('\t')[4])
            print iLine[1].split('\t')[3].split('_')[1], iLine[0]
            print 'Catch in line ', iLine[0] 
            myLine = int(iLine[0])+2
            print 'Response in Line', myLine
    if iLine[1].find('Response') != -1:
            t1= int(iLine[1].split('\t')[4])
            ResponseTime= t1-t0  
            print ResponseTime

我一直在使用它来获取试用号,现在已经稍微调整了它以获得响应时间。

再次感谢大家的帮助,

于 2013-06-11T09:27:50.203 回答
0

通常,python 文档是一个不错的起点,请查看关于读/写文件的部分。提到在 Python 中处理文件有一个非常有用的模式:

#!/usr/bin/env python
with open("file", "r") as my_file:
  for i, my_line in enumerate(my_file):
    print i, my_line

这将打开文件 ( my_file) 以供读取 (option "r"),然后为您打印每一行 ( my_line) 及其位置 ( i)。

这里的第二个有用的模式是enumerate()在脚本的第二行中。这需要一个列表,并且对于每个项目都会返回项目,它是“索引”或列表中的位置。因此,例如:

for index, item in enumerate(["a", "b", "c"]):
  print index, ":", item

给出:

0 : a
1 : b
2 : c

好的,现在您可能要考虑使用in关键字在该行中搜索子字符串“Response”:

if "Response" in my_line:
  print "found Response in line %s!" % i

尝试运行整个事情,看看你得到了什么

with open("py-test.txt", "r") as my_file:
  for i,my_line in enumerate(my_file):
    print i, my_line
    if "Response" in my_line:
      print "found Response in line %s!" % i

所以,现在您正在找到您想要的行并获取它在文件中的位置,您只需要一种访问文件中特定行的方法,并从该行访问您需要的信息..

于 2013-06-10T11:15:52.163 回答
0

我会从文件中读取信息并将其放入列表列表中,如下所示:

data = []
with open('textfile.txt') as inputfile:
    for line in inputfile.read().splitlines():
        if line:
            data.append(line.split())
print data

结果:

[['RXXXX', '9', 'Picture', 'CATCH_QUAIL_600_5_3000_2590_278', '1026069', '7999', '2', '3000', '3', '7900', '2960', 'other', '0'],
 ['RXXX', '9', 'Picture', 'poststim_fixation', '1029236', '0', '1', '25997', '2', '0', '25900', 'other', '0'],
 ['RXXXX', '9', 'Response', '115', '1036879', '7643', '1']]

这样您就可以访问任何非空行的任何列的内容,并且可以在必要时向后查看之前的行,如下所示:

for i, line in enumerate(data):
    if line[2] == 'Response':
        print 'Got response on trial numder', line[1]
        if data[i-2][2] == 'Picture' and data[i-2][3].startswith('CATCH_QUAIL'):
            print '  The response was for the picture', data[i-2][3]

输出:

Got response on trial numder 9
  The response was for the picture CATCH_QUAIL_600_5_3000_2590_278
于 2013-06-10T11:17:01.670 回答