2015-07-20 2 views
0

Я пытаюсь написать сценарий, который займет несколько двух файлов столбцов, напишите первый и второй столбцы из первого в файл результатов, а затем только второй столбец из всех других файлов и добавьте их в ,Чтение из двух файлов

Пример:

File one       File two 
Column 1  Column 2   dont take this column  Column 2 
Line 1  Line 2    dont take this column  Line 2 

Конечный результат должен быть

Result file 
Column 1 Column 2 Column 2  
Line1  Line 2  Line 2 
etc 

У меня почти все работают для добавления второго столбцов на первое исключение. Я беру ResultFile как r +, и я хочу прочитать строку, которая есть (первые данные файла), а затем прочитать соответствующую строку из других файлов, добавить ее и вернуть обратно.

Вот код у меня есть для второй секции:

#Open each subsequent file for 2nd column data 
while n < i: 
    with open(FileNames[n], "r") as InputFile 
     with ResultFile: 
      Temp2 = ResultFile.readline() 
      for line in InputFile: 
       Temp2 += line.split(",", 1)[-1] 
       if line == LastValue: 
        break 
      if len(ResultFile,readline()) == "": 
       break 
     YData += (Temp2 + "\n") 
    n += 1 
InputFile.close 

МСФ перерыв не работают совсем верно атм я просто нужен способ, чтобы положить конец бесконечному циклу. Также LastValue равен последнему значению столбца x из первого файла.

Любая помощь будет оценена

EDIT
Я пытаюсь сделать это без itertools.

+0

Это не выглядит, как вы открываете ваши файлы должным образом. Сначала прочтите это. – pzp

ответ

0

Это может помочь сначала открыть все файлы и сохранить их в списке.

fileHandles = [] 
for f in fileNames: 
    fileHandles.append(open(f)) 

Тогда вы можете просто прочитать read() их для каждой строки в первом файле.

dataLine = fileHandles[0].readline() 
while dataLine: 
    outFields = dataLine.split(",")[0:2] 
    for inFile in fileHandles[1:]: 
      dataLine = inFile.readline() 
      field = dataLine.split(",")[1] 
      outFields.append(field) 
    print ",".join(outFields) 
    dataLine = fileHandles[0].readline() 
+0

Я открыл ResultFile в начале кода, вся вещь находится под (открытым) ResultFile как r + –

+0

Не уверен, что это имеет значение. –

+0

Я вижу, где вы их открываете. Вы делаете все строки файла1, все строки файла 2, ...Я предлагаю прокручивать их в другом порядке: первая строка каждого файла, вторая строка каждого файла, ... – ate50eggs

0

Фундаментально вы хотите перебрать все входные файлы одновременно, как zip делает с итераторы.

Этот пример иллюстрирует рисунок без отвлечения файлов и томов CSV:

file_row_col = [[['1A1', '1A2'], # File 1, Row A, Column 1 and 2 
       ['1B1', '1B2']], # File 1, Row B, Column 1 and 2 
       [['2A1', '2A2'], # File 2 
       ['2B1', '2B2']], 
       [['3A1', '3A2'], # File 3 
       ['3B1', '3B2']]] 

outrows = [] 

for rows in zip(*file_row_col): 
    outrow = [rows[0][0]] # Column 1 of the first file 
    for row in rows: 
     outrow.extend(row[1:]) # Only Column 2 and on 
    outrows.append(outrow) 

# outrows is now [['1A1', '1A2', '2A2', '3A2'], 
#     ['1B1', '1B2', '2B2', '3B2']] 

Ключом к этому является преобразование сделано zip(*file_row_col).

Теперь давайте переопределим этот шаблон фактическими файлами. Я собираюсь использовать библиотеку csv, чтобы читать и писать csvs проще и безопаснее.

import csv 

infilenames = ['1.csv','2.csv','3.csv'] 
outfilename = 'result.csv' 

with open(outfilename, 'wb') as out: 
    outcsv = csv.writer(out) 
    infiles = [] 
    # We can't use `with` with a list of resources, so we use 
    # try...finally the old-fashioned way instead. 
    try: 
     incsvs = [] 
     for infilename in infilenames: 
      infile = open(infilename, 'rb') 
      infiles.append(infile) 
      incsvs.append(csv.reader(infile)) 
     for inrows in zip(*incsvs): 
      outrow = [inrows[0][0]] # Column 1 of file 1 
      for inrow in inrows: 
       outrow.extend(inrow[1:]) 
      outcsv.writerow(outrow) 
    finally: 
     for infile in infiles: 
      infile.close() 

Учитывая эти входные файлы:

#1.csv 
1A1,1A2 
1B1,1B2 

#2.csv 
2A1,2A2 
2B1,2B2 

#3.csv 
3A1,3A2 
3B1,3B2 

код производит это result.csv:

1A1,1A2,2A2,3A2 
1B1,1B2,2B2,3B2 
Смежные вопросы