0

我正在自学编程,今天的挑战是编写一个可以将文本左对齐、右对齐或居中对齐的程序。我的主要问题是,一旦打开文件,我不确定如何写入特定行。是否有捷径可寻?这就是我所拥有的。我想我需要以某种方式计算行中的字节,以便我可以 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()
4

2 回答 2

5

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

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

其中width是一个数字,并且align- <、> 或 ^ 之一。

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

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 语句like与with open(...) as var: do stuff以下内容大致相同:

  var = open(...)
  do stuff
  close(var)

但更不容易出错。

于 2012-06-23T18:23:31.717 回答
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()的替代方法会将整个文件读入列表,您可以通过索引访问给定的行。如果文件很大,这可能是内存问题。

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

于 2012-06-23T18:07:56.877 回答