text-processing – 编写用于编辑.txt数据的程序 – Python还是Unix?
作者:互联网
我只有很少的编程经验,而且我正在努力提高自己的技能.
基本上,我需要编写一个程序,它可以对.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