объединить файлы в Python 3 - PullRequest
0 голосов
/ 22 мая 2018

Допустим, у меня есть два файла, file1.txt, file2.txt.

file1.txt является следующим

TITLE   MEARA Repeatv2 Run2 
DATA TYPE       
ORIGIN  JASCO   
OWNER       
DATE    18/03/08    
TIME    22:07:45    
SPECTROMETER/DATA SYSTEM    JASCO Corp., J-715, Rev. 1.00   
RESOLUTION      
DELTAX  -0.1    
XUNITS  NANOMETERS  
YUNITS  CD[mdeg]    
    HT[V]   
FIRSTX  260 
LASTX   200 
NPOINTS 601 
FIRSTY  -4.70495    
MAXY    -4.70277    
MINY    -41.82113   
XYDATA      
260.0   -4.70495    443.669
259.9   -4.70277    443.672
259.8   -4.70929    443.674
259.7   -4.72508    443.681
259.6   -4.72720    443.69

file2.txt это:

TITLE   MEARA Repeatv2 Run2 
DATA TYPE       
ORIGIN  JASCO   
OWNER       
DATE    18/03/08    
TIME    22:30:34    
SPECTROMETER/DATA SYSTEM    JASCO Corp., J-715, Rev. 1.00   
RESOLUTION      
DELTAX  -0.1    
XUNITS  NANOMETERS  
YUNITS  CD[mdeg]    
    HT[V]   
FIRSTX  260 
LASTX   200 
NPOINTS 601 
FIRSTY  -4.76564    
MAXY    -3.51295    
MINY    -41.95971   
XYDATA      
260 -4.76564    443.152
259.9   -4.77382    443.155
259.8   -4.78663    443.156
259.7   -4.8017 443.162
259.6   -4.83604    443.174

Я написал следующий скрипт Python для объединения двух файлов.

def catFiles(names, outName):
    with open(outName, 'w') as outfile:
        for fname in names:
            fileName=('/'+str(fname))
            with open(fname) as infile:
                outfile.write(infile.read())

, хотя этот скрипт работает для объединения двух файлов, он накладывает файлы друг на друга, так что один файл идет за другим.Мне было интересно, как я могу изменить это или переписать так, чтобы файлы были сложены рядом друг с другом;такой, что я получаю следующий вывод

TITLE   MEARA Repeatv2 Run2     TITLE   MEARA Repeatv2 Run2 
DATA TYPE           DATA TYPE       
ORIGIN  JASCO       ORIGIN  JASCO   
OWNER           OWNER       
DATE    18/03/08        DATE    18/03/08    
TIME    22:07:45        TIME    22:30:34    
SPECTROMETER/DATA SYSTEM    JASCO Corp., J-715, Rev. 1.00       SPECTROMETER/DATA SYSTEM    JASCO Corp., J-715, Rev. 1.00   
RESOLUTION          RESOLUTION      
DELTAX  -0.1        DELTAX  -0.1    
XUNITS  NANOMETERS      XUNITS  NANOMETERS  
YUNITS  CD[mdeg]        YUNITS  CD[mdeg]    
    HT[V]           HT[V]   
FIRSTX  260     FIRSTX  260 
LASTX   200     LASTX   200 
NPOINTS 601     NPOINTS 601 
FIRSTY  -4.70495        FIRSTY  -4.76564    
MAXY    -4.70277        MAXY    -3.51295    
MINY    -41.82113       MINY    -41.95971   
XYDATA          XYDATA      
260.0   -4.70495    443.669 260.0   -4.76564    443.152
259.9   -4.70277    443.672 259.9   -4.77382    443.155
259.8   -4.70929    443.674 259.8   -4.78663    443.156
259.7   -4.72508    443.681 259.7   -4.80170    443.162
259.6   -4.72720    443.690 259.6   -4.83604    443.174

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Текстовый файл на самом деле не имеет двух измерений (ширины и высоты), как это может показаться при просмотре в текстовом редакторе.На самом деле он имеет только одно измерение.

Например, этот файл:

first line
second line
third line

содержит строку с двумя символами новой строки (\n):

'first line\nsecond line\nthird line'

Теперь давайте объединим это с другим файлом, который имеет следующее содержимое:

blue
cheese

(или: 'blue\ncheese')

Обычный способ, который вы называете вертикальным, просто суммирует строки:

'first line\nsecond line\nthird lineblue\ncheese'

То, что вы хотите, является чем-то более сложным, то есть объединить каждую строку (и, возможно, также добавить некоторый интервал):

'первая строка синяя \ nс вторая строка сыр \ nthird line'

Делать это непосредственно на уровне двух больших строк невозможно, поэтому вы хотите:

  • разбить каждый файл на список строк (например, ['first line', 'second line', 'third line'] и ['blue', 'cheese'])
  • объединить каждую строку первого файла с соответствующей строкой второго файла (например, 'first line' + ' ' + 'blue')
  • позаботиться о лишних строках, поскольку один файл может быть длиннее (например, 'third line' + '')
  • объединить строки

Вот как это сделать, шаг за шагом:

Чтобы прочитать файл как lНапример, вы можете сделать f.read().splitlines(), но лучше f.readlines() или просто перебрать файловый объект (for line in f: ...)

Чтобы сопоставить соответствующие строки двух файлов, вы можете использовать zip_longest:

for left_line, right_line in zip_longest(left_lines, right_lines):
    ...

Для конкатенации с отступом: '{} {}'. Format (left_line, right_line)

Все вместе, многословно:

left_lines = []
with open(left_filename, 'rt') as left_file:
    for line in left_file:
        line_without_newline = line.strip('\n')
        left_lines.append(line_without_newline)

right_lines = []
with open(right_filename, 'rt') as right_file:
    for line in right_file:
        line_without_newline = line.strip('\n')
        right_lines.append(line_without_newline)

merged_lines = []
for left_line, right_line in zip_longest(left_lines, right_lines, fillvalue=''):
    merged_lines.append('{}    {}'.format(left_line, right_line))

with open(output_filename, 'wt') as output_file:
    for merged_line in merged_lines:
        output_file.write(merged_line + '\n')

Теперь выможно пропустить большинство промежуточных шагов, чтобы сделать его проще:)

with open(left_filename, 'rt') as left_file,\
     open(right_filename, 'rt') as right_file,\
     open(output_filename, 'wt') as output_file:
    for left_line, right_line in zip_longest(left_file, right_file, fillvalue=''):
        output_file.write('{}    {}\n'.format(left_line.strip('\n'),
                                              right_line.strip('\n')))
0 голосов
/ 22 мая 2018
from itertools import zip_longest

with open('file1.txt') as f1, open('file2.txt') as f2, open('out.txt', 'w') as f:
    for left, right in zip_longest(f1, f2, fillvalue='\n'):
        f.write(left.rstrip('\n') + right)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...