有没有办法在Python中寻找特定的行?

时间:2012-06-23 18:05:15

标签: python

我正在自学编程,今天的挑战是编写一个可以左右对齐文本的程序。我的主要问题是,一旦我打开文件,我不知道如何写入特定的行。是否有捷径可寻?这就是我所拥有的。我想我将需要以某种方式计算行中的字节,以便我可以f.seek到行的末尾。我觉得python已经在某个地方有这种类型的功能,但我找不到它在线搜索。有什么建议吗?

def align():
    name= input('what is the name of your txt file?: ')
    try:
        f=open(name + '.txt','r+')
        lines =f.readlines()
        just = input('left, right, or centre?: ')
        for i in range[,lines]:
            j = lines[i].strip('\n')
            if just == 'right':
                f.seek() #I want it to seek each line but can't figure out what variable might go here...
                f.write('{:>30}'.format(line.strip()))
            elif just == 'left':
                f.seek() #I want it to seek each line but can't figure out what variable might go here...
                f.write('{:<30}'.format(line.strip()))
                f.seek() #I want it to seek each line but can't figure out what variable might go here...
            elif just == 'centre' or just == 'center':
                f.write('{:^30}'.format(line.strip()))
        else:
            print("You didn't choose a justification!")
        f.close()

2 个答案:

答案 0 :(得分:5)

你的代码中有很多重复,它可以/应该被删除,例如,以下处理所有三种可能性:

for line in infile:
    print '{:{}{}}'.format(line.strip(), align, width)

其中width是一个数字,align - 其中一个&lt;,&gt;或^。

关于“搜索”问题,正如其他人已经建议的那样,最好将输出重定向到另一个文件而不是“就地”重写输入文件:

with open("in.txt", 'r') as infile, open("out.txt", 'w') as outfile: 
   for line in infile:
        outfile.write('{:{}{}}\n'.format(line.strip(), align, width))

with open(...) as var: do stuff var = open(...) do stuff close(var) 与{{1}}大致相同:

{{1}}

但更不容易出错。

答案 1 :(得分:1)

不,你不能直接寻找给定的行(除非所有行都具有完全相同的长度,在这种情况下你可以计算正确的偏移量。)

你有两种方法就是阅读所有的方法 使用readlines()立即将文件存入内存,或者逐行进行并保持计数,如下所示:

with open('data.txt') as inf:
     for count, line in enumerate(inf, 1):
         if count == 10:
             print 'found "{}" at line 10.'.format(line)

enumerate()将自动从1开始计算

请注意,使用with打开文件将确保文件在完成后正常关闭,或发生异常。

使用readlines()的备用方法会将整个文件读入列表,您可以通过索引访问给定的行。如果文件很大,这可能是内存问题。

获得您感兴趣的行后,您可以根据需要格式化并将其写入不同的文件。