2017-01-24 42 views
2

我有这种格式的文件:读取值在一行写有蟒蛇

611 2856  618 2582 94075 94107 94065 94068 
101071 94104 
598 2856  618  611 93995 94107 93992 93991 
94075 94065 
612 2834 2821 2812 94087 101577 94085 94081 
101558 101557 

我需要阅读的线条和他们改写这样:

611 2856  618 2582 94075 94107 94065 94068 101071 94104 
598 2856  618  611 93995 94107 93992 93991 94075 94065 
612 2834 2821 2812 94087 101577 94085 94081 101558 101557 

我试过这样的事情:

f2 = open('new_file.txt', 'w') 
    f1 = open('old_file.txt') 
    lines = f1.readlines() 
    for i, line in enumerate(lines):  
     print(repr(line))    
     f2.write(line) 
     i = i+1 
    f1.close() 
f2.close() 

但它不工作,因为它再次写入每一行。我需要读两行并将它们写入一行。 任何建议?

回答

3

你并不需要阅读有关行号线到一个列表,或一塌糊涂,你可以直接遍历文件行:newfile.txt的

with open('oldfile.txt') as fin, open('newfile.txt', 'w') as fout: 
    for line in fin: 
     fout.write(line[:-1] + ' ' + next(fin))  

内容

611 2856  618 2582 94075 94107 94065 94068 101071 94104 
598 2856  618  611 93995 94107 93992 93991 94075 94065 
612 2834 2821 2812 94087 101577 94085 94081 101558 101557 

line[:-1] + ' ' 

在长的端部移除换行字符行,并用一个空格替换它;我很确定这比做line.replace('\n', ' ')快,但我还没有计时。

与Graipher的解决方案一样,如果文件不是的行数是偶数,那么最后一行不会被复制,但我认为这对您的数据不是问题。

1

readlines返回的行仍包含newline '\n' at the end。你必须strip他们:

with open('new_file.txt', 'w') as f2: 
    with open('old_file.txt') as f1: 
     lines = f1.readlines() 
     # lines = f1.read().splitlines() will even save you the stripping 
     for i, line in enumerate(lines): # line: 'foo bar \n'   
      f2.write(line.strip()) 
      if i % 2: # linebreak only every other line 
       f2.write('\n') 
1

您可以使用缓冲区变量每二线存储像这样:

with open('new_file.txt', 'w') as fout: 
    with open('old_file.txt') as fin: 
     buffer = "" 
     for i, line in enumerate(fin): 
      if i % 2 == 0: 
       buffer = line.replace('\n', '') 
      else: 
       fout.write(sep.join((buffer, line))) 
       buffer = "" 

随着sep = " "或任何其他你使用的分离。

这假设你有一个偶数行,否则最后一行不会被写入。