ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

text-processing – 编写用于编辑.txt数据的程序 – Python还是Unix?

2019-08-16 04:05:33  阅读:195  来源: 互联网

标签:python text-processing


我只有很少的编程经验,而且我正在努力提高自己的技能.
基本上,我需要编写一个程序,它可以对.txt文件中的某些数据执行某些特定的处理.

从头开始,我有一个.txt文件,其数据如下所示:

>tex_1 abcdefghijklmnopqrstu
>tex_2 abcdefghijklmnopqrstuv
>tex_3 abcdefghijklmnopqrstuv
>tex_4 abcdefghijklmnopqrst
//     x
>tex_1 abcdefghijklmnopqrstu
>tex_2 abcdefghijklmnopqrstuv
>tex_3 abcdefghijklmnopqrst
>tex_4 abcdefghijklmnopqrstuv
//         x  x
>tex_1 abcdefghijklmnopqrstuv
>tex_2 abcdefghijklmnopqrstuv
//     x   x

我需要对这些数据做一些奇怪的事情,以便最终得到一个数据集,可以在我使用的软件中进行分析.每个“//…\”-line指的是上面的数据组,直到下一个”//…\”-line

这是我想要做的一个阵容:

移动“//…\”-line,因此它引用的数据组低于此行,而不是高于它:

//         x
>tex_1 abcdefghijklmnopqrstu
>tex_2 abcdefghijklmnopqrstuv
>tex_3 abcdefghijklmnopqrstuv
>tex_4 abcdefghijklmnopqrst
//         x  x
>tex_1 abcdefghijklmnopqrstu
>tex_2 abcdefghijklmnopqrstuv
>tex_3 abcdefghijklmnopqrst
>tex_4 abcdefghijklmnopqrstuv
//              x   x
>tex_1 abcdefghijklmnopqrstuv
>tex_2 abcdefghijklmnopqrstuv

在//之后为每个组添加唯一名称,而不会在该行上移动剩余文本:

//Name 1  x
>tex_1 abcdefghijklmnopqrstu
>tex_2 abcdefghijklmnopqrstuv
>tex_3 abcdefghijklmnopqrstuv
>tex_4 abcdefghijklmnopqrst
//Name 2   x  x
>tex_1 abcdefghijklmnopqrstu
>tex_2 abcdefghijklmnopqrstuv
>tex_3 abcdefghijklmnopqrst
>tex_4 abcdefghijklmnopqrstuv
//Name 3        x   x
>tex_1 abcdefghijklmnopqrstuv
>tex_2 abcdefghijklmnopqrstuv

将其输出到新文件,而不更改原始文件.
然后抓住下面的每个名称行,并将其输出到File2:

//Name 1  x
>tex_1 abcdefghijklmnopqrstu
//Name 2   x  x
>tex_1 abcdefghijklmnopqrstu
//Name 3        x   x
>tex_1 abcdefghijklmnopqrstuv

更改结构,因此命名如下所示,并将其输出到File3:

>Name 1 abcdefghijklmnopqrstu
>Name 2 abcdefghijklmnopqrstu
>Name 3 abcdefghijklmnopqrstuv

以上数据是一个结构,我可以实际分析.

现在我知道这是guite的任务,我不是在问你“我该怎么编程.我只想知道,你们在哪里开始这样一个项目,你觉得哪种语言最适合这个项目?

我通过在这个网站上获得帮助,设法在unix中做了一些事情.例如.通过以下unix代码为每个“// …”行提供唯一的名称:

awk -F '' '/\/\//{n++ ; t=" Name "n ; sub("// {0,"length(t)-1"}","//"t)}{print}' File1.txt

你能给我一些提示从哪里开始吗?
问题是否适合作为Python项目?
原始.txt数据文件包含大量数据,因此无法手动进行处理.此项目也是进一步深入编程的一种方式.

解决方法:

这看起来更像是一个python工作.一般的经验法则是:如果您的任务只需要“平面”和内容盲处理,那么核心实用程序(最好是gnu)就是最佳选择.这可以用于字符串替换,删除,基于行的处理,简单的排序,计数,过滤等等……这些工具可以让你快速编写一个单行程来做你想做的事情,通过练习它甚至都没有需要很多思考.

另一方面,如果您需要一个需要查看文件的复杂作业,意味着分层(树状)结构,自定义分隔符和上下文感知字符串,那么在您的文件中使用相同的结构会更容易编程语言.一个极端的例子是html / xml / json文件,任何带有嵌套大括号的文件等等…如果你有非常强大的数据结构可用(python确实如此),只需将其写入,以类似对象的方式处理它并读取它退出.您仍然可以在awk中执行此操作(或者在sed中稍微省力),但这不值得.

在您的情况下,您需要记住前一个标记的位置(或保持一个长缓冲区),这对于线处理软件来说有点笨拙.然而,在python中,它很容易.

示例代码:

#!/usr/bin/python
import sys

with open(sys.argv[1],'r') as file, open(sys.argv[2],'w') as file1, open(sys.argv[3],'w') as file2, open(sys.argv[4],'w') as file3:
    counter = 1
    current_buffer = []
    for line in file:
        if line.startswith('//'):
            #we found a delimiter, flush the buffer
            #could use regular expressions, but for the sake of this example
            #this is enough
            prefix = '//Name {}'.format(counter)
            new_header = prefix+line[len(prefix):]
            file1.write(new_header)
            file2.write(new_header)
            for oldline in current_buffer:
                file1.write(oldline)
            if current_buffer: #only first line to file 2
                first_line = current_buffer[0]
                file2.write(first_line)
                #same here, could use regular expressions from "import re" but we don't have to
                rest_of_line = first_line.split(' ',1)[1]
                file3.write('//Name {} {}\n'.format(counter,rest_of_line.strip()))
            current_buffer=[]
            counter+=1
        else:
            current_buffer.append(line)

    #if the file is well-formatted, current_buffer should be empty now - otherwise, do special handling

将其命名为./test.py inputfile file1 file2 file3,看看是否是您想要的.

标签:python,text-processing
来源: https://codeday.me/bug/20190816/1663574.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有