如何在文本文件上执行多个功能

时间:2013-06-10 09:41:35

标签: python text-files

我是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'。

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

所以,这就是我到目前为止所做的事情(我很抱歉这是可悲的):

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

然后我知道我需要制作一些循环来循环遍历文件,如果它找到'响应'字符串然后移动到一个新的循环,它将记录我想要的信息 - 不幸的是我不知道该怎么做这个。

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

在这里查看了其他一些问题之后,如果这远远低于您所期望的问题,我很抱歉,但我不确定还能转向何处!

谢谢,

3 个答案:

答案 0 :(得分: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

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

再次感谢您的帮助,

答案 1 :(得分:0)

通常,python文档是一个很好的起点,请查看reading/writing files部分。提到在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)进行阅读(选项"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

所以,现在你找到你想要的行并在文件中找到它的位置,你只需要一种方法来访问文件中的特定行,并从该行访问你需要的信息.. < / p>

答案 2 :(得分: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